-
Notifications
You must be signed in to change notification settings - Fork 15
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
关于在mobx中如何observe观察深层的数据变动 #97
Comments
@ckinmind Hi, 我搜索mobx深层变动时无意中看到你这里。首先谢谢你的这些链接,我顺着搜索到很多有用的信息。 1.我认为你上面所说的情况应该是正确的,比如第一种情况
打印的object只是引用:当你在console里面看(读取)这个object,虽然是先打印出来的,但其实它只是个引用,指向的是被改动了的object,所以你看到的是新的name,这其实和mobx没关系,而是因为js里面object是ref(引用) 2.而我在Mobx深层数据变动遇到的问题是添加新的attribute进object,这个新的attribute却不被观察,比如 @observable treeData = {}
@action addNewAttr () {
this.treeData['name'] = 'new added'
}
我的react component却没有因为这个addNewAttr的action触发任何的render事件...也就是说这一行为并没有被观察 最后我用了 map 这个数据结构 https://mobx.js.org/refguide/map.html , 这是我其中一个store import { observable, action, map } from 'mobx';
import catalogAPI from '../api/catalog';
class Store {
@observable data = map({}) // {catalogId: catalogObject}
@action findById(id) {
return catalogAPI.findById(id).then(catalog => {
// 使用merge添加新的数据,会触发react里面的render
this.data.merge({ [catalog.id]: catalog });
return catalog;
})
}
}
export default new Store(); 3.最后还有个问题,我看到你store export出去的都是个store class,而我的store都是export 这个store的instance出去,我的目的在于,这样在我的SPA里面,我的store状态就都是共享的了。虽然之前看别人文档也大多数export 这个store class出去,但我现在用下来还是觉得export store的instance比较适合SPA,我也是第一次尝试mobx,不知道你有没有什么想法在这方面? |
@wwayne 你好,首先很抱歉,其实我很早就看到了你的回复,因为之前太忙,加上有些问题我自己还没有思考清楚,所以没有及时回复,现在乘着清明节放假,我谈一些我的思考
@observer
class Test extends Component {
data = []; // data内存储的是嵌套很深的数据
@observable updateKey = ''; //定义一个用于触发更新的变量
/** 视图触发器,里面什么也不用做 */
@action renderTrigger = () => {
};
@action changeData = () => {
// 异步或者别的什么操作,改变了data
this.updateKey = Math.random(); // 随机改变updateKey的值,只要和之前不一样就行
// 因为这里改变了,所以触发了renderTrigger的依赖变动(即使里面什么也不做),
// 从而触发了视图更新, 从而将改变都反应到视图中
};
render(){
this.renderTrigger(this.updateKey); // 这里必须传入updateKey,效果类似autorun
return (
.......
)
}
}
希望我的回复能对你有价值 |
@ckinmind 感谢 :) |
上面的讨论很实用。 updateKey 这种方式曾在项目中实践过,但控制更新的视图范围更大,如果 observe 所有 data 的话,如果视图更零散,控制更新的视图会更精细。 |
非常棒的讨论,感谢! |
问下现在有更好的解决方案了吗 |
@leeseean 过了这么久了,还是觉得updateKey这总方式最好 |
学习了,感谢! |
发现这种方式可以触发更新 import { observable, action } from 'mobx'
class FetchLoadingStore {
@observable loading = {}
@action setLoading(key, status) {
this.loading = Object.assign({}, this.loading, { [key]: status })
}
}
const fetchLoadingStore = new FetchLoadingStore()
export { fetchLoadingStore } |
@ckinmind ,学习了,我封装了一下
在数据结构处:
在组件里:
讨论已经过去两年多,不知道有没有更好的办法。 |
每次更新用lodash的cloneDeep重新赋值 |
@linshuizhaoying 可以考虑对于复杂的数据结构,用更新另外一个observable变量的方式触发更新的方式来降低复杂度,代码可能会更加简单清爽 |
背景:
打印的结果以及顺序如下:
The text was updated successfully, but these errors were encountered: