【发布时间】:2020-01-22 22:39:49
【问题描述】:
由于某种原因,useMemo 钩子似乎在 useEffect 钩子之前执行,就在它的正上方。 我相信这是因为我收到了一个错误:
TypeError: 无法读取未定义的属性“时间戳”
此错误指向最后一个 useEffect 挂钩的依赖数组中的 datum.timestamp,并且每当 is_paused 从 false => true 更改时发生。
我看到的问题是 useMemo 钩子试图从一个空数组中获取一个项目,该数组应该由之前的 useEffect 设置。
我做了一些日志记录,确实,我在 useMemo 中看到了日志,但没有看到 useEffect。
const [position, setPosition] = useState(MAX_HISTORY - 1);
const [data, setData] = useState<ExData[]>(new Array(MAX_HISTORY).fill({ content: {} }));
const paused_data_ref = useRef<ExData[]>([]);
useEffect(() => {
const listener = (d: ExData) => {
const new_data = data.slice(1);
new_data.push(d);
setData(new_data);
};
addListener(props.event_key, listener);
return () => {
removeListener(props.event_key);
};
});
useEffect(() => {
paused_data_ref.current = is_paused ? [...data] : [];
if (is_paused) {
console.log('copy data array');
}
}, [is_paused, data]);
const datum = useMemo(() => {
if (is_paused)
console.log({
position,
data: paused_data_ref.current[position],
arr: paused_data_ref.current
});
return is_paused ? paused_data_ref.current[position] : data[MAX_HISTORY - 1];
}, [is_paused, position, data]);
useEffect(() => {...}, [datum.timestamp])
【问题讨论】:
标签: reactjs typescript react-hooks