【发布时间】:2020-02-28 14:14:08
【问题描述】:
我想制作一个自定义钩子,它会跳过第一个 useEffect 渲染并在任何地方重用它。
我做了一个自定义钩子的工作示例:
function useEffectSkipFirst(fn, arr) {
const isFirstRun = useRef(true);
useEffect(() => {
if (isFirstRun.current) {
isFirstRun.current = false;
return;
}
fn();
}, [...arr]);
}
使用方法:
useEffectSkipFirst(fn, []);
问题是我收到了一些我试图理解的警告,希望你能帮助我:
React Hook useEffect 缺少依赖项:'fn'。要么包括它 或删除依赖数组。如果 'fn' 变化太频繁,找到 定义它的父组件并将该定义包装在 使用回调。 (react-hooks/exhaustive-deps) eslint
React Hook useEffect 在其依赖数组中有一个展开元素。 这意味着我们无法静态验证您是否通过了 正确的依赖关系。 (react-hooks/exhaustive-deps)
完整示例代码:
import React, { useRef, useEffect, useState } from "react";
import ReactDOM from "react-dom";
function useEffectSkipFirst(fn, arr) {
const isFirstRun = useRef(true);
useEffect(() => {
if (isFirstRun.current) {
isFirstRun.current = false;
return;
}
fn();
}, [...arr]);
}
function App() {
const [clicks, setClicks] = useState(0);
const [date, setDate] = useState(Date.now());
const [useEffectRunTimes, setTseEffectRunTimes] = useState(0);
useEffectSkipFirst(() => {
addEffectRunTimes();
}, [clicks, date]);
function addEffectRunTimes() {
setTseEffectRunTimes(useEffectRunTimes + 1);
}
return (
<div className="App">
<div>clicks: {clicks}</div>
<div>date: {new Date(date).toString()}</div>
<div>useEffectRunTimes: {useEffectRunTimes}</div>
<button onClick={() => setClicks(clicks + 1)}>add clicks</button>
<button onClick={() => setDate(Date.now())}>update date</button>
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
【问题讨论】:
标签: reactjs react-hooks