如何以编程方式清除/重置 React-Select?

IT技术 javascript reactjs react-hooks react-select
2021-04-18 12:50:21

ReactSelect V2V3似乎有几个props,如clearValue,resetValuesetValue无论我在尝试什么,我都无法以编程方式清除选择。resetValue似乎无法从外部访问。

selectRef.setValue([], 'clear')
// or
selectRef.clearValue()

这不会清除当前选择。

我在这里错过了什么还是还没有完全实施?

6个回答

如果您使用的是react-select,您可以尝试传递nullvalueprop。

例如:

import React from "react";
import { render } from "react-dom";
import Select from "react-select";

class App extends React.Component {
  constructor(props) {
    super(props);

    const options = [
      { value: "one", label: "One" },
      { value: "two", label: "Two" }
    ];

    this.state = {
      select: {
        value: options[0], // "One" as initial value for react-select
        options // all available options
      }
    };
  }

  setValue = value => {
    this.setState(prevState => ({
      select: {
        ...prevState.select,
        value
      }
    }));
  };

  handleChange = value => {
    this.setValue(value);
  };

  handleClick = () => {
    this.setValue(null); // here we reset value
  };

  render() {
    const { select } = this.state;

    return (
      <div>
        <p>
          <button type="button" onClick={this.handleClick}>
            Reset value
          </button>
        </p>
        <Select
          name="form-field-name"
          value={select.value}
          onChange={this.handleChange}
          options={select.options}
        />
      </div>
    );
  }
}

render(<App />, document.getElementById("root"));

这是一个工作示例。

请在您的答案中提供(简化的)代码示例,因为链接不是永久性的。
2021-05-24 12:50:21
没有任何效果。react-select 是地狱.. 太复杂了只是重置它。如果我们花一天时间重置一个选择控件......我们应该什么时候提交它?
2021-05-31 12:50:21
@AKJ 这部分value: options[0]意味着 react-select 会将选项"One"作为初始值。(还为此行添加了解释性注释)
2021-06-06 12:50:21
我将补充说,清除值仅适用于 null。如果您传递 undefined (就像我一样),则选定的值将保持不变。
2021-06-09 12:50:21
嘿,我是 react-select 的新手,我知道这是在做什么吗:`select: { value: options[0], options }
2021-06-21 12:50:21

我自己遇到了这个问题,并设法通过将 a 传递key给 React-Select 组件来修复它,并将选定的值附加到它。这将ReactSelect在选择更新时强制重新渲染自身。

我希望这可以帮助别人。

import ReactSelect from 'react-select';

...

<ReactSelect
  key={`my_unique_select_key__${selected}`}
  value={selected || ''}
  ...
/>
有人可以在这里解释一下是selected什么吗?变量或关键字或只是字符串?
2021-05-25 12:50:21
selected在您跟踪下拉列表的当前状态时存储在某处的 state 中。当用户做出新选择时,这应该更新。这将导致键更改并重新渲染组件,因此将当前选定的值传递给它将确保它使用正确的选择来执行此操作,
2021-06-03 12:50:21
真的很好。如果您选择的值为对象,请使用my_unique_select_key__${JSON.stringify(selected)}
2021-06-08 12:50:21
这有效,但请注意,它会导致输入失去焦点。如果这很重要您可以强制重新聚焦它
2021-06-18 12:50:21
刚刚value={selected || ''}为我解决了
2021-06-18 12:50:21

您可以使用 ref 清除 react select 的值。

import React, { useRef } from "react";
import Select from "react-select";

export default function App() {
  const selectInputRef = useRef();

  const onClear = () => {
    selectInputRef.current.select.clearValue();
  };

  return (
    <div className="App">
      <h1>Select Gender</h1>
      <Select
        ref={selectInputRef}
        options={[
          { value: "male", label: "Male" },
          { value: "female", label: "Female" }
        ]}
      />
      <button onClick={onClear}>Clear Value</button>
    </div>
  );
}

这是 CodeSandbox链接

如果我们需要使用 ref ,那么只需重置一个选择框,那么开发人员的生命就结束了。
2021-05-24 12:50:21
在的情况下import CreatableSelect from 'react-select/creatable',您需要使用creatableSelectRef.current.select.select.clearValue()
2021-05-25 12:50:21
它向我显示了一个错误:预期的类型来自属性 'ref',该属性在此处声明的类型为 'IntrinsicAttributes & IntrinsicClassAttributes<StateManager<any, false, Select<any, false>>> & Readonly<...> & Readonly< ...>'
2021-05-31 12:50:21
嗨@Zeeshan Ahmad 你能告诉我如何使用 refs 清除值而不是将它们添加回选项列表吗???
2021-06-08 12:50:21

只需将值存储在状态中,然后使用 componentDidUpdate 等以编程方式更改状态...

class Example extends Component {

constructor() {
    super()
}

state = {
     value: {label: 'Default value', key : '001'}
}

render() {
   return(
      <Select
         ...
         value={this.state.value}
         ...
      />
   )
)}

注意:'value' 应该是一个对象。

很高兴注意到 Select 值应该是一个对象。
2021-06-15 12:50:21
世界之外的东西,但也没有奏效。
2021-06-21 12:50:21

一个简单的选择是传递nullvalueprops。

<Select value={null} />
如果您选择此选项,您应该为值设置一个状态,在每次更改时设置该状态,否则您的字段将保持为空
2021-06-02 12:50:21