先说一下写着篇文章的契机,是因为回显,复杂表单的回显,让我觉得我对initialValue这个属性是有误解的。

一、initialValue的出处和定义

initialValue的出处:

AntDesign/Form表单件/getFieldDecorator(id,options)装饰器函数/第二个参数options/options.initialValue。

链接地址:https://ant.design/components/form-cn/#getFieldDecorator(id,-options)-%E5%8F%82%E6%95%B0

关于属性initialValue,官方的解释如下:

关键字是“子节点的初始值”,初始值也就是默认值,比如Form中有一个城市的选择器,默认选择“杭州”,那么initialValue就是杭州对应的value。

所以其实我一直以为initialValue是defaultValue一样的存在。

二、initialValue和defaultValue的区别

1. defaultValue的例子

import React, { Component,Fragment } from 'react';
import { Button,Input } from "antd";
export default class CreateFrom extends Component {
state={value:"value"}
updateValue = () => {
this.setState({value:"newValue"})
}
render() {
return (
<Fragment>
<Button onClick={this.updateValue}>更新value</Button>
<Input defaultValue={this.state.value} />
</Fragment>
);
}
}

说明:当该组件被渲染时,Input中的值为”value“,当我点击“更新value按钮”时,Input中的值不更新。

Input组件没有设置value属性的话,就是一个非受控组件,它需要设置defaultValue,如果用户不手动改变Input的输入,那么Input就一直显示defaultValue指向的值(友情提示:值为Input组件第一次被渲染时的真实值,变量或者常量指向的真实值)。这里涉及到了受控组件和非受控组件的知识,不做延伸。

2. intialValue的例子

1)models/list.js

let count = 1;
const CITY = ["杭州","北京","上海","广州","深圳"];
export default {
namespace: 'list', state: {
citys: CITY,
detail:{city:CITY[count%5],count}
}, effects: {
*fetchDetail({ payload }, { call, put }) {
// 不发请求,而是直接更新reducer
// const response = yield call(service, payload);
count++;
yield put({
type: 'queryDetail',
payload: {city:CITY[count%5],count},
});
},
}, reducers: {
queryDetail(state, action) {
return {
...state,
detail: action.payload,
};
}
},
};

2)router组件文件

import React, { Component } from 'react';
import { connect } from "dva";
import { InputNumber,Select,Form,Button } from "antd"; const FormItem = Form.Item;
const { Option } = Select;
const formItemLayout = {
labelCol: {
xs: { span: 24 },
sm: { span: 2 },
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 22 },
},
};
@connect(({list})=>({
citys:list.citys,
detail:list.detail
}))
class CreateFrom extends Component {
getDetail = () => {
this.props.dispatch({type:"list/fetchDetail"});
}
render() {
const { form,detail={},citys=[] } = this.props;
const { getFieldDecorator } = form;
const { city,count } = detail;
return (
<Form>
<Button onClick={this.getDetail}>重新获取数据</Button>
<FormItem
{...formItemLayout}
label="城市"
>
{getFieldDecorator('city', {
initialValue: city,
rules: [{ required: true, message: '请选择城市' }],
})(
<Select style={{width:160}} placeholder="请选择城市">
{
citys.map(item=><Option key={item} value={item}>{item}</Option>)
}
</Select>
)}
</FormItem>
<FormItem
{...formItemLayout}
label="总量"
>
{getFieldDecorator('count', {
initialValue:count,
rules: [{ required: true, message: '总量(1-99999999)',pattern:/^[1-9][0-9]{0,7}$/ }],
})(
<InputNumber style={{width:160}}/>
)}
</FormItem>
</Form>
);
}
} export default Form.create()(CreateFrom);

说明:当该Form组件被渲染时,接收props.detail,因为在models/list.js文件的state中已经初始化,所以,第一次render被渲染的值是“杭州”和“1”,点击“重新获取数据按钮”,这个时候props.detail改变为{city:"北京",count:2},与此同时Form被渲染的值也随之改变。

uhmmm,怎么和defaultValue的表现方式不一样?不是说好是默认值的嘛?不是说好不会跟着数据的改变而改变的嘛?逗我玩还是~

敲黑板,划重点,initialValue值可以被更新,除了下面两种情况:

  • 1. 用户手动更新表单数据,比如在<Input />组件中手动输入,在<Select />组件中手动选择等等,在用户手动更新数据之后,initialValue的值改变不会更新表单值。
  • 2. 当执行了setFieldsValue方法之后,initialValue的值改变不会更新表单值。

