问题描述
我想将此类组件转换为在功能组件中起作用的handleChange
事件。我并不完全确定这是可能的,它可能必须是一个钩子。我不太正确的语法。
class CheckBoxForm extends Component {
constructor(props) {
super(props);
this.state = { value: [] };
this.handleChange = this.handleChange.bind(this);
}
handleChange(event) {
const input = event.target.value;
this.setState(
{
value: this.state.value.includes(input)
? this.state.value.filter((item) => item !== input)
: [...this.state.value,input],},() => {
console.log("CheckBox: ",this.state.value);
}
);
}
我的尝试:
export const CheckBoxHook = (props) => {
const [value,setValue] = useState([]);
const handleCheckBox = (event) => {
const input = event.target.value;
setValue(
value.include(input)
? value.filter((item) => item !== input)
: [value,() => {
console.log("CheckBox: ",value);
}
);
};
};
解决方法
似乎您正在尝试执行此类操作?您不需要任何自定义钩子,只需useState
和useEffect
。
const CheckboxForm = (props) => {
const [checkedItems,setCheckedItems] = useState([]);
useEffect(() => {
// equivalent to passing a callback to `this.setState` in class component
console.log("Checked: ",checkedItems);
},[checkedItems])
const handleCheckbox = (event) => {
const { value } = event.target;
// setting with hooks must use a callback
// if you need access to the previous value
setCheckedItems(items =>
items.includes(value)
? items.filter(item => item !== value)
: [...items,value]
);
};
return <form>
<label>a <input value="a" type="checkbox" onChange={handleCheckbox} /></label>
<label>b <input value="b" type="checkbox" onChange={handleCheckbox} /></label>
<label>c <input value="c" type="checkbox" onChange={handleCheckbox} /></label>
</form>
};
,
您可以使用自定义钩子包装处理程序逻辑,并像这样使用它:
{prefix}uptime