当前位置:   article > 正文

Ant Design的TreeSelect支持多选和搜索功能,如果查询不到,则搜索框不能清除的问题处理。_antd select showsearch 失去焦点 会清除

antd select showsearch 失去焦点 会清除

树型选择控件多选支持搜索的时候,输入文字,匹配不到数据的时候,失去焦点或者提交表单的时候清空输入的查询文字.

之前帖子方法有一点问题,就是在搜索树的时候,如果搜索到,在点击数据会存在数据有时候加载不进去的情况。修改原始代码。

问题如下截图:

想要的结果如下:

解决方案:

在AntD的Select中,当失去焦点切未查询到数据时,会自动清空搜索框的值。地址:Antd Select

在实现这个过程中,也踩了不少坑。仔细读过TreeSelect的API之后发现了一个属性,叫做searchValue。searchValue就是搜索框展示的值。再配合onSearch事件和onBlur事件。解决了这个问题。

具体思路:在搜索的时候触发onSearch事件,将搜索值赋给searchValue,更新state,当失去焦点时,将searchValue更新为‘’,更新state。

第一版代码如下:

  1. class Manager extends Component {
  2. constructor(props) {
  3. super(props);
  4. this.state = {
  5. viewSearchValue:''
  6. };
  7. }
  8. qureHandleSearch = (value) => {
  9. this.setState({
  10. viewSearchValue:value
  11. })
  12. }
  13. clearSearchValue = () =>{
  14. this.setState({
  15. viewSearchValue:''
  16. })
  17. }
  18. render() {
  19. const { viewSearchValue } = this.state;
  20. return (
  21. <TreeSelect
  22. allowClear
  23. multiple
  24. style={{ width: "100%" }}
  25. dropdownStyle={{ maxHeight: 400, overflow: "auto" }}
  26. treeData={roleTree} //roleTree为树的数据就不贴代码了
  27. treeNodeFilterProp="title"
  28. onSearch={this.qureHandleSearch}
  29. searchValue={viewSearchValue}
  30. onBlur={this.clearSearchValue}
  31. />
  32. )
  33. }
  34. }

 大致一看没有问题,但是如果搜索框的值在这个树中存在,那么点击这个数据的时候,这条数据不会价值的TreeSelect上,就是不会选中,相当于重新刷新了一次页面。大家可以尝试看下。

对于这个问题,其实查了一下原因,是由于onBlur的问题,antd的onBlur事件触发的频率还是太高了。点击搜索框都会触发blur。所以继续优化代码。

利用onChange,FormItem,onSearch和onBlur来完成。

完整代码如下:

 

  1. class Manager extends Component {
  2. constructor(props) {
  3. super(props);
  4. this.state = {
  5. viewSearchValue:''
  6. };
  7. }
  8. qureHandleSearch = (value) => {
  9. this.setState({
  10. viewSearchValue:value
  11. })
  12. }
  13. clearSearchValue = () =>{
  14. setTimeout(() => {
  15. this.setState({
  16. viewSearchValue:''
  17. })
  18. }, 100);
  19. }
  20. selectChange = (value ) =>{
  21. const {form :{setFieldsValue} } = this.props;
  22. setFieldsValue({
  23. selectId:value
  24. })
  25. }
  26. render() {
  27. const { viewSearchValue } = this.state;
  28. return (
  29. <FormItem labelCol={{ span: 2 }} wrapperCol={{ span: 20 }} label=
  30. {formatMessage({ id: "doc.directory.edit.role" })}>
  31. {getFieldDecorator("selectId", {
  32. initialValue: [],
  33. })(
  34. <TreeSelect
  35. allowClear
  36. multiple
  37. style={{ width: "100%" }}
  38. dropdownStyle={{ maxHeight: 400, overflow: "auto" }}
  39. treeData={roleTree}//roleTree为树的数据,就不贴代码了
  40. treeNodeFilterProp="title"
  41. onSearch={this.qureHandleSearch}
  42. searchValue={viewSearchValue}
  43. onBlur={this.clearSearchValue}
  44. onChange={this.selectChange}
  45. />
  46. )}
  47. </FormItem>
  48. )
  49. }
  50. }

完美解决!有问题可以留言。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/151643
推荐阅读
相关标签
  

闽ICP备14008679号