解决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 相关文章推荐
关于二级域名下使用一级域名下的COOKIE的问题
Nov 07 Javascript
JavaScript中数组对象的那些自带方法介绍
Mar 12 Javascript
js控制网页前进和后退的方法
Jun 08 Javascript
Bootstrap响应式侧边栏改进版
Sep 17 Javascript
详解Node.js 命令行程序开发教程
Jun 07 Javascript
基于打包工具Webpack进行项目开发实例
May 29 Javascript
AngularJs返回前一页面时刷新一次前面页面的方法
Oct 09 Javascript
微信小程序中遇到的iOS兼容性问题小结
Nov 14 Javascript
jQuery的ztree仿windows文件新建和拖拽功能的实现代码
Dec 05 jQuery
如何对react hooks进行单元测试的方法
Aug 14 Javascript
详解Angular Karma测试的持续集成实践
Nov 15 Javascript
JS面向对象之多选框实现
Jan 17 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&amp;MYSQL留言板源码
2020/07/19 PHP
PHP初学者最感迷茫的问题小结
2010/03/27 PHP
php中time()和mktime()方法的区别
2013/09/28 PHP
PHP 验证码不显示只有一个小红叉的解决方法
2013/09/30 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
PHP中遍历数组的三种常用方法实例分析
2019/06/24 PHP
jQuery 表格工具集
2010/04/25 Javascript
Js 时间间隔计算的函数(间隔天数)
2011/11/15 Javascript
jquery命令汇总,方便使用jquery的朋友
2012/06/26 Javascript
基于jquery中children()与find()的区别介绍
2013/04/26 Javascript
web前端开发JQuery常用实例代码片段(50个)
2015/08/28 Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
2016/04/21 Javascript
vue.js学习笔记之绑定style样式和class列表
2016/10/31 Javascript
RGB和YUV 多媒体编程基础详细介绍
2016/11/04 Javascript
关于jQuery EasyUI 中刷新Tab选项卡后一个页面变形的解决方法
2017/03/02 Javascript
HTML的select控件美化
2017/03/27 Javascript
webpack配置sass模块的加载的方法
2017/07/30 Javascript
cropper js基于vue的图片裁剪上传功能的实现代码
2018/03/01 Javascript
layui实现点击按钮给table添加一行
2018/08/10 Javascript
深入理解Angularjs 脏值检测
2018/10/12 Javascript
微信小程序拍照和摄像功能实现方法示例
2019/02/01 Javascript
vue-resourc发起异步请求的方法
2020/02/11 Javascript
vue+springboot图片上传和显示的示例代码
2020/02/14 Javascript
[01:11:35]Liquid vs LGD 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python顺序的读取文件夹下名称有序的文件方法
2018/07/11 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
2020/08/04 Python
Python列表元素删除和remove()方法详解
2021/01/04 Python
全球最大的游戏市场:G2A
2018/07/05 全球购物
丽笙酒店官方网站:Radisson Hotels
2019/05/07 全球购物
英国领先的露营和露营车品牌之一:OLPRO
2019/08/06 全球购物
sleep()方法和wait()方法的区别是什么
2012/11/17 面试题
医院护士专业个人的求职信
2013/12/09 职场文书
销售辞职报告范文
2014/01/12 职场文书
白莲教口号
2014/06/18 职场文书
简历自我评价范文
2019/04/24 职场文书
CSS3 天气图标动画效果
2021/04/06 HTML / CSS