задержка обновления состояния в флажке, реагирует

#javascript #reactjs #checkbox #react-hooks

#javascript #reactjs #флажок #реакция-перехваты

Вопрос:

У меня есть объекты sizes , и newProduct мне нужно установить доступные размеры с помощью флажков, все работает нормально, но :

Когда я устанавливаю два флажка, состояние обновляется только в первом поле, затем при перемещении sizes объекта к newProduct объекту состояние newProduct не обновляется, пока я не установлю третий флажок (обновляю только значение первого поля)

Вот мой код :

 function Products(){

    const [sizes, setSizes] = useState({
        s: false, m: false, l: false, xl: false, xxl: false, xxxl: false
    })
    const [newProduct, setNewProduct] = useState({
        productType : "", name : "", price : "", photo : "", sizes : sizes
    })

    const manageSizes = (e) => {
        
        const { name, checked} = e.target
        
        setSizes({...sizes, [name] : checked}) // late (1)
        
        setNewProduct({...newProduct, sizes : sizes}) // late (2)
        
    }
    return (
          {Object.keys(sizes).map((item, index) => (
                <label key={index} htmlFor={item}>{item}
                        <input 
                        type="checkbox"
                        checked={sizes[item]}
                        name={item} 
                        onChange={manageSizes}
                        />
                </label>        
          ))}
    )
}
 

Ответ №1:

Вам нужно использовать новый объект при настройке нового продукта.

 const manageSizes = (e) => {
    
    const { name, checked} = e.target
   
    setSizes({...sizes, [name] : checked})
    
    setNewProduct({...newProduct, sizes : {...sizes, [name] : checked}}) // <--- new object.
    
}
 

или установите его как новую переменную

 const manageSizes = (e) => {
    
    const { name, checked} = e.target
    const newSizes = {...sizes, [name]: checked }
   
    setSizes(newSizes) 
    setNewProduct({...newProduct, sizes : newSizes }) // <--- new object.
    
}
 

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

1. да, это работает без каких-либо ошибок или предупреждений, спасибо.

Ответ №2:

Как setSizes и в случае с асинхронной функцией, вы не можете получить обновленное значение sizes сразу после setSizes .

Вы должны получить это в процессе useEffect добавления sizes зависимости.

 useEffect(() => {
  setNewProduct({...newProduct, sizes: sizes})
}, [ sizes ])
 

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

1. но как я могу реализовать useEffect перехват внутри manageSize функции?

2. не реализуйте useEffect внутри функции manageSize, просто определите ее внутри Products() {…}

3. это работает, но есть предупреждение : React Hook useEffect has a missing dependency: 'newProduct'. Either include it or remove the dependency array. You can also do a functional update 'setNewProduct(n => ...)' if you only need 'newProduct' in the 'setNewProduct' call

4. или попробуйте с этим setNewProduct(prevProduct => {...prevProduct, sizes: sizes})

5. решение @semeon работает без каких-либо предупреждений, большое спасибо за помощь