现在我不明白为什么用useSelector
得到的数据值要用useEffect
来监控,而用useState
来呈现一个闭环的页面.
以下是我的代码:
const data = useSelector((state: DeviceList) => {
if (state.basicSetting !== null) {
return state.basicSetting.filter(
item =>
item.deviceName.includes('ac') &&
!item.deviceName.includes('bz'),
);
} else {
return null;
}
});
const [list, setList] = useState<DeviceDataOne[][]>([]);
useEffect(() => {
if (data !== null) {
let arr = [];
for (var i = 0; i < (data as DeviceDataOne[]).length; i += 4) {
arr.push((data as DeviceDataOne[]).slice(i, i + 4));
}
setList(JSON.parse(JSON.stringify(arr)));
} else {
setList([]);
}
}, [data]);
useEffect(() => {
console.log('list', list);
}, [list]);
useEffect(() => {
console.log('data', data);
}, [data]);
我对useEffect
监控的理解应该是,当data
被更改时,他会重新执行useEffect
中的代码.然而,我实际上发现这样的写作会导致无限的重新渲染.因此,我不明白为什么会有一个无休止的循环.
我试图注释中间的代码段
useEffect(() => {
if (data !== null) {
let arr = [];
for (var i = 0; i < (data as DeviceDataOne[]).length; i += 4) {
arr.push((data as DeviceDataOne[]).slice(i, i + 4));
}
setList(JSON.parse(JSON.stringify(arr)));
} else {
setList([]);
}
}, [data]);
但我不明白为什么我不能这样写,也不明白是什么导致了这样的问题.