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

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

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

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

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

Вы можете использовать значение null

user3808307 06.07.2020 00:12

Я пробовал и зря потратил время, используя response-select. простота сброса формы отсутствует, тогда зачем это использовать? это сделано очень сложно, и само руководство может понять только создатель.

Amit Shah 23.04.2021 11:06
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
47
2
88 929
18

Ответы 18

Если вы используете реагировать-выбрать, вы можете попробовать передать 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"));

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

Приведите в ответ (упрощенный) пример кода, поскольку ссылки не являются постоянными.

klaasman 18.05.2018 21:40

Привет, я новичок в response-select, могу ли я узнать, что это делает: `select: {value: options [0], options}

AKJ 14.01.2019 11:31

@AKJ Часть value: options[0] означает, что response-select будет иметь опцию "One" в качестве начального значения. (также добавлен пояснительный комментарий к этой строке)

Artur N 15.01.2019 18:17

Я добавлю, что очистка значения работает только с null. Если вы передадите undefined (как я), выбранное значение останется.

mihkov 20.06.2019 19:42

ничего не работало. React-select - это ад .. слишком сложно просто сбросить его. если мы потратим день на сброс элемента управления select ... когда мы должны его отправить?

Amit Shah 23.04.2021 11:07

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

<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 реакции-выбора для сброса значений.

serraosays 10.06.2021 01:19

Если вы установите флажок Выбрать компонент на панели разработчиков 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)}.

Sandy 21.09.2019 22:46

Это работает, но обратите внимание, что это приводит к потере фокуса ввода. Вы можете императивно переориентировать, если это важно.

Tamlyn 13.12.2019 12:30

Просто value = {selected || ''} решил это за меня

Daya 22.01.2021 13:17

может кто-нибудь объяснить здесь, что такое selected? переменная или ключевое слово или просто строка?

Amit Shah 23.04.2021 10:44
selected где-то хранится в состоянии, пока вы отслеживаете текущее состояние раскрывающегося списка. Это должно быть обновлено, когда пользователь делает новый выбор. Это приведет к изменению ключа и повторному рендерингу компонента, поэтому передача ему текущего выбранного значения гарантирует, что он сделает это с правильным выбором,
TPHughes 23.04.2021 13:41

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

class Example extends Component {

constructor() {
    super()
}

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

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

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

Браво за то, что вы заметили, что значение Select должно быть объектом.

parse 28.08.2019 22:35

что-то необычное, но тоже не сработало.

Amit Shah 23.04.2021 11:09

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

<Select value = {null} />

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

Ismail El Moudni 09.08.2020 22:12

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

Lalitesh Upadhyaya 27.12.2020 13:21

Привет, @Zeeshan Ahmad, не могли бы вы сообщить мне, как я могу очистить значения с помощью ссылок и не добавлять их обратно в список параметров ???

Phil 17.02.2021 18:26

В случае import CreatableSelect from 'react-select/creatable' вам необходимо использовать creatableSelectRef.current.select.select.clearValue()

michal 03.03.2021 11:33

Спасибо чувак! Прямое решение.

Abdulhakim Zeinu 05.04.2021 10:01

просто сбросьте поле выбора, если нам нужно использовать ref, тогда это конец жизни разработчика.

Amit Shah 23.04.2021 11:10

Вы можете установить значение 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».

Другие вопросы по теме