Как программно очистить/сбросить 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 для государственного менеджера, но не для выбора самого себя.
К счастью, 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
с новым выбранным значением