Reactjs如何使用useEffect来处理useState的很多变化
Reactjs how to use useEffect to handle many changes to useState
我的应用程序中有很多 useState
。我正在使用 useEffect
向我的减速器发送一个动作。为了效率和可读性,我想将所有状态更改放在一个 useEffect
中,而不是对 useState
的每个更改使用单个 useEffect
。它似乎并没有像我想象的那样工作。使它起作用的正确语法是什么
const [nameFirst, setNameFirst] = useState('');
const [nameLast, setNameLast] = useState('');
const [nameEmail, setNameEmail] = useState('');
const [namePhone, setNamePhone] = useState('');
useEffect(() => {
if (nameFirst) {
dispatch({ type: "NAME_FIRST", nameFirst: nameFirst });
} else if (nameLast) {
dispatch({ type: "NAME_LAST", nameLast: nameLast });
} else if (nameEmail) {
dispatch({type: "NAME_EMAIL", nameEmail: nameEmail});
} else if (namePhone) {
dispatch({type: "NAME_PHONE", namePhone: namePhone});
}
}, [nameFirst, nameLast, nameEmail, namePhone]);
我想避免的是...
useEffect(() => {
dispatch({ type: "NAME_FIRST", nameFirst: nameFirst });
}, [nameFirst]);
useEffect(() => {
dispatch({ type: "NAME_LAST", nameLast: nameLast });
}, [nameLast]);
useEffect(() => {
dispatch({type: "NAME_EMAIL", nameEmail: nameEmail});
}, [nameEmail]);
useEffect(() => {
dispatch({type: "NAME_PHONE", namePhone: namePhone});
}, [namePhone]);
因为看起来不是很干
第一种方法使用 else if
所以这意味着你只更新其中一个;也许你想更新不止一个?
不过,我其实更喜欢第二种方法;更容易阅读每个 useEffect 应该做什么
最后,您是否考虑过使用 redux hook useSelector
而不是 useState
?
除非你在更新状态时做一些额外的事情 useSelector
应该是你的最佳选择
您想在其中一个效果的依赖性发生变化时触发 useEffect。不是别人。最简单的方法是使用多个 useEffects。但是 if
和 else if
不正确并且不会起作用。
我想你想要这个,实际上正确的问题是:
React useEffect Fire Hook when only one of the effect's deps changes, but not the others
一些解决方案:
一个解决方案是将 prevState 与 nextState 进行比较,如果有变化,则启动它!
这段代码怎么样?
const [data, setData] = useState({
nameFirst: "",
nameLast: "",
nameEmail: "",
namePhone: "",
});
useEffect(() => {
setData(() => {
data.nameFirst && dispatch({ type: "NAME_FIRST", nameFirst: nameFirst });
data.nameLast && dispatch({ type: "NAME_LAST", nameLast: nameLast });
data.nameEmail && dispatch({type: "NAME_EMAIL", nameEmail: nameEmail};
data.namePhone && dispatch({type: "NAME_PHONE", namePhone: namePhone});
return data;
})
}, [data]);
我的应用程序中有很多 useState
。我正在使用 useEffect
向我的减速器发送一个动作。为了效率和可读性,我想将所有状态更改放在一个 useEffect
中,而不是对 useState
的每个更改使用单个 useEffect
。它似乎并没有像我想象的那样工作。使它起作用的正确语法是什么
const [nameFirst, setNameFirst] = useState('');
const [nameLast, setNameLast] = useState('');
const [nameEmail, setNameEmail] = useState('');
const [namePhone, setNamePhone] = useState('');
useEffect(() => {
if (nameFirst) {
dispatch({ type: "NAME_FIRST", nameFirst: nameFirst });
} else if (nameLast) {
dispatch({ type: "NAME_LAST", nameLast: nameLast });
} else if (nameEmail) {
dispatch({type: "NAME_EMAIL", nameEmail: nameEmail});
} else if (namePhone) {
dispatch({type: "NAME_PHONE", namePhone: namePhone});
}
}, [nameFirst, nameLast, nameEmail, namePhone]);
我想避免的是...
useEffect(() => {
dispatch({ type: "NAME_FIRST", nameFirst: nameFirst });
}, [nameFirst]);
useEffect(() => {
dispatch({ type: "NAME_LAST", nameLast: nameLast });
}, [nameLast]);
useEffect(() => {
dispatch({type: "NAME_EMAIL", nameEmail: nameEmail});
}, [nameEmail]);
useEffect(() => {
dispatch({type: "NAME_PHONE", namePhone: namePhone});
}, [namePhone]);
因为看起来不是很干
第一种方法使用 else if
所以这意味着你只更新其中一个;也许你想更新不止一个?
不过,我其实更喜欢第二种方法;更容易阅读每个 useEffect 应该做什么
最后,您是否考虑过使用 redux hook useSelector
而不是 useState
?
除非你在更新状态时做一些额外的事情 useSelector
应该是你的最佳选择
您想在其中一个效果的依赖性发生变化时触发 useEffect。不是别人。最简单的方法是使用多个 useEffects。但是 if
和 else if
不正确并且不会起作用。
我想你想要这个,实际上正确的问题是:
React useEffect Fire Hook when only one of the effect's deps changes, but not the others
一些解决方案:
一个解决方案是将 prevState 与 nextState 进行比较,如果有变化,则启动它!
这段代码怎么样?
const [data, setData] = useState({
nameFirst: "",
nameLast: "",
nameEmail: "",
namePhone: "",
});
useEffect(() => {
setData(() => {
data.nameFirst && dispatch({ type: "NAME_FIRST", nameFirst: nameFirst });
data.nameLast && dispatch({ type: "NAME_LAST", nameLast: nameLast });
data.nameEmail && dispatch({type: "NAME_EMAIL", nameEmail: nameEmail};
data.namePhone && dispatch({type: "NAME_PHONE", namePhone: namePhone});
return data;
})
}, [data]);