标签: mobx-react

如何将 Mobx 可观察对象转换为字符串

我正在使用 Mobx 来创建可观察状态。

这是我的代码片段:

window.sessionStorage.setItem(createKey(key), JSON.stringify(state))
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,“状态”对象是可观察的。当我尝试将其转换为字符串时,出现错误:

错误:无法读取未定义的属性“atom”

history reactjs react-router mobx mobx-react

2
推荐指数
1
解决办法
5919
查看次数

我可以将NativeBase与Mobx一起使用吗?

我和我的团队正在为下一个项目分析NativeBase框架http://nativebase.io/,我们唯一关心的是他们将Redux用于其示例应用程序,并且我们通常选择Mobx进行状态管理。所以我的问题是,可以将Mobx与NativeBase应用一起使用吗?

reactjs react-native react-redux native-base mobx-react

2
推荐指数
1
解决办法
192
查看次数

反应组分中的间谍方法

我的组件有一个方法..

onUpdateProperty = (key, value) => {
  this.state.formData[key] = value;
}
Run Code Online (Sandbox Code Playgroud)

我想测试是否在更改输入后调用此方法...

it('on update input should update formData', function () {
  const wrapper = mount(<MyComp.wrappedComponent {...this.minProps} />);
  const spy = spyOn(wrapper.instance(), 'onUpdateProperty');

  expect(spy).not.toHaveBeenCalled();

  const nameInput = wrapper.find('[name="name"]');
  nameInput.simulate('change', {
    target: { name: 'name', value: 'v1' },
  });

  wrapper.update();

  // expect(spy).toHaveBeenCalledWith('name', 'v1');
  expect(spy).toHaveBeenCalled();
});  
Run Code Online (Sandbox Code Playgroud)

wrappedComponent是因为我使用Mobx-react

reactjs jestjs enzyme mobx-react

2
推荐指数
1
解决办法
3549
查看次数

Mobx 可观察数组未更新

我正在使用 mobx 在 reactjs 中以下列方式声明一个可观察数组

@observable cacheditems

constructor() {
    this.cacheditems  =   []
Run Code Online (Sandbox Code Playgroud)

现在我在离线时从 pouch-db 中检索数据,如下所示:

var items = []
db.allDocs({include_docs: true}, function(err, docs) {
                docs.rows.map((obj, id) => {
                    items.push(obj.doc)
                })
            })


 this.cacheditems = items
Run Code Online (Sandbox Code Playgroud)

但是没有设置数据。当我尝试获取用于呈现空数组的数据时。

javascript reactjs mobx mobx-react

2
推荐指数
1
解决办法
6377
查看次数

未定义不是对象(评估'_react.PropTypes.object')

刚刚使用reac-native-init创建了一个新项目。使用

"react": "16.0.0",
"react-native": "0.51.0",
Run Code Online (Sandbox Code Playgroud)

从xcode运行项目我遇到以下错误

未处理的JS异常:模块AppRegistry不是注册的可调用模块(调用runApplication)

未定义不是对象(评估'_react.PropTypes.object')

在我的项目目录中搜索_react.PropTypes.object。它仅在mobx-react文件夹中使用。现在我的项目无法运行,它停留在启动屏幕上。任何帮助是极大的赞赏

编辑

现在我收到此错误

_react3.default.PropTypes.shape

但是我在整个项目中找不到这条线

javascript react-native mobx-react

2
推荐指数
1
解决办法
2769
查看次数

MobX 状态树生成器不允许在成功的承诺中修改状态?

通过下面的代码我得到这个错误:

error: Error: [mobx-state-tree] Cannot modify 
'AuthenticationStore@<root>', the object is protected and can only be 
modified by using an action.
Run Code Online (Sandbox Code Playgroud)

有问题的代码(生成器):

.model('AuthenticationStore', {
    user: types.frozen(),
    loading: types.optional(types.boolean, false),
    error: types.frozen()
  })
  .actions(self => ({
    submitLogin: flow(function * (email, password) {
      self.error = undefined
      self.loading = true
      self.user = yield fetch('/api/sign_in', {
        method: 'post',
        mode: 'cors',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          'user' : {
            'email': email,
            'password': password
          }
        })
      }).then(res => {
        return res.json()
      }).then(response => {
        self.loading …
Run Code Online (Sandbox Code Playgroud)

generator mobx mobx-react mobx-state-tree

2
推荐指数
1
解决办法
4349
查看次数

Mobx-state-tree 在树内使用 mobx 反应 - 好还是坏实践?

我有一篇文章是 mobx-state-tree 对象,我在 React 应用程序中使用它。

这是我的树内的一个动作

setId(id: string) {
  self.id = id

  this.updateProduct()
},
Run Code Online (Sandbox Code Playgroud)

还有活动

 <input
  value={comp.productId}
  onChange={(e) => comp.setId(e.target.value)}
/>
Run Code Online (Sandbox Code Playgroud)

问题是this.updateProduct()每次更改都会运行,并在每次按键后进行异步调用。

我想利用 mobx 反应并使用类似的东西

reaction(
() => ({
  id: this.id
}),
() => {
  this.updateProduct()
}, {
  delay: 500 // this is the key thing
})
Run Code Online (Sandbox Code Playgroud)

我发现延迟在这种情况下非常有用,所以我想在树内使用它们。

在 mobx 状态树中添加反应是一个好习惯吗?如果是,使用反应的正确位置在哪里?

我可以在反应组件内定义反应,但它将在树之外。在树外面是个好习惯吗?

reactjs mobx mobx-react mobx-state-tree

2
推荐指数
1
解决办法
1036
查看次数

当 mobx react 中真正需要 'action'/'runInAction' 时

有人可以向我解释什么是真正的区别以及为什么这里的两个示例都相同:

1) 通过 store 文件中的 action/runInAction 更改 observable 的状态:

颜色存储文件:

@observable
color='red'

@action
setColor(){
  this.color='blue'
}
Run Code Online (Sandbox Code Playgroud)

2)通过组件本身改变状态(这被认为是不好的做法):

反应组件文件:

onClick = () => this.props.colorStore.color='blue' //still working...
Run Code Online (Sandbox Code Playgroud)

reactjs mobx mobx-react

2
推荐指数
1
解决办法
792
查看次数

如何对 MobX 中每个可能的变化运行反应回调?

这是我的简化商店:

export class ProfileStore {
  profile = {
    id: 1,
    name: "Tommy",
    todos: [
      {
        value: "Clean the room",
        done: false
      }
    ]
  };

  constructor() {
    makeObservable(this, {
      profile: observable,
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

我的目标是倾听可观察到的“配置文件”内的每一个可能的变化。我想使用reactionMobX 来实现此目的,但这有点棘手。

reaction(
      () => this.profile,
      () => {
        console.log("change");
      }
    );
Run Code Online (Sandbox Code Playgroud)

上面的示例根本不起作用,因为 MobX 不会对值做出反应,而是对属性和引用做出反应。所以我把它改成这样:

reaction(
      () => ({
        id: this.profile.id,
        name: this.profile.name,
        todos: this.profile.todos.slice()
      }),
      () => {
        console.log("change");
      }
    );
Run Code Online (Sandbox Code Playgroud)

它开始起作用,但并不完全起作用。除了切换待办事项中的属性之外,它还会监听所有更改done。如果我添加另一个属性,我需要在这里列出,这有点乏味。

处理这个问题的最佳方法是什么?如何应对每一个可能的变化?

我为此制作了一个codesandbox:链接

尝试按下按钮并查看计数器。

reactjs mobx mobx-react

2
推荐指数
1
解决办法
972
查看次数

为什么MobX不能用作国家容器?

为什么MobX不能用作国家容器?官方文档中提到"MobX不是国家容器"?是不是像Redux?

javascript reactjs mobx mobx-react

1
推荐指数
1
解决办法
534
查看次数