【发布时间】:2020-05-21 06:57:59
【问题描述】:
刚开始使用 React 函数钩子。我正在研究一个案例,您有一个传递数组的父函数和一个依赖于数组内容的子函数。
App.js(父级)->
import React, {useEffect} from 'react';
import ChartWrapper from './StaticChart/ChartWrapper';
import './App.css';
function App() {
let data = [];
function newVal() {
let obj = null;
let val = Math.floor(Math.random() * 10);
let timeNow = Date.now();
obj = {'time': timeNow, 'value': val};
data.push(obj);
// console.log(obj);
}
useEffect(
() => {
setInterval(() => {newVal();}, 500);
}, []
);
return (
<div className="App">
<ChartWrapper data={data} />
</div>
);
}
export default App;
ChartWrapper.js(子)->
import React, {useRef, useEffect} from 'react';
export default function ChartWrapper(props) {
const svgRef = useRef();
const navRef = useRef();
useEffect(
() => {
console.log('function called');
}, [props.data]
);
return (
<div>
<svg ref = {svgRef} width = {700} height = {400}></svg>
<svg ref = {navRef} width = {700} height = {75}></svg>
</div>
);
}
所以每次 App.js 在数组中添加一个新对象时,都会调用 ChartWrapper。目前,在 ChartWrapper 函数中,我有 useEffect 应该监听 props.data 数组的变化并被执行,但它不起作用。该函数被调用的唯一时间是最初在组件呈现时。
我做错了什么?
【问题讨论】:
-
Javascript 通过引用传递数组。即使你将一个新值推到它上面,它仍然是同一个数组。 useEffect 不进行深度比较(即不比较数组的内容)。
-
如果不将 props.data 传递给您的 useEffect 依赖数组,请尝试传递
[JSON.stringify(props.data)]并查看它是否按您想要的方式工作。顺便说一句,这可能不是一个很好的解决方案,只是说明正在发生的事情的一种方式。 -
您可以尝试将数组复制到一个新数组中,而不是对其进行变异吗?即用
data = [...data, obj]替换data.push(obj) -
@ChristianFosli 这可能会导致
useEffect在每次渲染时重新运行,因为数组总是不同的。 -
我们只是每 500 毫秒更改一次
data,对吧?我想我们希望useEffect在每次data更改时运行。
标签: javascript reactjs