Nak*_*esh 3 javascript checkbox reactjs react-hooks
我想使用react-hook在HTML页面上实现多个复选框。
我尝试使用以下URL实施:https : //medium.com/@Zh0uzi/my-concerns-with-react-hooks-6afda0acc672。在提供的链接中,它是使用类组件完成的并且可以正常工作,但是每当我使用React钩子setCheckedItems更新复选框选中状态时,它都不会重新呈现视图。
第一次渲染视图,并且从Checkbox组件打印console.log()。单击复选框功能后,将调用handleChange,并且checkedItems更新该值,但视图不会再次呈现(不打印console.log())。并且{checkedItems.get(“ check-box-1”)}也不打印任何值。
以下是我的示例代码。
复选框示例:
import React, { useState } from 'react';
import Checkbox from '../helper/Checkbox';
const CheckboxExample = () => {
const [checkedItems, setCheckedItems] = useState(new Map());
const handleChange = (event) => {
setCheckedItems(checkedItems => checkedItems.set(event.target.name, event.target.checked));
console.log("checkedItems: ", checkedItems);
}
const checkboxes = [
{
name: 'check-box-1',
key: 'checkBox1',
label: 'Check Box 1',
},
{
name: 'check-box-2',
key: 'checkBox2',
label: 'Check Box 2',
}
];
return (
<div>
<lable>Checked item name : {checkedItems.get("check-box-1")} </lable> <br/>
{
checkboxes.map(item => (
<label key={item.key}>
{item.name}
<Checkbox name={item.name} checked={checkedItems.get(item.name)} onChange={handleChange} />
</label>
))
}
</div>
);
}
export default Example;
Run Code Online (Sandbox Code Playgroud)
复选框:
import React from 'react';
const Checkbox = ({ type = 'checkbox', name, checked = false, onChange }) => {
console.log("Checkbox: ", name, checked);
return (<input type={type} name={name} checked={checked} onChange={onChange} /> )
}
export default Checkbox;
Run Code Online (Sandbox Code Playgroud)
我认为用a Map表示状态不是最好的主意。
我已经使用简单的方式实现了您的示例,Object并且可以正常工作:
https://codesandbox.io/s/react-hooks-usestate-xzvq5
const CheckboxExample = () => {
const [checkedItems, setCheckedItems] = useState({}); //plain object as state
const handleChange = (event) => {
// updating an object instead of a Map
setCheckedItems({...checkedItems, [event.target.name] : event.target.checked });
console.log("checkedItems: ", checkedItems);
}
const checkboxes = [
{
name: 'check-box-1',
key: 'checkBox1',
label: 'Check Box 1',
},
{
name: 'check-box-2',
key: 'checkBox2',
label: 'Check Box 2',
}
];
return (
<div>
<lable>Checked item name : {checkedItems["check-box-1"]} </lable> <br/>
{
checkboxes.map(item => (
<label key={item.key}>
{item.name}
<Checkbox name={item.name} checked={checkedItems[item.name]} onChange={handleChange} />
</label>
))
}
</div>
);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
原来一个Mapcan可以作为状态值,但是要触发重新渲染,您需要用一个新的Map替换该Map,而不是简单地对其进行突变,这不是React所选择的,即:
const handleChange = (event) => {
// mutate the current Map
checkedItems.set(event.target.name, event.target.checked)
// update the state by creating a new Map
setCheckedItems(new Map(checkedItems) );
console.log("checkedItems: ", checkedItems);
}
Run Code Online (Sandbox Code Playgroud)
但是在这种情况下,我认为使用Map除了使用.get()和.set()而不是更简洁的语法外没有其他好处x[y]。
作为替代方案Map,您可以考虑使用Set. 这样您就不必担心最初将每个项目设置为false未选中状态。快速概念验证:
const [selectedItems, setSelectedItems] = useState(new Set())
function handleCheckboxChange(itemKey: string) {
// first, make a copy of the original set rather than mutating the original
const newSelectedItems = new Set(selectedItems)
if (!newSelectedItems.has(itemKey)) {
newSelectedItems.add(itemKey)
} else {
newSelectedItems.delete(itemKey)
}
setSelectedItems(newSelectedItems)
}
...
<input
type="checkbox"
checked={selectedItems.has(item.key)}
onChange={() => handleCheckboxChange(item.key)}
/>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3906 次 |
| 最近记录: |