javascript - 在 MobX 中使用 React 时可以直接修改状态吗?

标签 javascript reactjs mobx mobx-react

我不应该这样做的唯一原因是让 react 更新 View 。 https://facebook.github.io/react/docs/state-and-lifecycle.html#using-state-correctly
但 MobX-react 似乎为我做了这些肮脏的工作。我只需要将 this.state 标记为可观察的,一切都会按预期进行。有什么缺点吗?我不想把所有州都扔进一个巨大的商店。

JSFiddle link

代码:

const {observable, computed} = mobx;
const {observer} = mobxReact;
const {Component} = React;

@observer
class Form extends React.Component{
    @observable state = {
        username: '',
        password: '',
    };

    constructor(...args) {
        super(...args);
        this.handleSubmit = this.handleSubmit.bind(this)
    }

    render() {
        return  <form onSubmit={this.handleSubmit}>
                    <label>
                    Name:
                    <input type="text" value={this.state.username} onChange={event => this.state.username = event.target.value} />
                    </label>
                    <div>username: {this.state.username}</div>
                    <input type="submit" value="Submit" />
                </form>;
    }

    handleSubmit(event: Event) {
        event.preventDefault();
        console.log(this.state.username);
    }
}

ReactDOM.render(
    <div>
        <Form />
        <mobxDevtools.default />
    </div>
, document.getElementById('mount'));

最佳答案

最好完全绕过state,直接将可观察数据放在类上。

示例 ( JS Bin )

const {observable, computed} = mobx;
const {observer} = mobxReact;
const {Component} = React;

@observer
class Form extends React.Component{
    @observable username = '';
    @observable password = '';

    constructor(props) {
        super(props);
        this.handleSubmit = this.handleSubmit.bind(this)
    }

    render() {
        return <form onSubmit={this.handleSubmit}>
            <label>
                Name:
                <input type="text" value={this.username} onChange={event => this.username = event.target.value} />
            </label>
            <div>username: {this.username}</div>
            <input type="submit" value="Submit" />
        </form>;
    }

    handleSubmit(event: Event) {
        event.preventDefault();
        console.log(this.username, this.password);
    }
}

ReactDOM.render(
    <div>
        <Form />
    </div>
, document.getElementById('mount'));

关于javascript - 在 MobX 中使用 React 时可以直接修改状态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42830686/

相关文章:

javascript - 如何在 React 组件中渲染 Backbone View ?

javascript - 我如何存储和访问元素的数据属性,例如 React 中的选择选项

javascript - 垃圾收集如何处理 mobx-utils 中的异步操作?

javascript - 自定义浏览按钮

javascript - React js 中动态生成的切换(开关)不起作用

javascript - postMessage 到沙盒 iframe,为什么收件人窗口原点为空?

javascript - Mobx 基于计算值为 true 自动运行

javascript - 如何调整内容大小以自动填充整个屏幕空间?

javascript - 我如何使用react-semantic-ui和功能组件制作排序表?

reactjs - 何时在 mobx 中使用计算/观察值