MobX在推送到阵列时不更新React视图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MobX在推送到阵列时不更新React视图相关的知识,希望对你有一定的参考价值。

我的Store.js:

import { observable, useStrict, action } from 'mobx';

useStrict(true);

export const state = observable({

    contacts: []

});

export const actions = {

    addContact: action((firstName, lastName) => {
        state.contacts.push({
            id: Math.floor((Math.random() * 1000) + 1),
            firstName: firstName,
            lastName: lastName
        });
    })

};

我的index.js:

import React from 'react';
import { Provider } from 'mobx-react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';
import { state, actions } from './Store';

ReactDOM.render(
    <Provider state={state} actions={actions}>
        <App />
    </Provider>,
    document.getElementById('root')
);
registerServiceWorker();

我的App.js:

import React, { Component } from 'react';
import ContactList from './components/ContactList';
import ContactAdder from './components/ContactAdder';
import { observer, inject } from 'mobx-react';

const App = inject('state', 'actions')(observer(class App extends Component {
  render() {
    return (
      <div>

        <h1>Contacts</h1>

        <ContactList
          contacts={this.props.state.contacts}
          onDelete={this.props.actions.removeContact}
        />

        <ContactAdder onAdd={this.props.actions.addContact} />

      </div>
    );
  }
}));

export default App;

最后我的ContactAdder.js:

import React, { Component } from 'react';

class ContactAdder extends Component {

    render() {
        return (
            <div className='ContactAdder'>
                <input type='text' value='' placeholder='First Name' />
                <input type='text' value='' placeholder='Last Name' />
                <button onClick={this.props.onAdd.bind(this, 'Test', 'Testerson')}>Add</button>
            </div>
        );
    }

}

export default ContactAdder;

addContact()Store.js中运行后,我可以看到,当我执行控制台日志时,阵列确实会发生变异。但由于某些原因,我的观点没有反应。我究竟做错了什么?

答案

如果你没有看到你的ContactList组件,我认为如果你把它变成observer那么问题就会得到解决。

一旦在先前渲染中取消引用的可观察对象发生更改,观察者组件将重新渲染。 this.props.state.contacts不会取消引用您的联系人数组。如果你写了this.props.state.contacts.slice()this.props.state.contacts.peek()它会工作,但这通常只在passing observables to external libraries时使用。

您也可以将使用observables的所有组件尽可能高效地放入observers中。

另一答案
<ContactList
  contacts={this.props.state.contacts.toJS()}
  onDelete={this.props.actions.removeContact}
/>

尝试使用toJS()方法为state.contacts将ObservableArray转换为Array,然后它将更新ContactList。

以上是关于MobX在推送到阵列时不更新React视图的主要内容,如果未能解决你的问题,请参考以下文章

[Redux/Mobx] Mobx的设计思想是什么

mobx数据变了,视图没变,mobx6的用法

MobX console.log() 有效,但 render() 方法不使用 React.Component 更新

简单的MobX Observable不渲染

react结合ts与mobx环境搭建步骤详解

在推送到 Codecommit 时需要特定的提交消息 AWS Lambda