useEffect的第二个参数传入空数组时会产生编译警告

来源:3-9 useEffect 第三部分 - 控制运行

Amormo

2021-04-07

如题,我按照视频中的方法使用Effect Hook,在设定第二个参数为空数组时,ESlint产生了如下编译警告:

Line 59:5:  React Hook useEffect has a missing dependency: 'position.x'. Either include it or remove the dependency array  react-hooks/exhaustive-deps

虽然产生了警告,但还是达到了视频中的效果。请问它是怎么产生的?如何解决?
附组件代码:

import React, { useState, useEffect } from "react";

const MouseTracker: React.FC = () => {
	const [position, setPos] = useState({ x: 0, y: 0 });

	// 组件1的作法显然矫枉过正:我们不需要在每次组件更新时都创建新的订阅,
	// 而是在某个数据源(source prop) 改变时重新创建
	useEffect(() => {
		console.log("A: add effect 添加订阅源", position.x);

		const setMousePos = (e: MouseEvent) => {
			console.log("B: subscribe inner 订阅源事件触发");
			setPos({ x: e.clientX, y: e.clientY });
		};

		document.addEventListener("click", setMousePos);

		return () => {
			console.log("C: remove effect 移除订阅源", position.x);
			document.removeEventListener("click", setMousePos);
		};
		// useEffect的第二个参数是effect所依赖的值数组, 该数组中的数据没更新, 该effect就不会被执行;
        // 这里是空数组, 则该effect只运行一次(仅在组件挂载和卸载时执行)
	}, []);

	console.log("D: before render 组件即将渲染", position.x);

	return (
		<React.Fragment>
			<p>
				X: {position.x}, Y:{position.y}
			</p>
		</React.Fragment>
	);
};

export default MouseTracker;
写回答

1回答

张轩

2021-04-08

同学你好 可以参考一下 这个问题的答案:http://coding.imooc.com/learn/questiondetail/178906.html 是一个问题

0
0

React18+TS高仿AntD从零到一打造组件库

设计,开发,测试,发布再到 CI/CD,从0到1造轮子

2124 学习 · 959 问题

查看课程