ReactSelect V2 и V3, похоже, имеют несколько свойств, таких как clearValue, resetValue и setValue. Что бы я ни пытался, я не могу очистить выбор программно. resetValue вроде недоступен извне.
selectRef.setValue([], 'clear')
// or
selectRef.clearValue()
Это не очищает текущий выбор.
Я что-то здесь упускаю или это еще не реализовано полностью?
Я пробовал и зря потратил время, используя response-select. простота сброса формы отсутствует, тогда зачем это использовать? это сделано очень сложно, и само руководство может понять только создатель.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если вы используете реагировать-выбрать, вы можете попробовать передать 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
}
}));
};
handleChangeEvent = 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.handleChangeEvent}
options = {select.options}
/>
</div>
);
}
}
render(<App />, document.getElementById("root"));
Вот рабочий пример этого.
Приведите в ответ (упрощенный) пример кода, поскольку ссылки не являются постоянными.
Привет, я новичок в response-select, могу ли я узнать, что это делает: `select: {value: options [0], options}
@AKJ Часть value: options[0] означает, что response-select будет иметь опцию "One" в качестве начального значения. (также добавлен пояснительный комментарий к этой строке)
Я добавлю, что очистка значения работает только с null. Если вы передадите undefined (как я), выбранное значение останется.
ничего не работало. React-select - это ад .. слишком сложно просто сбросить его. если мы потратим день на сброс элемента управления select ... когда мы должны его отправить?
В случае, если это кому-то поможет, вот мое решение: я создал кнопку для очистки выбранного значения, вернув состояние к исходному значению.
<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Это не использует API реакции-выбора для сброса значений.
Если вы установите флажок Выбрать компонент на панели разработчиков React, вы увидите, что он обернут другим - State Manager. Таким образом, ваша ссылка в основном относится к диспетчеру состояний, а не к самой выборке.
К счастью, у 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("Enter name")}
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("Enter name")
}
Я сам столкнулся с этой проблемой и сумел исправить ее, передав key компоненту React-Select с добавленным к нему выбранным значением. Затем это заставит ReactSelect выполнить повторный рендеринг при обновлении выделения.
Я надеюсь, что это поможет кому-то.
import ReactSelect from 'react-select';
...
<ReactSelect
key = {`my_unique_select_key__${selected}`}
value = {selected || ''}
...
/>
Действительно хороший. Если выбрано значение object, используйте my_unique_select_key__${JSON.stringify(selected)}.
Это работает, но обратите внимание, что это приводит к потере фокуса ввода. Вы можете императивно переориентировать, если это важно.
Просто value = {selected || ''} решил это за меня
может кто-нибудь объяснить здесь, что такое selected? переменная или ключевое слово или просто строка?
selected где-то хранится в состоянии, пока вы отслеживаете текущее состояние раскрывающегося списка. Это должно быть обновлено, когда пользователь делает новый выбор. Это приведет к изменению ключа и повторному рендерингу компонента, поэтому передача ему текущего выбранного значения гарантирует, что он сделает это с правильным выбором,
Просто сохраните значение в состоянии и измените состояние программно с помощью componentDidUpdate и т. д.
class Example extends Component {
constructor() {
super()
}
state = {
value: {label: 'Default value', key : '001'}
}
render() {
return(
<Select
...
value = {this.state.value}
...
/>
)
)}
Примечание: «значение» должно быть объектом.
Браво за то, что вы заметили, что значение Select должно быть объектом.
что-то необычное, но тоже не сработало.
Простой вариант - передать null в опору value.
<Select value = {null} />
Если вы выберете этот вариант, вы должны создать состояние для значения, которое устанавливается при каждом изменении, или ваше поле останется пустым.
Это моя рабочая реализация React-Select V3очищено программно с Хуки.
Вы можете поиграть с ним в CodeSandbox ДЕМО. Любые отзывы приветствуются.
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>
);
Я использую redux-observable.
Начальное состояние:
firstSelectData: [],
secondSelectData:[],
secondSelectValue: null
Создаю действие для заполнения first select. при изменении первого выбора я вызываю действие для заполнения второго.
При успешном заполнении сначала выберите Я установил (secondSelectData - [], secondSelectValue - null)
При успешном заполнении второго выбора я установил (от secondSelectValue до null)
при изменении второго выбора я вызываю действие по обновлению secondSelectValue с новым выбранным значением
Если кто-то ищет решение с помощью Hooks. React-Select 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}
/>
}
Для тех, кто работает с функциональным компонентом, вот базовая демонстрация о том, как вы можете сбросить выбор реакции на основе некоторого изменения / триггера / reduxValue.
import React, { useState, useEffect } from 'react';
import Select from 'react-select';
const customReactSelect = ({ options }) => {
const [selectedValue, setSelectedValue] = useState([]);
/**
* Based on Some conditions you can reset your value
*/
useEffect(() => {
setSelectedValue([])
}, [someReduxStateVariable]);
const handleChangeEvent = (selectedVal) => {
setSelectedValue(selectedVal);
};
return (
<Select value = {selectedValue} onChange = {handleChangeEvent} options = {options} />
);
};
export default customReactSelect;
Вы можете очистить значение выбора реакции с помощью ref.
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', которое здесь объявлено в типе 'IntrinsicAttributes & IntrinsicClassAttributes <StateManager <any, false, Select <any, false >>> & Readonly <...> & Readonly < ...> '
Привет, @Zeeshan Ahmad, не могли бы вы сообщить мне, как я могу очистить значения с помощью ссылок и не добавлять их обратно в список параметров ???
В случае import CreatableSelect from 'react-select/creatable' вам необходимо использовать creatableSelectRef.current.select.select.clearValue()
Спасибо чувак! Прямое решение.
просто сбросьте поле выбора, если нам нужно использовать ref, тогда это конец жизни разработчика.
Вы можете установить значение null
const [selectedValue, setSelectedValue] = useState();
const [valueList, setValueList] = useState([]);
const [loadingValueList, setLoadingValueList] = useState(true);
useEffect(() => {
//on page load update valueList and Loading as false
setValueList(list);
loadingValueList(false)
}, []);
const onClear = () => {
setSelectedValue(null); // this will reset the selected value
};
<Select
className = "basic-single"
classNamePrefix = "select"
value = {selectedValue}
isLoading = {loadingValueList}
isClearable = {true}
isSearchable = {true}
name = "selectValue"
options = {valueList}
onChange = {(selectedValue) =>
setSelectedValue(selectedValue)}
/>
<button onClick = {onClear}>Clear Value</button>
Вопрос явно ищет решение для response-select / creatable. Пожалуйста, найдите приведенный ниже код, простой ответ и решение вопроса. Вы можете изменить код под вашу конкретную задачу.
'''
import CreatableSelect from 'react-select/creatable';
const TestAction = (props) => {
const {
buttonLabelView,
className
} = props;
const selectInputRef = useRef();
function clearSelected(){
selectInputRef.current.select.select.clearValue()
}
const createOption = (label, dataId) => ({
label,
value: dataId,
});
const Options = (["C1", "C2", "C3", "C4"])?.map((post, id) => {
return createOption(post, id);
});
return(
<div>
<CreatableSelect
ref = {selectInputRef}
name = "dataN"
id = "dataN"
className = "selctInputs"
placeholder = " Select..."
isMulti
options = {Options} />
<button onClick = {(e)=> clearSelected()} > Clear </button>
</div>
);
}
export default TestAction;
'''
if you are using formik then use below code to reset react-select value.
useEffect(()=>{
formik.setFieldValue("stateName", [])
},[])
Where stateName is html field name.
if you want to change value according to another dropdown/select (countryName) then pass that field value in useEffect array like below
useEffect(()=>{
formik.setFieldValue("stateName", [])
},[formik.values.countryName])
if you are using formik then use below code to reset react-select value.
useEffect(()=>{
formik.setFieldValue("stateName", [])
},[])
Where stateName is html field name.
if you want to change value according to another dropdown/select (countryName) then pass that field value in useEffect array like below
useEffect(()=>{
formik.setFieldValue("stateName", [])
},[formik.values.countryName])
передача null в атрибуте value элемента response-select сбросит его.
Ответ Зишана действительно правильный - вы можете использовать clearValue(), но когда вы это сделаете, экземпляр Select не будет сброшен на вашу опору defaultValue, как вы могли подумать. clearValue() возвращает общую метку Select... без данных в value.
Вероятно, вы захотите использовать selectOption() в своем сбросе, чтобы явно указать react-selectна какое значение / метку следует сбросить. Как я его подключил (используя Next.js, styled-components и react-select):
import { useState, useRef } from 'react'
import styled from 'styled-components'
import Select from 'react-select'
// Basic button design for reset button
const UIButton = styled.button`
background-color: #fff;
border: none;
border-radius: 0;
color: inherit;
cursor: pointer;
font-weight: 700;
min-width: 250px;
padding: 17px 10px;
text-transform: uppercase;
transition: 0.2s ease-in-out;
&:hover {
background-color: lightgray;
}
`
// Using style object `react-select` library indicates as best practice
const selectStyles = {
control: (provided, state) => ({
...provided,
borderRadius: 0,
fontWeight: 700,
margin: '0 20px 10px 0',
padding: '10px',
textTransform: 'uppercase',
minWidth: '250px'
})
}
export default function Sample() {
// State for my data (assume `data` is valid)
const [ currentData, setCurrentData ] = useState(data.initial)
// Set refs for each select you have (one in this example)
const regionOption = useRef(null)
// Set region options, note how I have `data.initial` set here
// This is so that when my select resets, the data will reset as well
const regionSelectOptions = [
{ value: data.initial, label: 'Select a Region' },
{ value: data.regionOne, label: 'Region One' },
]
// Changes data by receiving event from select form
// We read the event's value and modify currentData accordingly
const handleSelectChange = (e) => {
setCurrentData(e.value)
}
// Reset, notice how you have to pass the selected Option you want to reset
// selectOption is smart enough to read the `value` key in regionSelectOptions
// All you have to do is pass in the array position that contains a value/label obj
// In my case this would return us to `Select a Region...` label with `data.initial` value
const resetData = () => {
regionOption.current.select.selectOption(regionSelectOptions[0])
setCurrentData(data.initial)
}
// notice how my `UIButton` for the reset is separate from my select menu
return(
<>
<h2>Select a region</h2>
<Select
aria-label = "Region select menu"
defaultValue = { regionSelectOptions[0] }
onChange = { event => handleDataChange(event) }
options = { regionSelectOptions }
ref = { regionOption }
styles = { selectStyles }
/>
<UIButton
onClick = { resetData }
>
Reset
</UIButton>
</>
)
}
Обратите внимание, что в верхнем ответе для правильной очистки значение должно быть «null», а не «undefined».
Вы можете использовать значение null