2016-10-20 8 views
0

を使用しないでください。なぜ私が店を持っ例えばforceUpdate()

class MyStore { 
    constructor() { 
    this.value = 1; 
    } 
} 

私はビューでMyStore.valueを取得し、変更する必要があります。

class MyView extends React.Component { 
    constructor() { 
    super(); 
    this.state = { 
     value: MyStore.getValue() 
    }; 
    } 

をして、それを変更します:

私はそれを行うことができます

userClick() { 
    this.setState({value: MyStore.changeValue('newValue')}); 
    } 

をまたはストアでvalueを変更して発する呼び出します。

しかし、私はforceUpdate()でそれを行うことができます。

render() { 
    const value = MyStore.value; 
    return (
     <div>{value}</div> 
    ) 
    } 

そして、それを変更します。

userClick() { 
    MyStore.value = 'newValue'; 
    this.forceUpdate(); 
    } 

なぜそれが悪いのですか?

+0

上mobXで

(それが状態を必要としないため、機能性成分を使用して)の例では、までboilds

var View = observer((props) => ( <div> <button onClick={()=>props.store.value = Math.random()}>Change</button> <p>{props.store.value}</p> </div> ) ) class MyStore { @observable value =1; get value() { return this._value; } set value(val) { this._value = val; } } 

Seのライブデモあなたに起こる変化をリッスンするためにしようとしていますそれが発生したときにUIを保存し、更新しますか? –

+0

@ JohnF。はい、私は 'forceUpdate'でもっと簡単だと思います。リスナーなどを追加する必要はありません。 – Nick

+0

あなたのアプローチはうまくいくはずですが、 'render()'で常に 'MyStore.value'を使うつもりなら、ローカルの' state'変数を維持する必要はありません。つまり、レンダリングで 'state.value'を使用することを選択した場合、最初のアプローチでは、' MyStore'を呼び出して値を変更し、それに応じてsetStateを呼び出します。 – lux

答えて

0

あなたがしようとしていることに何か間違っているとは思わない。あなたは基本的なOOルールに従うだけで、データをカプセル化しています。

実際には、データとプレゼンテーションをミキシングするのではなく、ほとんどの基本的なリアクションの例でこのパターンが導入されないのはわかりません。 Flux、Redux、またはMobX(あなたが行く方法だと思います)に達する前に、通常、店舗のようなものは表示されません。

この例ではcodepenにゲッターとセッターを使用して例を書き直しました。データが変更されたときにオブザーバーパターンを使用しています。 私はこれが(デモを覚えていることを忘れないで)forceUpdate()を使っても大丈夫だと主張します。

class MyView extends React.Component { 
    constructor(props) { 
    super(props); 
    this.props.store.setObserver(this); 
    } 
    changed(){ 
    this.forceUpdate(); 
    } 
    render() { 
    return (
     <div> 
      <button onClick={()=>this.props.store.value = Math.random()}>Change</button> 
      <p>{this.props.store.value}</p> 
     </div> 
    ) 
    } 
} 

class MyStore { 
    constructor() { 
    this._value = 1; 
    } 

    get value() { 
    return this._value; 
    } 
    set value(val) { 
    console.log(val); 
    this._value = val; 
    this._observer.changed(); 
    } 
    setObserver(observer){ 
    this._observer = observer; 
    } 
} 

これは実際にmobX libraryが表面下で行っていることです。それは自動的なリスナーの能力を提供します、そして、これがあなたが行く計画の方法なら、私は間違いなくこのライブラリを見てアドバイスをします。

自動的にforceUpdate()を含むすべての「オブザーバー」の詳細を処理します(forceUpdateは使用せず、updataが必要な場合はrender()メソッドを呼び出します)。 codepen.io

関連する問題