javascript - 防止 useEffect 在初始渲染时触发

标签 javascript reactjs typescript react-hooks

我想对自定义输入进行去抖,但我的问题是我无法在初始渲染时停止触发器中的 useEffect

import { useDebouncedCallback } from "use-debounce";

interface myInputProps {
  getValue: any;
}

const MyInput = ({ getValue }: myInputProps) => {
  const [value, setValue] = useState("");

  React.useEffect(() => {
    getValue(value);
  }, [value]);

  return (
    <input type="text" value={value} onChange={e => setValue(e.target.value)} />
  );
};

export default function App() {
  const [debouncedCallback] = useDebouncedCallback(value => {
    console.log(value);
  }, 1000);

  return (
    <div className="App">
      <MyInput getValue={debouncedCallback} />
    </div>
  );
}

https://codesandbox.io/s/upbeat-lamport-ukq70?file=/src/App.tsx

我也尝试过 useLayoutEffect 但它没有解决问题。

最佳答案

我们可以使用 useRef 来跟踪 useEffect 钩子(Hook)是否是第一次运行。

https://reactjs.org/docs/hooks-faq.html#is-there-something-like-instance-variables

沙盒链接:https://codesandbox.io/s/confident-cerf-flkf2?file=/src/App.tsx


const MyInput = ({ getValue }: myInputProps) => {
  const [value, setValue] = useState("");
  const first = useRef(true);

  React.useEffect(() => {
    if (first.current) {
      first.current = false;
      return;
    }
    getValue(value);
  }, [value]);

  return (
    <input type="text" value={value} onChange={e => setValue(e.target.value)} />
  );
};

关于javascript - 防止 useEffect 在初始渲染时触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61135815/

相关文章:

javascript - 为什么 typescript 会在类型联合上给出类型错误?

javascript - 如何获取 onbeforeunload 事件的目标 URL?

javascript - 如何防止用户在不禁用该字段的情况下输入文本字段?

javascript - ThreeJS 无法设置 WebGLRenderer 的 domElement

javascript - ng-model 不更新值

reactjs - 如何在 React Native 中删除 Touchable Opacity 组件之间的空格

javascript - 断言 `this.props.children` 中仅传递单个子项

javascript - 每个帐户的新子域,Firebase/React

javascript - 如何在表单标签内添加点击事件

typescript - 如何为自定义 chai 断言添加 typehint?