当前位置: 首页 > 面试题库 >

在useEffect第二参数中使用对象,而不必将其字符串化为JSON

养聪
2023-03-14
问题内容

在JS中,两个对象不相等。

const a = {}, b = {};
console.log(a === b);

所以我不能使用useEffect(React hooks)中的对象作为第二个参数,因为它始终被视为false(因此它将重新呈现):

function MyComponent() {
  // ...
  useEffect(() => {
    // do something
  }, [myObject]) // <- this is the object that can change.
}

这样做(上面的代码), 每次 重新渲染组件时都会产生运行效果,因为 每次 都认为对象不相等。

我可以通过将对象作为JSON字符串化值传递来“破解”,但是IMO有点脏:

function MyComponent() {
  // ...
  useEffect(() => {
    // do something
  }, [JSON.stringify(myObject)]) // <- yuck

有没有更好的方法可以做到这一点并避免不必要的效果调用?

注意:对象具有嵌套属性。 效果必须在此对象内的所有更改上运行。


问题答案:

您可以创建一个自定义钩子,该钩子跟踪a中的先前依赖项数组,ref并与对象(例如Lodash)进行比较,isEqual并且仅在它们不相等时才运行提供的函数。

const { useState, useEffect, useRef } = React;

const { isEqual } = _;



function useDeepEffect(fn, deps) {

  const isFirst = useRef(true);

  const prevDeps = useRef(deps);



  useEffect(() => {

    const isSame = prevDeps.current.every((obj, index) =>

      isEqual(obj, deps[index])

    );



    if (isFirst.current || !isSame) {

      fn();

    }



    isFirst.current = false;

    prevDeps.current = deps;

  }, deps);

}



function App() {

  const [state, setState] = useState({ foo: "foo" });



  useEffect(() => {

    setTimeout(() => setState({ foo: "foo" }), 1000);

    setTimeout(() => setState({ foo: "bar" }), 2000);

  }, []);



  useDeepEffect(() => {

    console.log("State changed!");

  }, [state]);



  return <div>{JSON.stringify(state)}</div>;

}



ReactDOM.render(<App />, document.getElementById("root"));


<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

<script src="https://unpkg.com/react@16/umd/react.development.js"></script>

<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>



<div id="root"></div>


 类似资料:
  • 通常,当您要将对象序列化为JSON字符串时,会执行以下操作: 我想知道是否可以将对象直接序列化为而不是字符串?即类似这样的东西(伪代码): 我知道我可以先将对象序列化为String,然后将其反序列化为

  • 我知道很多人问过相关的问题,但请帮我解决。我试图复制一个我在网上找到的开源温度控制实验室。我想在树莓皮上运行它。这就是我一直遇到的错误: 生成它的代码如下所示: 我相信这段代码试图通过以下代码与另一个python文件通信: 我还不知道我周围的python代码,所以一个非常清晰的“虚拟类”解决方案的解释会很有帮助。谢谢伙计们。

  • 问题内容: 我有这个JavaScript原型: 然后创建一个新对象: 如果我做: 结果是: 但我需要将对象的类型包含在JSON字符串中,如下所示: 有没有使用框架之类的方法来执行此操作的快速方法?还是我需要在类中实现一个方法并手动执行? 问题答案: 编辑: 将字符串化 所有类的 “属性”。如果只想保留其中一些,则可以这样分别指定:

  • 我想对一个浮点数进行四舍五入,得到点后的两位数。但我收到了一个错误: float()参数必须是字符串或数字,而不是“NoneType” 在评级模型的评级字段中四舍五入是一个坏主意,因为平均_评级不会四舍五入

  • 所以我一直在努力完成这个任务,我必须写一个java代码来将两个二进制数相乘为一个字符串。我不知道如何将它们相乘并保存在单独的字符串中,这样我就可以在最后添加它们。有人能给我一些提示吗?我必须用给定的字符串做乘法,但不能将它们转换为整数。我知道如何在纸上做乘法,但不知道如何将其转换为代码。这是我目前为止的代码。

  • 问题内容: 我正在使用。我想转换为Json 。 没用 为什么? 问题答案: 试试这个: