有大佬使用过 Mobx 吗?

2020-04-17 15:58:36 +08:00
 LiuJiang
需求是针对被观察的变量和普通变量,实现自动监听,只要该变量发生值的变化,自动存储到缓存,目前是这样实现的,但是拿不到需要的数据,控制台打印出来的数据和实际拿到的数据不一致,苦于没有实现思路,所以想请教下大佬如何实现一个自动持久化存储的 storage.js ?

Mobx Version:5.13.1

storage.sync.observable = action(function (object, attr, key) {
console.warn('`storage.sync.observable` is deprecated, use `storage.sync` instead');
const value = storage.getItem(key);

console.log(111, object, attr, key);

if (!(Object.prototype.toString.call(value) == '[object Null]' || Object.prototype.toString.call(value) == '[object Undefined]')) object[attr] = value;

autorun(() => {
console.log(222, object, attr, key);
storage.setItem(key, object[attr])
});
});
1590 次点击
所在节点    程序员
4 条回复
Yumwey
2020-04-17 16:07:38 +08:00
一年没用都到 5 了, 你可以用 compute 啊,而且 也有 reaction,observe 等,autorun 要值派生了吧。 大概记忆,你可以看看文档。
beilo
2020-04-17 16:33:06 +08:00
如果想自动保存 observable 数据的话我是这么做的
```
import { observable, action, autorun, toJS, set } from "mobx";

function autoSave(store, save) {
let firstRun = true;
autorun(() => {
// 此代码将在每次运行任何可观察属性时运行
// 对 store 进行更新。
const json = JSON.stringify(toJS(store));
if (!firstRun) {
save(json);
}
firstRun = false;
});
}
class RouteState {
@observable state = {};
constructor() {
this.load();
autoSave(this, this.save.bind(this));
}
load() {
const storeTemp = sessionStorage.getItem("route_state");
if (storeTemp) {
const data = JSON.parse(storeTemp);
set(this, data);
}
}
save(json) {
sessionStorage.setItem("route_state", json);
}
@action.bound
actionState(_state) {
this.state = _state;
}
}

```
[可以参考下这个博客]( https://www.cnblogs.com/beilo/p/10996385.html)
[参考链接 1]( https://stackoverflow.com/questions/40292677/how-to-save-mobx-state-in-sessionstorage)
beilo
2020-04-17 16:33:50 +08:00
...话说我怎么用 md 语法
LiuJiang
2020-04-17 18:19:40 +08:00
@beilo 这种方法有个弊端,没法灵活配置,我上面这种方法可以适应灵活针对某个变量进行存储。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/663479

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX