• Как сохранить select option в localstorage?

    black1277
    @black1277
    Вольный стрелок
    Чтобы при загрузке страницы был выбран сохраненный вариант из списка option, нужно чтобы у нужного варианта был атрибут selected. Пример:
    <select name="nm" id="nam">
      <option value="QBC">QBC</option>
      <option value="QEF">QEF</option>
      <option value="GHI" selected>GHI</option> <!-- этот вариант будет выбран-->
      <option value="KLM">KLM</option>
    </select>

    значит вам нужно в каждом option выводить переменную вместо selected, которая будет либо пустая, либо равна selected (если сохраненное состояние равно выводимому option).
    Добавил рабочий пример, где всё работает (проверял)
    Пример на функциональных компонентах

    import React, { useState, useEffect } from 'react'
    
    const LocalStorage = () => {
      const date = [
        { symbol: 'RU', label: 'рубль' },
        { symbol: 'USD', label: 'доллар' },
        { symbol: 'EUR', label: 'евро' }
      ]
    
      const [curr, setCurrencies] = useState(date)
      const [currentSymbol, setCurrentSymbol] = useState("EUR") // опция выбранная по умолчанию (если нет данных в localstorage)
    
    // срабатывает один раз при загрузке компонента
      useEffect(() => {
        if(localStorage.getItem('symbol')) {
          const item = localStorage.getItem('symbol')
          setCurrentSymbol(item)
        }
      }, [])
    
    // обработчик - срабатывает при выборе опции списка
      const selectHandler = (e) => {
        localStorage.setItem('symbol', e.target.value)
        setCurrentSymbol(e.target.value)
      }
    
      return (
        <div>
          <select onChange={selectHandler} value={currentSymbol}>
            {
              curr.map(currencies => (
                <option key={currencies.symbol} value={currencies.symbol}>
                  {currencies.symbol} {currencies.label}
                </option>
              )
              )
            }
          </select>
        </div>
      )
    }
    
    export default LocalStorage


    на классовых

    import React, { Component } from 'react'
    
    
    class ClassLocal extends Component {
      constructor(props){
        super(props);
        this.state = {
          curr: [
            { symbol: "RU", label: "рубль" },
            { symbol: "USD", label: "доллар" },
            { symbol: "EUR", label: "евро" }
          ],
          currentSymbol: "EUR"
        }
      }
    
    
      componentDidMount() {
        if(localStorage.getItem('symbol')) {
          const item = localStorage.getItem('symbol');
          this.setState({currentSymbol: item})
        }
      }
    
    
      selectHandler = (e) => {
        localStorage.setItem('symbol', e.target.value)
        this.setState({currentSymbol: e.target.value})
      }
    
      render() {
        return (
          <div>
            <select onChange={this.selectHandler} value={this.state.currentSymbol}>
              {
                this.state.curr.map(currencies => (
                    <option key={currencies.symbol} value={currencies.symbol}>
                      {currencies.symbol} {currencies.label}
                    </option>
                  )
                )
              }
            </select>
          </div>
        )
      }
    }
    
    export default ClassLocal

    Ответ написан
    7 комментариев
  • Как увеличить или уменьшить число во вложенном объекте в state?

    Kostenitskiy_A
    @Kostenitskiy_A
    Попробуй так
    const newArrayId = this.state.countId;
    newArrayId.map((element) => { element.quantity + 1 });
    this.setState({countId: newArrayId});

    1 строка - создаёшь новый массив на основе объектов из this.state.countId
    2 строка - перебираешь элементы нового массива и увеличиваешь quantity на 1
    3 строка - меняешь своё состояние
    Ответ написан
    1 комментарий