Как программно очистить/сбросить React-Select?

ReactSelect V2 и V3, похоже, имеют несколько реквизитов, таких как clearValue, resetValue и setValue. Что бы я ни пытался, я не могу очистить выбор программно. resetValue кажется недоступным снаружи.

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

Это не очищает текущий выбор.

Я что-то здесь упускаю или еще не полностью реализовано?

Ответы

Ответ 1

Если вы используете response-select, вы можете попробовать передать null в value проп.

Например:

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"));

Вот рабочий пример этого.

Ответ 2

Я сам столкнулся с этой проблемой и сумел ее исправить, передав key в компонент React-Select с добавленным к нему выбранным значением. Это тогда заставит ReactSelect повторно визуализировать себя, когда выбор будет обновлен.

Я надеюсь, что это помогает кому-то.

import ReactSelect from 'react-select';

...

<ReactSelect
  key={'my_unique_select_key__${selected}'}
  value={selected || ''}
  ...
/>

Ответ 3

Просто сохраните значение в состоянии и измените состояние программно, используя componentDidUpdate и т.д.

class Example extends Component {

constructor() {
    super()
}

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

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

Примечание: "значение" должно быть объектом.

Ответ 4

В случае, если это помогает кому-то, это мое решение: я создал кнопку, чтобы очистить выбранное значение, установив состояние обратно на это начальное значение.

<button onClick={() => this.clearFilters()} >Clear</button>

clearFilters(){
    this.setState({ startTime: null })
}

Полный образец кода ниже:

import React from "react"
import Select from 'react-select';

const timeSlots = [
    { value: '8:00', label: '8:00' },
    { value: '9:00', label: '9:00' },
    { value: '10:00', label: '10:00' },
] 

class Filter extends React.Component {

  constructor(){
    super();
    this.state = {
      startTime: null,
    }
  }
  
  startTime = (selectedTime) => {
    this.setState({ startTime: selectedTime });
  }

  clearFilters(){
    this.setState({
        startTime: null, 
    })
  }

  render(){
    const { startTime } = this.state;
    
    return(
      <div>
        <button onClick={() => this.clearFilters()} >Clear</button>
        <Select
            value={startTime}
            onChange={this.startTime}
            options={timeSlots}
            placeholder='Start time'
        />
      </div>
    )
  }

}

export default Filter

Ответ 5

Если вы установите флажок Выбрать компонент на панели разработчиков React, вы увидите, что он обернут другим - State Manager. Таким образом, вы ref в основном ref для государственного менеджера, но не для выбора самого себя.

enter image description here

К счастью, StateManager имеет состояние) и объект значения, который вы можете установить в любое положение.

Например (это из моего проекта, resetGroup - это обработчик onClick, который я прикрепляю к некоторой кнопке в DOM):

<Select onChange={this.handleGroupSelect} 
      options={this.state.groupsName.map(group => 
                  ({ label: group, value: group }) )}
      instanceId="groupselect"
      className='group-select-container'
      classNamePrefix="select"
      placeholder={this.context.t("Введите название")}
      ref={c => (this.groupSelect = c)}
/>

    resetGroup = (e) => {
        e.preventDefault()
        this.setState({
            selectedGroupName: ""
        })
        this.groupSelect.state.value.value = ""
        this.groupSelect.state.value.label = this.context.t("Введите название")
    }

Ответ 6

Простой вариант - передать null в value реквизит.

<Select value={null} />

Ответ 7

Это моя рабочая реализация 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>
);

Ответ 8

Я использую наблюдаемую избыточность.

Исходное состояние:

firstSelectData: [],
secondSelectData:[],
secondSelectValue: null

Я создаю действие для заполнения первого выбора. при изменении первого выбора я вызываю действие для заполнения второго.

В случае успешного заполнения сначала выберите я set (secondSelectData - [], secondSelectValue - null)

В случае успешной установки второй секунды выберите я (от secondSelectValue до null) при изменении второго выбора я вызываю действие для обновления secondSelectValue с новым выбранным значением