Как я могу контролировать значение по умолчанию в поле выбора поэтапно с помощью React-Select?

#reactjs #react-select

Вопрос:

 let params = {
    "grade" : 1,
    "time" : 1,
}


function Calculator () {

    const options1 = [
        { value: 1, label:'example01'},
        { value: 2, label:'example02'},
    ]

    const options2_1 = [
        { value: 1, label:'example01-1'},
        { value: 2, label:'example01-2'}
    ]
    
    const options2_2 = [
        { value: 1, label:'example02-1'},
        { value: 2, label:'example02-2'}
    ]

    const [timeOption, setTimeOption] = useState(options2_1)

    function changeOption(data, info) {
        let selectName = info.name
        let selectValue = data.value
        if (selectValue === 1) {
            setTimeOption(options2_1)
        }
        else if (selectValue === 2) {
            setTimeOption(options2_2)
        }


return (<div>
 <div className="select_wrap">
      <Select options={options1} className='calc' defaultValue={options1[0]} classNamePrefix='calc' isSearchable={ false } name={"grade"}  onChange={changeOption}/>
      <Select options={timeOption} className='calc' defaultValue={options2_1[0]} classNamePrefix='calc' isSearchable={ false } name={"time"}  />
</div>
</div>)}
 

Я хочу, чтобы опция второго выбора менялась в соответствии со значением выбора первого выбора.
Это изменит параметры второго выбора, но не значение по умолчанию. (Если щелкнуть значение по умолчанию, которое не изменено, содержимое параметра изменится.) Если изменить значение по умолчанию на значение, первое значение выбора будет изменено, но выбор опции невозможен. Есть ли способ автоматически изменить значение по умолчанию второго выбора в зависимости от выбранного значения первого выбора?

Ответ №1:

Вы можете сделать это с value помощью . Но при использовании value Select теперь это контролируемый компонент. Теперь вы должны управлять value им самостоятельно onChange .

 import { useState } from "react";
import Select from "react-select";

let params = {
  grade: 1,
  time: 1
};

const options1 = [
  { value: 1, label: "example01" },
  { value: 2, label: "example02" }
];

const options2_1 = [
  { value: 1, label: "example01-1" },
  { value: 2, label: "example01-2" }
];

const options2_2 = [
  { value: 1, label: "example02-1" },
  { value: 2, label: "example02-2" }
];

export default function Calculator() {
  const [timeOptions, setTimeOptions] = useState(options2_1);
  const [timeValue, setTimeValue] = useState(options2_1[0]);

  function changeTimeOptions({ value }) {
    const options = value === 1 ? options2_1 : options2_2;
    setTimeOptions(options);
    setTimeValue(options[0]);
  }

  function changeTimeValue(option) {
    setTimeValue(option);
  }

  return (
    <div>
      <div className="select_wrap">
        <Select
          options={options1}
          className="calc"
          defaultValue={options1[0]}
          classNamePrefix="calc"
          isSearchable={false}
          name="grade"
          onChange={changeTimeOptions}
        />
        <Select
          options={timeOptions}
          className="calc"
          classNamePrefix="calc"
          isSearchable={false}
          value={timeValue}
          onChange={changeTimeValue}
          name="time"
        />
      </div>
    </div>
  );
}