首页 > 解决方案 > 将 Class 组件转换为 handleChange Hook

问题描述

我想将此类组件转换为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, input],
      () => {
        console.log("Checkbox: ", value);
      }
    );
  };
};

标签: reactjsreact-hooksreact-componentreact-functional-component

解决方案


好像你正在尝试做这样的事情?您不需要任何自定义挂钩 - 只需useStateuseEffect.

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>
};

推荐阅读