点击按钮后页面卡死
import './App.css';
import React, { useState, useEffect } from "react";
const Demo = ({ value = [] }) => {
const [state, setState] = useState();
useEffect(() => {
console.log("value", value);
setState((value || []).filter((item) => item !== ""));
}, [value]);
return <div>list:{state}</div>;
};
export default function App() {
const [list, setList] = useState(["1", "2"]);
return (
<div className="App">
<Demo value={list} />
<h1 onClick={() => setList([...list, "a"])}>Add List</h1>
<h1 onClick={() => setList(undefined)}>Clear List</h1>
</div>
);
}
没有报错日志
setState 方法耗时较长
二分法屏蔽问题代码并大致定位范围为 Demo 组件引起
第 7 行加 log 发现,Value 入参传为 undefined 时会循环打印 log
const Demo = ({ value = [] }) => {
useEffect(() => {
console.log("value", value);
setState((value || []).filter((item) => item !== ""));
}, [value]);
使用 useEffect 监听的入参尽量不给默认值,并且处理好入参的各种边界情况
简单的入参处理尽量省略,可以直接使用入参做视图展示,比如:
return <div>list:{value?.length > 0 && value.filter(Boolean)}</div>;