【问题标题】:React + MobX - not re-rendering update to stateReact + MobX - 不重新渲染状态更新
【发布时间】:2016-11-04 23:43:41
【问题描述】:

我设置了一个新的示例/样板项目,用于测试使用 Meteor 和 React 和 MobX(使用 Mantra 架构)。该项目在https://github.com/markoshust/mantra-matui-mobx

我遇到了一个问题,即 State.header.title 属性的状态更改未正确反映重新渲染时更新的状态更改。

我的状态是通过拉入简单的对象来构建的: https://github.com/markoshust/mantra-matui-mobx/blob/master/client/modules/core/stores/route.js

进入一个主可观察对象: https://github.com/markoshust/mantra-matui-mobx/blob/master/client/main.js#L8

我正在列出路线更改并调用操作来更新状态: https://github.com/markoshust/mantra-matui-mobx/blob/master/client/modules/core/reactions/route.js#L10

此操作更新状态: https://github.com/markoshust/mantra-matui-mobx/blob/master/client/modules/core/actions/route.js#L5

控制台正在注销正确的状态更改,因此状态正在正确更新。但是,组件没有以更新的状态重新渲染(这一行是 console.log'ing old state val): https://github.com/markoshust/mantra-matui-mobx/blob/master/client/modules/core/containers/Header.js#L6

我看到“正在更新...”消息,因此该组件正在重新渲染,但它似乎仍处于旧状态。我确实将observer 添加到我的所有反应组件中: https://github.com/markoshust/mantra-matui-mobx/blob/master/client/modules/core/components/Header.js

【问题讨论】:

  • 我似乎已经用自定义的 withMobx 作曲家解决了这个问题,它唯一要做的就是等待下一个滴答声来渲染组件。知道为什么这会解决它吗? Mobx 应该是同步的。 github.com/markoshust/mantra-matui-mobx/blob/master/client/…
  • 我认为State.header 是可观察的,但不是State.header.title
  • 试过了,没有变化
  • 你能告诉我你是如何尝试的代码吗?可能有一些错误。
  • 您可以查看回购代码和历史记录。我确实将子存储转换为可观察对象,但这更像是一个架构决策,而不是一个需要的决策。根本问题是由于 mobx 的自动更新过程,没有什么可以告诉作曲家重新运行。

标签: meteor reactjs reactive-programming observable mobx


【解决方案1】:

我需要为 MobX 创建一个自定义作曲家。我添加了一个监听 autorun 来重新组合组件。

https://github.com/markoshust/mantra-matui-mobx/blob/master/client/modules/core/libs/with_mobx.js

import { compose } from 'mantra-core';
import { autorun } from 'mobx';

export default function composeWithMobx(fn, L, E, options) {
  const onPropsChange = (props, onData) => {
    const reactiveFn = () => fn(props, onData);
    autorun(reactiveFn);
    return reactiveFn();
  };
  return compose(onPropsChange, L, E, options);
}

【讨论】:

  • 嗨,马克,我刚到荷兰。我看到原始链接中的某些链接已损坏。如果您可以提供原始提交的链接,我很乐意查看原始解决方案以调查为什么它没有按预期工作
  • 嗨@mweststrate,谢谢,更新了链接!自从我发布以来,改变了一些事情。现在一切正常,但只能使用 composeWithRedux 作曲家(包括 autorun() 调用)。我应该不需要自动运行才能让它工作吗?
  • 我认为没有自动运行应该没问题。请注意,最好在处置组件时调用返回的处置器。
  • 谢谢,我更新了答案,所以它返回了处理器/自动运行。我相信这很好。
  • 已更新以正确返回处理器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 2020-09-05
  • 2022-01-26
  • 1970-01-01
相关资源
最近更新 更多