reactjs - react + Mobx : 'this' is null when trying to update store

标签 reactjs mobx mobx-react

刚刚开始使用 Mobx 和 React,在更新商店时遇到困难。单击按钮时出现错误,这应该更新“me”属性:

Store.js:12 Uncaught TypeError: Cannot set property 'me' of null

我的商店:

import { observable } from 'mobx';

class Store {

    @observable me;

    constructor() {
        this.me = 'test';
    }

    change_me(){
        this.me = 'test 1';
        console.log(this); // null???
    }

}

const store = new Store();

export default store;

组件:

import React from "react";
import { observer } from 'mobx-react';

export default class Layout extends React.Component{

    render(){

        var store = this.props.store;

        return(
            <div>
              <button onClick={store.change_me}>{store.me}</button>
            </div>
        )

    }
}

我可能错过了其工作原理的一些基本部分,但无法弄清楚。

最佳答案

是的,this 为 null 时会 react 执行事件回调。因为您只为 onClick 回调提供了 change_me 方法,而不是 store 作为上下文。

解决方案

您必须自己设置this上下文。您可以通过以下方式执行此操作

不良做法:

正如@Eduard所说,你可以将它转换成箭头函数。箭头函数确保函数体内的 this 上下文保持不变:

<button onClick={() =>store.change_me()}>{store.me}</button> 

您还可以使用bind方法:

<button onClick={store.change_me.bind(store)}>{store.me}</button>

这基本上做同样的事情。

为什么它们是不好的做法?在每次调用 render() 时,都会重新创建这些方法。并可能导致额外不必要的重新渲染。

良好实践

mobx 提供了一个 action.bound,它使用正确的 this 上下文包装函数:

@mobx.action.bound
change_me(){
    this.me = 'test 1';
}

或者,es6 类定义允许您自己正确定义 this 上下文:

@mobx.action
change_me = () => {
    this.me = 'test 1';
}

参见箭头函数。在幕后:而不是在 Store 类的原型(prototype)上定义函数/方法。该方法是在构造函数中创建的,以便this上下文变量始终与类的实例匹配。

这样:

var a = new Store(); // a.me = 'test'
var b = new Store(); // b.me = 'test'
a.change_me = b.change_me; // change_me function contains its own this context.
a.change_me(); // a.me = 'test' b.me = 'test 1'

关于reactjs - react + Mobx : 'this' is null when trying to update store,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40702028/

相关文章:

javascript - react 数据网格行在动态提供高度时消失

javascript - 世博会,React Native 异步存储在热重载后重置?

javascript - Redux:这种全能 Action 创建者模式是不是错了?

reactjs - React - Material UI - 带有自定义输入组件的 TextField 控制输入无法正常工作失去焦点

javascript - react mobx - 存储返回代理对象

javascript - 将 lodash 用于 MobX 存储

reactjs - 将 props 传递给无状态组件的语法

javascript - 我遇到 Material-UI 和 Mobx 的错误,错误 : Material-UI: capitalize(string) expects a string argument

javascript - mobx 商店更改后更新选项卡导航器上的徽章

javascript - MobX 'this' 在 setter 操作中未定义