- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
当我从套接字获得新的转储时,我需要替换我的可观察对象中的数据:
class Store {
@observable data = { foo: 'bar' }
replaceFromDump(newData) {
this.data = newData
}
}
const store = new Store()
store.replaceFromDump({ foo: 'bar' })
// { foo: 'bar' } can be a huge amount of JSON
但是,我注意到当数据对象扩展时性能会受到影响,这可能是因为即使某些属性/值相同,MobX 也会在任何地方触发 react 。
有没有更“聪明”的方法? - 我认为 f.ex 只替换对象受影响的部分会比替换整个可观察对象更好?
我在这里做了一个小演示来解释我的意思: https://jsfiddle.net/yqqxokme/
。替换对象会引起新的 react ,即使数据完全相同(预期)。但我确信有一种方法可以只改变数据对象的受影响部分,就像在 merge()
中一样。功能。
最佳答案
所以这里有一些事情和案例。我已将转储功能更改为以下以模拟更改
variations = [
{foo: 'bar'},
{foo: 'bar'},
{foo: 'bar2' },
{foo: 'bar2' },
{foo: 'bar2', bar: {name: "zoo"} },
{foo: 'bar2', bar: {name: "zoo"} },
{foo: 'bar2', bar: {name: "zoo2"} },
{foo: 'bar2', bar: {name: "zoo2"} },
{foo: 'barnew', bar: {name: "zoo2", new: "yes"} },
{foo: 'barnew', bar: {name: "zoo2", new: "no"} },
{foo: 'barnew', bar: {name: "zoo2", new: "no"} }
]
i=0;
dump = () => {
i++;
i = i%variations.length;
console.log("Changing data to ", variations[i]);
store.replaceFromDump(variations[i])
}
使用 extendObservable
现在如果你使用下面的代码
replaceFromDump(newData) {
extendObservable(this.data, newData)
}
并通过转储循环运行它,输出如下
bar
的事件不会开始引发,直到您对 foo
进行更改,这发生在下面的更改中
{foo: 'barnew', bar: {name: "zoo2", new: "yes"} },
结果:新的key只能被observed existing observable keys change
使用 map
这里我们修改如下代码
@observable data = map({
foo: 'bar'
})
replaceFromDump(newData) {
this.data.merge(newData)
}
结果:数据仅合并,不会被删除。您还将获得重复事件,因为它是仅合并选项
使用对象差异
你可以使用像下面这样的对象差异库
https://github.com/flitbit/diff
您可以像下面这样更新代码
@observable data = {
foo: 'bar'
}
replaceFromDump(newData) {
if (diff(mobx.toJSON(this.data), newData)){
this.data = newData;
}
}
结果:事件仅在数据更改时发生,而不是在重新分配给同一对象时发生
使用差异和应用差异
使用我们之前提供的相同库,我们可以只应用需要的更改
如果我们像下面这样修改代码
replaceFromDump(newData) {
observableDiff(toJSON(this.data), newData, d => {
applyChange(this.data, newData, d);
})
}
如果运行上面的代码,我们得到以下输出
结果:仅观察到初始键集的更改,前提是您不要删除中间键中的那些
它还为您提供以下格式的差异
{"kind":"E","path":["foo"],"lhs":"bar2","rhs":"barnew"}
{"kind":"N","path":["bar","new"],"rhs":"yes"}
这意味着您可以根据需要更好地控制基于字段名称的事物
下面是我使用的 fiddle ,大部分代码都有注释,但如果您需要查看下面的导入,请使用
关于javascript - 替换可观察数据时的 MobX 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50000464/
我正在使用带有 mobx 的 react js 并从 api 获取数据。 我得到的数据是对象数组。 当我将数据设置为 mobx 变量时,我会看到代理对象数组(不确定代理说什么)。我只是想将从 api
我正在使用 mobx/react 构建两个小部件,其中所有逻辑都位于商店内。两者共享大部分设计规则,因此它们的商店有 95% 相同。 有没有聪明的方法来处理这种情况? 例如,是否可以创建这样的继承?
我正在学习 lynda.com 类(class),这是我拥有的代码 import firebase from 'firebase' import MobxFirebaseStore from 'mob
我的异步操作看起来像这样: anAsyncAction: process(function* anAsyncAction() { self.isLoading = true; cons
为什么我应该使用 MobX 状态树而不是普通 MobX?似乎每次我读到 MobX 时,都会在同一个地方提到 MST。有人实际上只是单独使用 MobX 吗? 这个问题可能太笼统了...... 最佳答案
我为我的 typescript 服务器 API 定义了接口(interface),当通过 MobX 状态树定义模型时,我想确保 typescript 编译器强制模型快照符合这些接口(interface
我有多个 mobx 商店,发现自己在每个商店中都有几乎相同的操作。因此,我希望能够在商店之间推广和重用它们。下面我尝试分解创建操作,希望能够将其导入多个商店,但它不起作用,因为 self 不可用。 我
我已经查看了 mobx-state-tree 文档甚至测试文件 https://github.com/mobxjs/mobx-state-tree/blob/master/packages/mobx-
我有一个 Mobx 状态树模型已经长得太长了,我想将它拆分到多个 javascript 文件中。 下面是部分代码的演示: ///file1.js import { types } from "mob
我正在尝试了解 mobx 中 Action 装饰器的有用性,即使在阅读了文档 https://mobx.js.org/refguide/action.html 后也是如此。 仍然想知道为什么我应该使用
假设结构如下 stores/ RouterStore.js UserStore.js index.js 每个 ...Store.js 文件都是一个包含 @observable 和 @act
在我看来,人们正在交替使用 model 和 props。我试图找到有关 Prop 的文件但失败了。谁能告诉我区别? 最佳答案 model 方法创建一个新模型。它需要两个参数: 姓名 属性(可选) 您可
class FilterCriteria { @observable filter = new Map(); } let criteria = new FilterCriteria (); /
我开始学习 mobx,我不明白为什么 mobx 发明了“ Action ”实体。将所有更改批处理到 setImmediate 中的下一个刻度会更容易吗?这将自动使所有同步状态更改以与@action 现
如何从 MobX 访问组件引用,下面的示例,在 componentDidMount 之后运行 'doSomething' 乐趣,我得到了一个非函数错误, 我想弄清楚如何在 MobX 中访问 ref。
我有一篇文章是一个 mobx-state-tree 对象,我正在 React 应用程序中使用它。 这是我树中的一个 Action setId(id: string) { self.id = id
我有一篇文章是一个 mobx-state-tree 对象,我正在 React 应用程序中使用它。 这是我树中的一个 Action setId(id: string) { self.id = id
我开始将我的商店连接到 mobx。我想知道使用 observer(['store'],...) 或使用 inject('store')(observer(...)) 我认为注入(inject)不是 r
我有 Angular 应用程序 v6,我正在使用最新版本的 mobx 和 mobx-angular(您可以在依赖项中看到)。我来自 ngrx、ngxs 背景,所以很难理解 mobx 流程,因为它或多或
我是 mobx 的新手,我想对 Mobx 进行快速测试,看看我如何才能将它应用到我的项目中。 当我运行这段代码时 class Entity{ @observable version = 1; }
我是一名优秀的程序员,十分优秀!