2017-06-29 11 views
2

を変更するときにコンポーネントを更新しない Mobx反応する。.. observable.map値が私の店で

@observable dots = observable.map({ 
    '0x001': extendObservable({ x: 2000, y: 2000 }), 
    '0x002': extendObservable({ x: 5000, y: 5000 }), 
    '0x003': extendObservable({ x: 10000, y: 10000 }), 
}); 

@action updateDot(id, properties) { 
    const dot = this.dots.get(id); 
    this.dots.set(id, extendObservable(Object.assign(dot, properties))); 
} 

私はドット値を更新

...

store.updateDot('0x002', { 
    x: 200, 
    y: 300, 
}); 

私のコンポーネントは反応しません。 。

@inject('store') @observer 
export class IndexComponent extends Component { 

    render() { 
    const { store } = this.props; 
    const { dots } = store; 

    return <Map dots={dots} /> 
    } 

} 

とマップ..

とマトリックス...

@observer 
class Matrix extends Component { 
    render() { 
    const { dots, ...rest } = this.props; 
    // NOT CALLED WHEN UPDATE DOTS 
    return <div ...rest ></div> 
    } 
} 

答えて

0

ベスト私たちは本当に解決策を確認することができると同様に、フィドルを設定したが、私はありません、これはテストを行わず(十分なはず

@observable dots = observable.map({ 
    '0x001': { x: 2000, y: 2000 }, 
    '0x002': { x: 5000, y: 5000 }, 
    '0x003': { x: 10000, y: 10000 }, 
}); 

@action updateDot(id, properties) { 
    const dot = this.dots.get(id); 
    Object.assign(dot, properties) 
} 

を考えます保証)。 Observablesは、デフォルトでは、複雑でないオブジェクトでも子どもを観察可能にします。 updateDotのobject.assignは、事前定義されたプロパティ(この場合はxとy)に対してのみ機能することに注意してください。 MobXは存在しないプロパティをまだ追跡できません。だから、すべての可能なprpoertiesが(必要であれば未定義の値で)先験的に宣言されていることを確認するか、ドットのマップ構造を使用してください。

+0

ドットプロパティを変更しても反応がない... https://runkit.com/ridermansb/react-on-map-object-change/2.0.0 – ridermansb

+1

「観察」は何もしない「オブザーバー」と一緒に。 'autorun'が近づきます。観察するのは、地図の内容ではなく、地図の変更だけです。最大のMobX(オートランのような)はあなたが実際に使っているものだけを追跡します。したがって、 'map.get(01).x'プロパティにアクセスしなければ、それはその中の変更に反応しません(なぜなら、あなたがそれを使用しない場合、なぜ値が適切なのでしょうか?)。私はあなたの元の質問では、欠けているのはマトリックスがオブザーバーであること、あるいは最初にデレファレンシングすることだと思います。私は、https://mobx.js.org/best/react.htmlを慎重に読むことをお勧めします。 – mweststrate

0

あなたのMetrixコンポーネントによって異なると思います。どのようにそれにdotsを使用しますか?

MobXは、観測可能な値を小道具として渡すだけで再レンダリングしません。

実際にはとしてください。

この場合、あなたのマトリックスはdots.get(....)でなければなりません。dotsが変更された場合、Metrixは再レンダリングします。

ところで、あなたのIndexComponentとは、dotsを渡すだけで再レンダリングされません。

+0

Mapでデータが変更されるたびに関数を実行する必要があります。この関数を 'Matrix'コンポーネントの' updateData(dots .. value()) 'として実行します。 – ridermansb

関連する問題