antd中AutoComplete组件的一些问题

最近做自己的一个项目的时候,用到一个自动填充的输入框,因为前端使用的antd,自然就引入了antd中的AutoComplete的组件。

官网链接:链接

AutoComplete的填充数据有两种用法,一种是dataSouce,另外一种是option,运用option更灵活,可以渲染出自己想要的选择填充数据的样式。

由于选择的填充数据是扒的别人的接口,这个接口返回的我想要的数据是带html标签的字符串,react里面把html字符串转义成dom的是

给div带上dangerouslySetInnerHTML={{__html: v}}的参数。设置成这样后,在AutoComplete选择数据后填充的却是[object Object],因为antd的这个组件选择要填充的数据后默认为Option的子元素,显然现在加上一个转义html的div后,Option的子元素不再是text文本而是一个dom对象了。

这时候AutoComplete提供了optionLabelProp这个参数,这个参数的功能为回填到选择框的 Option 的属性值,默认是 Option 的子元素。没看懂官方后面说的这个“比如在子元素需要高亮效果时,此值可以设为 value。”。但经过我测试,这个参数的string类型的值对应到为Option组件的参数值。意思就是,比如我给这个Option挂了一个text参数,那么在AutoComplete的optionLabelProp参数设置为"text"时,回填到选择框的值即为text参数的值。

const children = result.map((v,k) => <Option key={k} text={this.tools(v)}><div dangerouslySetInnerHTML={{__html: v}}></div></Option>);

so,如上面,自己再写一个正则表达式即可把带html的标签字符串过滤掉,回填到选择框,还能在选择框的选择填充数据上用dangerouslySetInnerHTML渲染出样式。

之后又出现了一个问题,我想监听onSelect选择的值,这个onSelect的默认值官方解释为:

我给Option设置了value参数后出现了报了react same key的警告,那key参数是干嘛的?key参数确实没重复的,(value参数设置的数据里面确实有重复的)有点疑问,这个问题提了issue,之后看看源码应该就能明白。
当然之后我就去除了这个value参数,把数组数据提前保存在state中,onselect的默认参数结果就是Option的key值,后面就用这个key获取到我想要的数据了。

(注意dangerouslySetInnerHTML的数据源应为净化后的数据,命名原本就是提醒XSS攻击的,在tools函数中也应该加上转义危险符号的功能)
这几天尽快想把这个项目上线,在入职之前搞定。下次这篇博客更新就是剖析antd源码中这个AutoComplete的设计。
------一天后----
so,给仓库提了issue之后偏右大大给了之前讨论过这个问题issue的链接,AutoComplete的option貌似和其他组件的option是一样的。
链接
主要原因可能就是“目前没有优雅的办法去传递 Option 的 key 给 MenuItem”,加上防止“不可预计的错误”,只能特殊问题特殊处理了。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用Hooks实现清空AntdAutoComplete组件的值可以通过useRef和useState两个Hooks来实现。 1. 使用useRef创建ref对象: ``` const autoCompleteRef = useRef(null); ``` 2. 将ref对象绑定到AutoComplete组件上: ``` <AutoComplete ref={autoCompleteRef} ... /> ``` 3. 在需要清空组件值的地方,获取组件实例并调用其方法 ``` const handleClear = () => { const autoComplete = autoCompleteRef.current; if (autoComplete) { autoComplete.setState({ value: '' }); } }; ``` 在上述代码,我们首先使用useRef创建了一个ref对象,并将其绑定到AutoComplete组件上,然后在需要清空组件值的地方,通过autoCompleteRef.current获取AutoComplete组件的实例,最后调用setState方法来清空组件的值。 另外,如果你想要在函数组件使用AntdAutoComplete组件,可以使用useState来保存AutoComplete组件的实例,然后通过setState方法来清空组件的值。具体操作步骤如下: 1. 使用useState创建状态: ``` const [autoComplete, setAutoComplete] = useState(null); ``` 2. 将setAutoComplete方法绑定到AutoComplete组件上: ``` <AutoComplete ref={setAutoComplete} ... /> ``` 3. 在需要清空组件值的地方,通过autoComplete获取AutoComplete组件的实例,并调用setState方法来清空组件的值: ``` const handleClear = () => { if (autoComplete) { autoComplete.setState({ value: '' }); } }; ``` 在上述代码,我们通过useState创建了一个状态,并将setAutoComplete方法绑定到AutoComplete组件上,然后在需要清空组件值的地方,通过autoComplete获取AutoComplete组件的实例,最后调用setState方法来清空组件的值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值