在 JS 中,两个对象不相等。
const a = {}, b = {};
console.log(a === b);
Run Code Online (Sandbox Code Playgroud)
所以我不能在useEffect(React hooks)中使用一个对象作为第二个参数,因为它总是被认为是假的(所以它会重新渲染):
const a = {}, b = {};
console.log(a === b);
Run Code Online (Sandbox Code Playgroud)
这样做(上面的代码),每次组件重新渲染时都会产生运行效果,因为每次都认为对象不相等。
我可以通过将对象作为 JSON 字符串化值传递来“破解”它,但这有点脏 IMO:
function MyComponent() {
// ...
useEffect(() => {
// do something
}, [myObject]) // <- this is the object that can change.
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做到这一点并避免不必要的效果调用?
旁注:对象具有嵌套属性。效果必须在此对象内的每个更改上运行。
我正在使用react useEffect挂钩并检查对象是否已更改,然后才再次运行挂钩。
我的代码如下所示。
const useExample = (apiOptions) => {
const [data, updateData] = useState([]);
useEffect(() => {
const [data, updateData] = useState<any>([]);
doSomethingCool(apiOptions).then(res => {
updateData(response.data);
})
}, [apiOptions]);
return {
data
};
};
Run Code Online (Sandbox Code Playgroud)
不幸的是,由于对象未被识别为相同对象,因此它一直在运行。
我相信以下是一个示例。
const useExample = (apiOptions) => {
const [data, updateData] = useState([]);
useEffect(() => {
const [data, updateData] = useState<any>([]);
doSomethingCool(apiOptions).then(res => {
updateData(response.data);
})
}, [apiOptions]);
return {
data
};
};
Run Code Online (Sandbox Code Playgroud)
也许运行的JSON.stringify(apiOptions)作品?