下面的例子中在生命周期函数componentDidMount中执行了setFieldsValue方法,其他不变,你会发现不管怎么点击“重新获取数据按钮”,城市对应的值都不会被更新,而总量对应的值却一直在更新。如果你手动改变总量的输入,再点击“重新获取数据按钮”,此时城市和总量的值都不会被更新。

import React, { Component } from 'react';
import { connect } from "dva";
import { InputNumber,Select,Form,Button } from "antd"; const FormItem = Form.Item;
const { Option } = Select;
const formItemLayout = {
labelCol: {
xs: { span: 24 },
sm: { span: 2 },
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 22 },
},
};
@connect(({list})=>({
citys:list.citys,
detail:list.detail
}))
class CreateFrom extends Component {
componentDidMount(){
this.props.form.setFieldsValue({city:"上海"});
}
getDetail = () => {
this.props.dispatch({type:"list/fetchDetail"});
}
render() {
const { form,detail={},citys=[] } = this.props;
const { getFieldDecorator } = form;
const { city,count } = detail;
return (
<Form>
<Button onClick={this.getDetail}>重新获取数据</Button>
<FormItem
{...formItemLayout}
label="城市"
>
{getFieldDecorator('city', {
initialValue: city,
rules: [{ required: true, message: '请选择城市' }],
})(
<Select style={{width:160}} placeholder="请选择城市">
{
citys.map(item=><Option key={item} value={item}>{item}</Option>)
}
</Select>
)}
</FormItem>
<FormItem
{...formItemLayout}
label="总量"
>
{getFieldDecorator('count', {
initialValue:count,
rules: [{ required: true, message: '总量(1-99999999)',pattern:/^[1-9][0-9]{0,7}$/ }],
})(
<InputNumber style={{width:160}}/>
)}
</FormItem>
</Form>
);
}
} export default Form.create()(CreateFrom);

貌似,表单的回显出现一些转机。。。

三、碎碎念

不要一提表单回显,就使劲往代码里面怼“setFieldsValue”,这样会把代码写得很!很!很!很!很不优雅!!!

超级喜欢《锋利的jQuery》封面上的这句话“每多学一点知识,就少写一行代码”,简直是我写代码的信条。

数栈是云原生—站式数据中台PaaS,我们在github和gitee上有一个有趣的开源项目:FlinkXFlinkX是一个基于Flink的批流统一的数据同步工具,既可以采集静态的数据,也可以采集实时变化的数据,是全域、异构、批流一体的数据同步引擎。大家喜欢的话请给我们点个star!star!star!

github开源项目:https://github.com/DTStack/flinkx

gitee开源项目:https://gitee.com/dtstack_dev_0/flinkx

数栈技术文章分享:你居然是这样的initialValue的更多相关文章

  1. 【codelife 阿里技术文章分享——读后感】

    目前看到的几篇比较有感触的文章,分别是: 前端Leader如何做好团队规划?阿里内部培训总结公开   ——>这里会有关于针对技术项目如何做规划的一些指导,非常有价值 程序员吃的是青春饭?本质上取 ...

  2. Molecule实现数栈至简前端开发新体验

    Keep It Simple, Stupid. 这是开发人耳熟能详的 KISS 原则,也像是一句有调侃意味的善意提醒,提醒每个前端人,简洁易懂的用户体验和删繁就简的搭建逻辑就是前端开发的至简大道. 这 ...

  3. 收藏的技术文章链接(ubuntu,python,android等)

    我的收藏 他山之石,可以攻玉 转载请注明出处:https://ahangchen.gitbooks.io/windy-afternoon/content/ 开发过程中收藏在Chrome书签栏里的技术文 ...

  4. 袋鼠云研发手记 | 开源·数栈-扩展FlinkSQL实现流与维表的join

    作为一家创新驱动的科技公司,袋鼠云每年研发投入达数千万,公司80%员工都是技术人员,袋鼠云产品家族包括企业级一站式数据中台PaaS数栈.交互式数据可视化大屏开发平台Easy[V]等产品也在迅速迭代.在 ...

  5. 让互联网更快:新一代QUIC协议在腾讯的技术实践分享

    本文来自腾讯资深研发工程师罗成在InfoQ的技术分享. 1.前言 如果:你的 App,在不需要任何修改的情况下就能提升 15% 以上的访问速度,特别是弱网络的时候能够提升 20% 以上的访问速度. 如 ...

  6. 袋鼠云研发手记 | 数栈·开源:Github上400+Star的硬核分布式同步工具FlinkX

    作为一家创新驱动的科技公司,袋鼠云每年研发投入达数千万,公司80%员工都是技术人员,袋鼠云产品家族包括企业级一站式数据中台PaaS数栈.交互式数据可视化大屏开发平台Easy[V]等产品也在迅速迭代.在 ...

  7. Jerry的ABAP原创技术文章合集

    我之前发过三篇和ABAP相关的文章: 1. Jerry的ABAP, Java和JavaScript乱炖 这篇文章包含我多年来在SAP成都研究院使用ABAP, Java和JavaScript工作过程中的 ...

  8. 数栈运维实例:Oracle数据库运维场景下,智能运维如何落地生根?

    从马车到汽车是为了提升运输效率,而随着时代的发展,如今我们又希望用自动驾驶把驾驶员从开车这项体力劳动中解放出来,增加运行效率,同时也可减少交通事故发生率,这也是企业对于智能运维的诉求. 从人工运维到自 ...

  9. 袋鼠云出品!数栈UI 5.0全新体验升级,设计背后的故事

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 前言 数栈作为云原⽣⼀站式⼤数据开发平台,从2016年发布第⼀个版本 ...

  10. SAP成都研究院2018年总共87篇技术文章合集

    2018年很快就要结束了.Jerry在2017年年底准备开始写这个公众号时,给自己定的目标是:2018年至少保证每周发布一篇高质量的文章.如今2018年就快过去了,高质量与否需要大家来反馈,至少从量上 ...

