2017-06-21 1 views
0

J'essaie de comprendre l'implémentation de mobx dans React. J'ai utilisé create react app et mettre à jour la configuration par défaut pour utiliser les décorateurs. Ensuite, j'ai créé un magasin simple comme ceci:Mobx ne réagit jamais

EDIT: après Ben Hare (! De grâce à lui) réponse Je mis à jour mon code comme ceci:

index.js

import React from 'react'; 
import ReactDOM from 'react-dom'; 
import App from './App'; 
import MessageStore from "./store/messages"; 

ReactDOM.render(<App store={new MessageStore()} />, 
document.getElementById('root')); 

** app.js **

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

@observer 
export default class App extends React.Component { 

    constructor(props) { 
     super(props); 
     this.store = props.store; 
    } 

    render() { 
     return <ul> 
      { this.store.allMessages.map((msg) => { 
       return <li key={msg}>{msg}</li> 
      })} 
     </ul> 
    } 
} 

messages.js

import {action, observable, computed} from "../../node_modules/mobx/lib/mobx"; 

export default class MessageStore { 

    @observable messages = ["My first message"]; 

    constructor() { 
     setInterval(() => { 
      // Add some random messages every second 
      this.addMessage(Math.random()); 
     }, 1000); 
    } 

    @action addMessage(msg) { 
     this.messages.push(msg); 
    } 

    @computed get allMessages() { 
     return this.messages; 
    } 

} 

Le premier message est affiché, mais le composant ne se met jamais à jour lorsque setInterval ajoute un message dans le magasin. Pouvez-vous m'aider ?

+1

Comment rendes-tu ton composant simple? Dans mobx vous devez passer le magasin en tant que prop pour que le @observer fonctionne, vous ne pouvez pas simplement y accéder à l'intérieur de render. Cela ne déclenchera pas de changement de fournisseur. –

+0

Merci pour la réponse @BenHare J'ai édité ma question –

Répondre

0

Works pour moi:

https://codesandbox.io/s/LgQXNBnNW

Avez-vous vu des erreurs dans le journal du navigateur ou du terminal?

+0

Merci pour votre réponse et pour prendre le temps de tester mon code! Cela fonctionne, donc j'ai vérifié diff entre votre code et le mien et mon erreur était celle-ci: J'ai été appâté par mon IDE! J'ai remplacé: "import {action, observable, calculé} de" ../../node_modules/mobx/lib/mobx ";" par "import {action, observable, calculé} de" mobx ";" et ça marche bien –