#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 работает без каких-либо предупреждений, большое спасибо за помощь