Состояние не обновляется при использовании выбора и параметров

#reactjs #select #options #use-state

Вопрос:

все еще немного новичок в этом деле. У меня есть выбор с выпадающими опциями, и я пытаюсь обновить состояние «уровни» при изменении параметра списка. Когда я изменяю состояние уровней вручную, оно повторно отображается, но не при использовании функции onChange выбора. Спасибо.

   function App() {
  const [color, setColor] = useState("");
  const [error, setError] = useState(false);
  const [levels, setLevels] = useState(10);
  const [list, setList] = useState(new Values('#245422').all(levels));
  

  const handleSubmit = (e) => {
    e.preventDefault();
    try {
      let colors = new Values(color).all(levels);
      setList(colors);
    } catch (error) {
      setError(true);
      console.log("please enter valid color");
    }
  };
  
  return (
    <>
      <section className="container">
        <h3>color generator</h3>
        <form onSubmit={handleSubmit}>
          <input
            type="text"
            value={color}
            onChange={(e) => setColor(e.target.value)}
            placeholder="#ff34sd"
            className={`${error ? "error" : null}`}
          />
          <button className="btn" type="submit">
            submit
          </button>
        </form>
        <div>
      <label htmlFor="variation" className="select-label">
        # of variations
      </label>
      <select name="variation" id="variation" onChange={(e) => {
        const selectValue = parseInt(e.target.value)
        setLevels(selectValue)
        console.log(selectValue)
      }}>
        <option value="26" default>7</option>
        <option value="10">21</option>
        <option value="6">32</option>
        <option value="4">51</option>
        <option value='2'>101</option>
      </select>

    </div>
 

Комментарии:

1. Что такое new Values в вашем коде?

2. Мне жаль, что я не понимаю. Как бы я использовал новый оператор в этом контексте?

Ответ №1:

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

 <select name="variation" id="variation" onChange={(e) => {
        const selectValue = parseInt(e.target.value)
        setList(new Values(`${color}`).all(selectValue))
      }}>
        <option value="26" default>7</option>
        <option value="10">21</option>
        <option value="6">32</option>
        <option value="4">51</option>
        <option value='2'>101</option>
      </select>
 

Ответ №2:

Я думаю, вы забыли использовать value атрибут:

 <select value={levels.toString()} name="variation" id="variation" onChange={(e) => {
        const selectValue = parseInt(e.target.value)
        setLevels(selectValue)
        console.log(selectValue)
      }}>
        <option value="26" default>7</option>
        <option value="10">21</option>
        <option value="6">32</option>
        <option value="4">51</option>
        <option value='2'>101</option>
      </select>
 

Комментарии:

1. Привет, попробовал код с добавленной стоимостью при выборе и все еще без повторного рендеринга. Спасибо

2. Я проверил, все работает нормально. видишь codesandbox.io/s/distracted-wave-q97sn?file=/src/App.js

3. Я согласен, что ваш код в порядке.. журнал консоли в обработчике onChange не указывает, обновляется ли состояние вашего компонента. если вы посмотрите на этот код, вы заметите, что значение изменяется, как ожидалось, если вы отобразите значение: codesandbox.io/s/vibrant-liskov-fxex5?file=/src/App.js

4. Да, я пытался создать новый компонент, и он обновляет значение уровней, но я хочу, чтобы уровни также обновлялись в состоянии использования списка. Возможно, я делаю что-то совершенно неправильное. Я ценю вашу помощь.