React+AntDesign:在Form表单内使用控件的value或defaultValue属性出现invalid Warning非法警告

13 篇文章 0 订阅

问题简述

在用到AntDesign的Form表单时往往有时候会用到一些选择器,通常有时候选择器本身会有一个默认值,我们往往习惯用value或defaultValue去注入默认值,但是实际上,在Form表单内写这些选择器组件的时候往往就会出现非法警告。

出现原因

选择器基本上都是写在表单字段组件内,用于数据双向绑定、校验、布局等,因为控件是被Form.Item 包装的,且被设置了 name 属性的 ,表单控件会自动添加 value,数据同步将被 Form 接管,这会导致不能用value 或 defaultValue 等属性来设置表单域的值,否则会出现组件绑定的值在动态更新的时候出现问题。

可查看相关API文档进行深入了解

解决办法

默认值可以用 Form 里的 initialValues 来设置,而当 initialValues 需要动态更新时,就需要用Form表单的 setFieldsValue 来更新,它不能被 setState 动态更新。

1.form表单的默认getFieldDecorator()方法,在里面校验,在里面注射默认值。

<FormItem label="应用权限">
 {
	getFieldDecorator('appIdList', {
		rules:[{
			validator: (rule, value, callback) => {
				if(value && value.length){
					callback()
				}else{
					callback('应用权限请至少勾选一个')
				}
			}
		}],
	initialValue: this.state.appIdList
	})(<Checkbox.Group  options={options} onChange={this.onChange} />)
}
 </FormItem>

2.在form上直接找得到对应字段注入initialValues

<Form
      name="form"
      {...formItemLayout}
      initialValues={{
        ['checkbox-group']: defaultValue,   //注:在此行将form的对应字段注入对应值
      }}
    >
    <Form.Item name="checkbox-group" label="Checkbox.Group">
    	<Checkbox.Group  options={options} onChange={this.onChange} />
    </Form.Item>
</Form>

3、在编辑时通过setFieldsValue ()方法直接向表单的指定那行指定注入

if(isEdit){
	form.setFieldsValue({
	checkbox-group: defaultValue;  //form的name属性字段'checkbox-group'注入对应默认值
	})
}

注意:

仔细看API,你会发现针对组件设置默认值,可以有在Form设置initialValues进行字段数据处理更新,也可以在Form的Item里面通过使用initialValue 进行默认数据处理。但是通常情况下我一般会推荐优先使用 Form 的 initialValues来处理,理由如下:

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,针对您的问题,我可以给出以下的解答: 首先,在使用Ant Design的Tree组件时,我们可以通过`filterTreeNode`属性对树节点进行筛选,该属性接收一个函数作为参数,该函数的返回值为布尔类型,用于决定该节点是否被筛选出来。 接下来,我们可以使用React的函数组件来创建可搜索的树形控件。在函数组件中,我们可以通过useState钩子函数来维护搜索框的值,以及使用useMemo钩子函数来缓存筛选后的树节点数据。在筛选函数中,我们可以使用字符串的includes方法来进行模糊匹配,如果搜索框的值含有节点的名称,则该节点被筛选出来。 最后,我们可以使用TypeScript来为组件添加类型检查,从而提高代码的可维护性和可读性。 下面是一份示例代码,仅供参考: ```typescript import React, { useState, useMemo } from 'react'; import { Tree } from 'antd'; interface TreeNode { title: string; key: string; children?: TreeNode[]; } const data: TreeNode[] = [ { title: 'Parent 1', key: '0-0', children: [ { title: 'Child 1', key: '0-0-0', }, { title: 'Child 2', key: '0-0-1', }, ], }, { title: 'Parent 2', key: '0-1', children: [ { title: 'Child 3', key: '0-1-0', }, { title: 'Child 4', key: '0-1-1', }, ], }, ]; const SearchableTree: React.FC = () => { const [searchValue, setSearchValue] = useState<string>(''); const filteredData = useMemo(() => filterTreeData(data, searchValue), [searchValue]); const handleSearch = (e: React.ChangeEvent<HTMLInputElement>): void => { setSearchValue(e.target.value); }; return ( <div> <input type="text" value={searchValue} onChange={handleSearch} /> <Tree filterTreeNode={filterTreeNode}> {renderTreeNodes(filteredData)} </Tree> </div> ); }; const filterTreeData = (treeData: TreeNode[], searchValue: string): TreeNode[] => { if (!searchValue) { return treeData; } return treeData.reduce<TreeNode[]>((acc, node) => { const children = node.children && filterTreeData(node.children, searchValue); if (node.title.toLowerCase().includes(searchValue.toLowerCase()) || children?.length) { acc.push({ ...node, children, }); } return acc; }, []); }; const filterTreeNode = (node: TreeNode): boolean => { return !!node.children || node.title.toLowerCase().includes(searchValue.toLowerCase()); }; const renderTreeNodes = (treeData: TreeNode[]): React.ReactNode => { return treeData.map((node) => { if (node.children) { return ( <Tree.TreeNode key={node.key} title={node.title}> {renderTreeNodes(node.children)} </Tree.TreeNode> ); } return <Tree.TreeNode key={node.key} title={node.title} />; }); }; export default SearchableTree; ``` 希望能够对您有所帮助,如有疑问请随时追问。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值