随机推荐

  1. Linux下对LVM逻辑卷分区大小调整 [针对xfs和ext4文件系统]

    当我们在安装系统的时候,由于没有合理分配分区空间,在后续维护过程中,发现有些分区空间不够使用,而有的分区空间却有很多剩余空间.如果这些分区在装系统的时候使用了lvm(前提是这些分区要是lvm逻辑卷分区 ...

  2. 由 MCP 官方推出的 C# SDK,使 .NET 应用程序、服务和库能够快速实现与 MCP 客户端和服务器交互!

    前言 今天大姚给大家推荐一个由 MCP 官方推出的 C# SDK,使 .NET 应用程序.服务和库能够快速实现与 MCP 客户端和服务器交互:MCP C# SDK. 项目介绍 MCP C# SDK 是 ...

  3. freertos消息队列的值传递和指针传递

    消息队列的使用方法总结: 1.消息队列初始化(定义一个消息队列的结构体),一般在main.c中完成. 2.消息队列的发送:   a extern 消息队列   b 定义一个结构体的指针指向消息消息队列 ...

  4. .net WorkFlow 流程介绍

    WikeFlow官网:www.wikesoft.com WikeFlow学习版演示地址:workflow.wikesoft.com WikeFlow学习版源代码下载:https://gitee.com ...

  5. IDEA构建Maven项目生成的文件说明(.mvn、mvnw、mvnw.cmd、.gitignore、.iml、.idea、pom.xml)

    IDEA构建的maven+springBoot项目结构如下: 1..gitignore:分布式版本控制系统git的配置文件,意思为忽略提交 在 .gitingore 文件中,遵循相应的语法,即在每一行 ...

  6. public synchronized boolean add(E e)方法源码

    public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, C ...

  7. 在MaxKB中实现准确的Chat TO SQL(BI)

    主要面向考试成绩管理系统(目前支持旭日图.仪表盘柱状图.桑基图.漏斗图.河流图.数据聚合图.散点图.南丁格尔玫瑰图.饼状图.环形图.堆叠柱状图.堆叠折线图.堆叠面积图.面积图.折线图) 主要思路: 第 ...

  8. 【FAQ】HarmonyOS SDK 闭源开放能力 —Health Service Kit

    1.问题描述: 按照官方文档调用healthStore API申请用户授权:有拉起授权弹窗,但是无回调,检查权限接口也无回调. 解决方案: 1.接口调用前,需先使用init方法进行初始化,没有回调的问 ...

  9. 工良出品 | 长文讲解 MCP 和案例实战

    作者:痴者工良 博客地址:https://www.whuanle.cn/ 示例项目地址:https://github.com/whuanle/mcpdemo 近期 MCP 协议越来越爆火,很多开发者都 ...

  10. 【MOOC】华中科技大学计算机组成原理慕课答案-第二章-数据表示

    单选 1 计算机中表示地址时使用 √A. 无符号数 B. 反码 C. 原码 D. 补码 2 浮点数的表示范围和表示精确度分别取决于 A. 阶码的编码和尾数的编码 √B. 阶码的位数和尾数的位数 C. ...