2016-11-20 9 views
5

Mobx를 사용하면 저장소를 업데이트 한 후 (즉, 버튼을 클릭 한 후) 구성 요소가 다시 렌더링되지 않습니다. 초기로드 후에 아무것도 표시하지 않는 mobx devtools를 설치했으며 콘솔에 오류가 없습니다. 내가 뭘 잘못했는지 생각해?React Mobx - 저장소 변경 후 구성 요소가 업데이트되지 않습니다.

Store.js :

import { observable } from 'mobx'; 

class Store { 

    @observable me; 

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

    change_me(){ 
     this.me = 'test 1234'; 

    } 

} 


export default Store; 

layout.js :

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


@observer 
export default class Layout extends React.Component{ 

    render(){ 

     return(
      <div> 
       <h1>{this.props.store.me}</h1> 
       <button onClick={this.on_change}>Change</button> 
      </div> 
     ) 
    } 

    on_change =() => { 
     this.props.store.change_me(); 
    } 
} 

하는 index.js :

import React from "react"; 
import ReactDOM from "react-dom"; 
import Layout from "./components/Layout"; 
import Store from "./Store"; 
import DevTools, { configureDevtool } from 'mobx-react-devtools'; 

// Any configurations are optional 
configureDevtool({ 
    // Turn on logging changes button programmatically: 
    logEnabled: true, 
    // Turn off displaying conponents' updates button programmatically: 
    updatesEnabled: false, 
    // Log only changes of type `reaction` 
    // (only affects top-level messages in console, not inside groups) 
    logFilter: change => change.type === 'reaction', 
}); 


const app = document.getElementById('app'); 
const store = new Store(); 

ReactDOM.render(

    <div> 
     <Layout store={store} /> 
     <DevTools /> 
    </div> 
, app); 
+0

붙여 넣기 복사 귀하의 코드 및 그것은 내 환경에서 작동합니다. '구성 요소가 다시 렌더링되지 않는 저장소를 업데이트 한 후'버튼을 클릭하면 바로 의미합니까? – Max

+0

정확히 맞습니까? 그럼 당신을 위해 작동합니까? 그 밖의 무엇입니까? – Chris

+0

그냥 야생 귀하의 가져 오기 디렉토리가 올바른지 아닌지 확인하십시오 – Max

답변

2
나는 당신의 change_me에 @Action을 추가하여 시작할 것

() 함수 . 내가 이해하는 바에 따르면, 항상 완전히 필요한 것은 아니지만, 필자가 코드를 추가하는 것을 잊어 버렸을 때, 필자는이 코드를 여러 번 본 적이있다.

또한 @mweststrate가 제안한대로 .babelrc를 게시하십시오. 다른 사람들이 적절한 플러그인이로드되었는지 확인하는 데 도움이됩니다.

0

이 컨텍스트의 바인딩을 확인하십시오. 당신이 실제로는 정의에 아무런 소품의 라인을 따라 뭔가 말을하려고 클릭하는 경우

<button onClick={this.on_change}>Change</button> 

는이 참조는 클래스에 너무 가능성이되지 않습니다. 변경 대상 :

<button onClick={this.on_change.bind(this)}>Change</button> 

수정해야합니다. 또는 더 나은 아직, 그래서 그것의하지 모든에 다시 바인딩

constructor(props) { 
    super(props) 
    this.on_change = this.on_change.bind(this) 
} 

는 다음 초기화되지 않은 @observable을하는 것입니다 귀하의

+2

이것은 두 가지 이유로 매우 잘못된 답변입니다. 첫째, on_change는 선언 된 방식대로이 속성에 바인딩되므로 {this.on_change}의 원래 호출이 좋습니다. 그런 다음 데.{} 안의 bind()는 성능 저하로 이어지는 반 패턴이며 절대 사용해서는 안됩니다. – Nopik

+1

@ 노 픽 실제로 사실이 아닙니다. 'on_change '는'this'에 바인딩되지 않습니다. React autobinds 유사한 메소드를 사용하지만, ES6 클래스가 사용될 때가 아니라 'createClass'를 통해 컴포넌트가 선언 된 경우에만 가능합니다. – Sulthan

+0

술탄이 말하는 @ 노 픽크 (Nopik)는 당신이 정말로 당신의 구속력을 읽을 필요가 있다고 말합니다. 또한 아래에서 설명하는 것처럼 적절한 패턴은 생성자에서 바인딩하는 것입니다. 여기에서 더 많은 것을 읽을 수 있습니다 : http://egorsmirnov.me/2015/08/16/react-and-es6-part3.html – dpastoor

0

내 생각 엔으로 돌아갈 수 렌더링 생성자의 컨텍스트를 바인딩합니다. 그것은 매우 반 직관적이지만 바벨은 그것을 잘 다루지 못합니다. @observable me = undefined도 추가 할 수 있습니다. (생성 된 js 코드를 거기에 할당 할 때 참조하십시오. 일반적으로 생성자를 완전히 제거하고 초기화 (예 : @observable me = "hello" 생성자 없음)를 이동하면 정상적으로 작동합니다.