繁体   English   中英

无法在自定义挂钩内的回调 function 中访问 state

[英]Can't access state in callback function inside a custom Hook

https://codesandbox.io/s/building-forms-in-react-forked-0n41j?file=/src/index.js

当我在输入Full Name上输入文本时,我单击键输入输入值仍然是 "" 在警报弹出文本上。

看看我下面的代码。

function useKeyPressListener(callback?: Function, keys: string[] = ["Enter"]) {
  const handleClick = (e: any) => {
    if (keys.includes(e.key)) {
      e.preventDefault();
      e.stopPropagation();
      if (callback) callback();
    }
  };

  useEffect(() => {
    console.log("added");
    document.addEventListener("keypress", handleClick);
    return () => {
      console.log("remove");
      document.removeEventListener("keypress", handleClick);
    };
  }, []);
}

const App = () => {
  const [value, setValue] = useState("");

  const submit = () => {
    window.alert(`you submitted value ${value}`);
  };

  useKeyPressListener(submit);
  return (
    <div>
      <div className="col-md-6">
        <h3> Sample Form Container </h3>
        <Input
          inputType={"text"}
          title={"Full Name"}
          name={"name"}
          value={value}
          placeholder={"Enter your name"}
          handleChange={(e) => setValue(e.target.value)}
        />
        <Button action={submit} type={"primary"} title={"Submit"} />
      </div>
      <div>{value}</div>
    </div>
  );
};
document.addEventListener("keypress", handleClick);

在mount中执行一次,所以它首先引用包含value=""的handleClick function

你应该在 handleClick 引用更改时更新 handleClick,这样你就可以像下面那样将 [callback] 添加到你的 useEffect

  useEffect(() => {
    console.log("added");
    document.addEventListener("keypress", handleClick);
    return () => {
      console.log("remove");
      document.removeEventListener("keypress", handleClick);
    };
  }, [callback]);

它固定在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM