【问题标题】:React-select how to filter out already chosen values?React-select 如何过滤掉已经选择的值?
【发布时间】:2020-09-03 09:39:54
【问题描述】:

我有一个这样定义的选择组件:

this.state.list = [{label: "test1", value:1}, {label:"test2", value:2}, {label:"test3", value:3}]
this.state.selected = [{label:"test2", value:2}]

let listMap = this.state.list
let list = this.state.list

{listMap.length !== 0 ? listMap.map((item: any, key: number) => (
 <div>    
  <Select
     id="list for data"
     options={list}
     onChange={value => selectList(value)}
     placeholder="Select Your Option"
    />
 <div/>
))

我希望在选择test2 之后,我希望其他两个下拉菜单显示test1test3

到目前为止我做了什么:

let y = this.state.selected.map(itemY => { return itemY.value })
let x = list.filter(itemX => !yFilter.includes(itemX.value)) // [{value: 1, label:"test1"},{value: 3, label: "test3"}]

然后将options 属性替换为x

过滤器正在工作,但是,

占位符未更新选定的值。

我想要达到的目标

对于下一个下拉列表[1],只能选择那些未选择的:

【问题讨论】:

  • 这显然是错误的。你不应该使用这样的状态
  • 您能建议一种正确的方法吗? this.state.list 将在进行 api 调用后来自 redux 存储,所以我这样做是为了快速说明我面临的问题。

标签: javascript reactjs


【解决方案1】:

你的状态应该是这样的

state = { items : [{value: 1, label:"test1", selected:false},{value: 1, label:"test2", selected:false},{value: 3, label: "test3", selected:false}]

然后,当单击一个选项时,它会将“选定”键设置为 true。之后,仅将选择 false 的对象映射为下拉项。记得使用 setState。

【讨论】:

    【解决方案2】:

    您必须将三个反应选择分开。当您在一个上应用过滤器时,它将适用于所有反应选择。过滤也将在所有反应选择中删除。您可以查看以下示例。 https://codesandbox.io/s/react-select-5u3rh

    import React from "react";
    import {
      render
    } from "react-dom";
    import ReactDOM from "react-dom";
    import Select from "react-select";
    import "react-select/dist/react-select.css";
    
    class ReactSelect extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          itemtitle: "",
          multi: true,
          multiValue: "eeee...",
          options: [{
              value: "Color",
              label: "Yellow"
            },
            {
              value: "Fruit",
              label: "Apple"
            },
            {
              value: "Tool",
              label: "Spanner"
            }
          ],
          options2: [{
              value: "Color",
              label: "Yellow"
            },
            {
              value: "Fruit",
              label: "Apple"
            },
            {
              value: "Tool",
              label: "Spanner"
            }
          ]
        };
      }
      onTitleChange(e, value) {
        this.setState({
          [e.target.name]: e.target.value
        });
        this.setState({
          multiValue: e.target.value
        });
      }
      handleOnChange(obj) {
        this.setState({
          multiValue: obj
        });
        this.setState({
          options2: this.state.options2.filter(v => v.value !== obj.value)
        })
      }
      handleOnChange2(obj) {
        this.setState({
          multiValue2: obj
        });
      }
      render() {
        return ( <
          div >
          <
          Select
          // multi={this.state.multi}
          options = {
            this.state.options
          }
          onChange = {
            this.handleOnChange.bind(this)
          }
          value = {
            this.state.multiValue
          }
          isSearchable = {
            false
          }
          placeholder = "eee" /
          >
          <
          Select
          // multi={this.state.multi}
          options = {
            this.state.options2
          }
          onChange = {
            this.handleOnChange2.bind(this)
          }
          value = {
            this.state.multiValue2
          }
          isSearchable = {
            false
          }
          placeholder = "eee" /
          >
          <
          /div>
        );
      }
    }
    
    ReactDOM.render( < ReactSelect / > , document.body);

    【讨论】:

    • 我可以根据要映射的数组的长度动态创建 options2 吗?
    • 是的,如果您需要相同长度的副本,您可以将 options1 数组克隆到 options2
    • 我的意思是,通过动态生成状态,因为我的“选项”将来自可以返回任何长度的 api?
    • 只要您使用 setState 作为选项,它就可以工作。 this.setState({ options2: apiData })
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多