如何以编程方式清除/重置react-select v2?

Mar*_*arc 19 javascript functional-programming reactjs react-select react-hooks

ReactSelect V2(测试版5)似乎有几个道具一样clearValue,resetValuesetValue.无论我在尝试什么,我都无法以编程方式清除选择.resetValue似乎无法从外部访问.

selectRef.setValue([], 'clear')
// or
selectRef.clearValue()
Run Code Online (Sandbox Code Playgroud)

这并不能清除当前的选择.

我在这里想念一下,还是没有完全实现?

Zee*_*mad 15

您可以使用 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>
  );
}
Run Code Online (Sandbox Code Playgroud)

这是 CodeSandbox链接

  • 如果是“import CreatableSelect from 'react-select/creatable'”,则需要使用“creatableSelectRef.current.select.select.clearValue()” (3认同)
  • 如果我们需要使用 ref 的话,也重置选择框,那么开发人员的生命就结束了。 (3认同)
  • @LaliteshUpadhyaya如果你想用这个解决方案处理打字稿,你应该使用 useRef&lt;any&gt;() 通用版本。这样你就可以摆脱烦人的 ts 错误。尽管我更愿意使用 selectInputRef.current.setValue("") 来清除 React-Select 版本 5+ 中的选择值。 (3认同)

Art*_*r N 14

如果您正在使用react-select,您可以尝试传递nullvalue道具.

例如:

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"));
Run Code Online (Sandbox Code Playgroud)

这是一个有效的例子.

  • 我将补充说,清除值仅适用于 null。如果您传递 undefined (就像我一样),则选定的值将保持不变。 (3认同)
  • 请在您的答案中提供(简化的)代码示例,因为链接不是永久性的。 (2认同)
  • 没有任何效果。反应选择是地狱..仅仅重置它就太复杂了。如果我们花一天时间重置选择控件..我们应该什么时候提交它? (2认同)

TPH*_*hes 13

我本人遇到了此问题,并通过将a传递key给React-Select组件并附加了所选值来解决了这个问题。然后,ReactSelect当选择内容更新时,这将强制自身重新呈现。

我希望这可以帮助别人。

import ReactSelect from 'react-select';

...

<ReactSelect
  key={`my_unique_select_key__${selected}`}
  value={selected || ''}
  ...
/>
Run Code Online (Sandbox Code Playgroud)

  • 确实不错。如果您选择的值是对象,请使用``my_unique_select_key__${JSON.stringify(selected)}``。 (3认同)
  • 只是 `value={selected || ''}` 帮我解决了 (2认同)

Mah*_*ddy 13

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

class Example extends Component {

constructor() {
    super()
}

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

render() {
   return(
      <Select
         ...
         value={this.state.value}
         ...
      />
   )
)}
Run Code Online (Sandbox Code Playgroud)

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

  • 非常感谢您注意到 Select 值应该是一个对象。 (5认同)

Vin*_*res 6

沿着最上面的答案,请注意该值需要为“null”而不是“未定义”才能正确清除。


小智 5

一个简单的选择是传递nullvalue道具。

<Select value={null} />
Run Code Online (Sandbox Code Playgroud)

  • 如果您选择此选项,您应该为值设置一个状态,每次更改时都会设置该状态,否则您的字段将保持为空 (3认同)

And*_*ios 5

这是我使用Hooks 以编程方式清除React-Select V3 的 工作实现。

您可以在CodeSandbox DEMO 中使用它。欢迎任何反馈。

const initialFormState = { mySelectKey: null };

const [myForm, setMyForm] = useState(initialFormState);

const updateForm = value => {
  setMyForm({ ...myForm, mySelectKey: value });
};

const resetForm = () => {
  setMyForm(initialFormState);
};

return (
  <div className="App">
    <form>

      <Select name = "mySelect"
           options = {options}
             value = {options.filter(({ value }) => value === myForm.mySelectKey)}
    getOptionLabel = {({ label }) => label}
    getOptionValue = {({ value }) => value}
          onChange = {({ value }) => updateForm(value)} />

      <p>MyForm: {JSON.stringify(myForm)}</p>

      <input type="button" value="Reset fields" onClick={resetForm} />

    </form>
  </div>
);
Run Code Online (Sandbox Code Playgroud)


Kir*_*ira 5

如果有人正在寻找使用 Hooks 的解决方案。反应选择V3.05:

const initial_state = { my_field: "" }

const my_field_options = [
    { value: 1, label: "Daily" },
    { value: 2, label: "Weekly" },
    { value: 3, label: "Monthly" },
]

export default function Example(){
    const [values, setValues] = useState(initial_state);

    function handleSelectChange(newValue, actionMeta){
        setValues({
            ...values,
            [actionMeta.name]: newValue ? newValue.value : ""
        })
    }

    return <Select
               name={"my_field"}
               inputId={"my_field"}
               onChange={handleSelectChange}
               options={my_field_options}
               placeholder={values.my_field}
               isClearable={true}
           /> 
}
Run Code Online (Sandbox Code Playgroud)


Lin*_*int 5

在 v5 中,您实际上可以传递 propisClearable={true}使其可清除,这可以轻松重置所选值