javascript - React 自定义 Hook 不触发 DOM 更新

标签 javascript reactjs rxjs react-hooks

这是一个重现我的问题的沙箱:

https://codesandbox.io/s/ymmyr3o70x?expanddevtools=1&fontsize=14&hidenavigation=1

出于我无法理解的原因,当我通过表单添加产品时,产品列表仅更新一次,然后就不会再更新。

我使用自定义 Hook (useObservable) 与 RxJS 结合来管理状态。如果您检查控制台日志,ReplaySubject 确实会发出预期值。但是 useObservable 钩子(Hook)没有触发 DOM 更新。

我错过了什么?

最佳答案

问题在于您的 addProduct 函数会改变旧状态,而不是创建新状态。是的,您让 observable 再次发出状态,但由于它与之前是同一对象,因此调用 setValue 没有效果,因此 React 不会重新渲染。

解决这个问题的方法是使状态不可变。例如:

import { ReplaySubject } from "rxjs";

let products = {};

export const products$ = new ReplaySubject(1);

export const addProduct = product => {
  products = {...products, [product]: product};
  products$.next(products);
};

关于javascript - React 自定义 Hook 不触发 DOM 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54960439/

相关文章:

javascript - 将 javascript 代码(例如一个函数,而不是一个完整的文件)发送到浏览器的最佳实践?

reactjs - ErrorBoundary 没有捕获导入函数抛出的错误

javascript - 完成后 n 秒重复请求(Angular2 - http.get)

javascript - 如何将多个 Prop 传递给 React.createElement 创建的元素?

javascript - 检查颜色是否为字符串 ('white' === color?//true, 'bright white gold' === color?//false)

javascript - 如何使用 Jasmine 在任何 Angular 应用程序中测试 RXJS 实用程序,如管道、跳过、点击、重试等

javascript - RxJS 5, Angular : How to do a request every x seconds UNTIL a message matches a certain string?

javascript - 如何将多个 Action 绑定(bind)到一个键盘事件

java - 从我的jsp表获取数据到我的spring Controller

javascript - setInterval 计时慢慢偏离保持准确