解决ant Design中Select设置initialValue时的大坑


Posted in Javascript onOctober 29, 2020

我出现的问题:例如在编辑活动关联红包的时候,需求是select显示的是红包名称,但是表单提交的时候是红包ID:设置默认值的initialValue为Id的时候,会出现显示是id (需要的是显示名称);如果设置默认值initialValue是名称,那么下一步操作会出现报错

但是我还有一种情况:某个活动关联的红包被删除了,在Select中的可供选项中redPackets没有这个红包的时候,显示的会是红包id,而不是红包名称

错误效果图:

解决ant Design中Select设置initialValue时的大坑

期待正确效果图

解决ant Design中Select设置initialValue时的大坑

解决方案:在默认值的后面加上一个空字符串进行转换;

<FormItem {...formItemLayout} label="活动红包">
       {getFieldDecorator("redPacketId", {
        rules: [{ required: true, message: "红包必填" }],
        initialValue: redPacketId + ""
       })(
        <Select>
         {redPackets.map(rp => (
          <Option key={rp.redPacketCommonId}>{rp.packetName}</Option>
         ))}
        </Select>
       )}
      </FormItem>

补充知识:ant 组件initialValue 初始值更新问题,setState和setFieldValue浅谈

组件被赋初始值了之后,有两种情况需要更新组件的value,一种情况是子组件触发的父组件的value的更新,另一种是父组件自己触发的value更新。

实现场景

在门票订购页面引入了一个游客信息子组件,如下图所示,可以通过子组件新增游客或删除游客来改变订购数量,也可以通过在订购页面批量导入游客来改变订购数量。

解决ant Design中Select设置initialValue时的大坑

<FormItem {...formItemLayout} label="数量">
  {
   getFieldDecorator('number', {
     rules: [{
      required: true, message: '数量',
     }],
     initialValue: this.state.peopleNum
    })(<InputNumber disabled={true} style={{ width: 120, height: 33 }} onChange={this.peopleNumChange} />)
   }
</FormItem>

起初若是子组件触发的更改就调用父组件的回调函数,函数中使用this.setState({peopleNum})的方法来更新,若是父组件自己触发的更改就直接调用this.setState({peopleNum})来更新InputNumber的值,后来发现state的值更新了,但是并没有改变InputValue的值,因此就通过 setFieldsValue来解决该问题,发现setFieldsValue直接设置值 比this.setState设置initialvalue的等级更高一点。

peopleNumChange = (value) => {
  const { setFieldsValue } = this.props.form;
  this.setState({
   peopleNum: value,
  });
  this.props.form.setFieldsValue({
   number: value, 
  })
 }

ant 自己封装的table组件initialValue 初始值更新问题

实现场景

在门票订购页面引入了一个游客信息子组件,如下图所示,可以通过子组件新增游客或删除游客来直接改变子组件中游客信息,也可以通过批量导入游客信息的方式间接改变子组件中游客信息。最后父组件获取到全部游客信息在提交给后台。

解决ant Design中Select设置initialValue时的大坑

<div style={{ marginTop: 20 }}>
{getFieldDecorator('info', {
initialValue: this.state.info,
}
)(<OrderPeople handlepeople={this.peopleNumChange.bind(this)} handlecantact={this.cantactNumChange.bind(this)} />)}
</div>

OrderPeople为封装的子组件,组件内部有两个函数,保存函数和删除函数,这两个函数对表格数据进行更改之后要更新父组件中的游客信息,此时父组件会向子组件自动传递一个onChange函数,使用onChange函数来更新父组件的Value值,这里内部实现是用的setFieldValue改变组件的值

remove(key) {
 const newData = this.state.data.filter(item => item.key !== key);
 this.setState({ data: newData });
 this.props.onChange(newData);
}

在组件外部进行批量导入的时候,对info数据进行修改,起初数据改变之后,在父组件中尝试setState发现无效,后改成setFieldsValue才生效,组件的值通过setFieldValue置了某个值之后,就不能通过setState改变initialValue来改变其值了。

for (var i = 0; i < data.length; i++) {
  data[i].key = `NEW_Excel_ID_${i}`;
 }
 this.setState({
   info: data,
 });
setFieldsValue({
  info: this.state.info,
 });

注意:initialValue设置的值本应该属于Select可供选的数据中某一个,select框显示的内容就是我们所希望的红包名称,提交form表单的时候,值就是Id;如果设置的值在Select可供选数据中找不到(例如:这里的select可供选数据是redPackets),那么显示的就是Id而不是名称。

所以我们在设置initialValue的时候,应该填写的是下拉列表中包含option的value的值。

以上这篇解决ant Design中Select设置initialValue时的大坑就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
如何使用jquery控制CSS样式,并且取消Css样式(如背景色,有实例)
Jul 09 Javascript
js中的数组Array定义与sort方法使用示例
Aug 29 Javascript
深入理解jQuery中live与bind方法的区别
Dec 18 Javascript
jQuery插件Easyui设置datagrid的pageNumber导致两次请求问题的解决方法
Aug 06 Javascript
JavaScript实现旋转轮播图
Aug 18 Javascript
Node实战之不同环境下配置文件使用教程
Jan 02 Javascript
vue组件jsx语法的具体使用
May 21 Javascript
webpack@v4升级踩坑(小结)
Oct 08 Javascript
详解vue 路由跳转四种方式 (带参数)
Apr 28 Javascript
3分钟了解vue数据劫持的原理实现
May 01 Javascript
原生js实现的移动端可拖动进度条插件功能详解
Aug 15 Javascript
Js代码中的span拼接问题解决
Nov 22 Javascript
解决Ant Design Modal内嵌Form表单initialValue值不动态更新问题
Oct 29 #Javascript
微信小程序自定义yPicker组件实现省市区三级联动功能
Oct 29 #Javascript
解决ant Design Search无法输入内容的问题
Oct 29 #Javascript
js实现随机圆与矩形功能
Oct 29 #Javascript
在vue中使用jsonp进行跨域请求接口操作
Oct 29 #Javascript
基于react项目打包css引用路径错误解决方案
Oct 28 #Javascript
design vue 表格开启列排序的操作
Oct 28 #Javascript
You might like
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
2013/11/14 PHP
zf框架的数据库追踪器使用示例
2014/03/13 PHP
js 强制弹出窗口代码研究-又一款代码
2010/03/20 Javascript
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
php跨域调用json的例子
2013/11/13 Javascript
jQuery中:only-child选择器用法实例
2015/01/03 Javascript
JavaScript实现函数返回多个值的方法
2015/06/09 Javascript
js中javascript:void(0) 真正含义
2020/11/05 Javascript
Vue.js常用指令汇总(v-if、v-for等)
2016/11/03 Javascript
BootStrap table使用方法分析
2016/11/08 Javascript
Require.JS中的几种define定义方式示例
2017/06/01 Javascript
JS对象序列化成json数据和json数据转化为JS对象的代码
2017/08/23 Javascript
Vue.js的复用组件开发流程完整记录
2018/11/29 Javascript
JavaScript实现预览本地上传图片功能完整示例
2019/03/08 Javascript
JavaScript适配器模式原理与用法实例详解
2020/03/09 Javascript
js实现九宫格布局效果
2020/05/28 Javascript
[03:09]2014DOTA2国际邀请赛 赛场上的美丽风景线 中国Coser也爱DOTA2
2014/07/20 DOTA
Python处理json字符串转化为字典的简单实现
2016/07/07 Python
Python入门_条件控制(详解)
2017/05/16 Python
numpy中索引和切片详解
2017/12/15 Python
python3.4.3下逐行读入txt文本并去重的方法
2018/04/29 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
2018/06/22 Python
python cv2在验证码识别中应用实例解析
2019/12/25 Python
Python内置数据类型list各方法的性能测试过程解析
2020/01/07 Python
python标准库OS模块函数列表与实例全解
2020/03/10 Python
什么是python的id函数
2020/06/11 Python
Python selenium环境搭建实现过程解析
2020/09/08 Python
HTML5 3D衣服摇摆动画特效
2016/03/17 HTML / CSS
政治表现评语
2014/05/04 职场文书
会计学毕业生求职信
2014/06/25 职场文书
2014年精神文明建设工作总结
2014/11/19 职场文书
2014个人年度工作总结
2014/12/15 职场文书
检讨书范文500字
2015/01/28 职场文书
银行保安拾金不昧表扬稿
2015/05/05 职场文书
正确使用MySQL update语句
2021/05/26 MySQL
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
2022/07/15 Servers