2016-05-03 9 views
0

が、私は最近、私は最初の更新の後に私のコードをテストした逆流接続/トリガ動作の変更は、後の

をv0.4.1するv0.3.0からの逆流をアップグレードし、私がしなければならなかった唯一の変更はにキーを追加したアップグレード私のコンポーネントのReflux.connectコール。

しかし、私はいくつかの奇妙な行動を経験しています:

var SomeActions = Reflux.createActions([ 
    'updateName' 
]); 

var SomeStore = Reflux.createStore({ 
    listenables: [SomeActions], 
    init() { 
    this.name = ''; 
    this.time = new Date(); 
    }, 
    getInitialState() { 
    return { 
     time: this.time 
    } 
    }, 
    onUpdateName (newName) { 
    this.name = newName; 
    this.trigger({ 
     name: this.name 
    }); 
    } 
}); 

var SomeComponent = React.createClass({ 
    mixins: [React.connect(SomeStore, 'someState')], 
    componentDidMount() { 
    SomeActions.updateName(this.props.name); 
    }, 
    render() { 
    console.log(this.state.someState); 
    ... 
    } 
}); 

を状態がちょうどtimeを含む、正しいコンポーネント最初のマウントをする場合。しかし、アクションがトリガーされると、今度は不正な状態になり、ちょうどnameが含まれます。アップグレード前の動作はtriggerで、単に新しいキーを状態に追加/更新するだけでした。したがって、アクションがトリガされた後、私はtimenameの両方を含む状態になると予想していました。

更新中に何か迷ったですか?

+0

あなたのトリガーにコンポーネントに店舗全体の状態を返すことができますが、 'this.trigger({ 名試すんでした:this.name、時間:これを.time }); '?あなたの状態は、時間をクリアしているものと置き換えられている可能性が最も高いです。 –

+0

はい、それは動作しますが、複数の複雑なストアを持つ複雑なアプリケーションでは、各アクションがすべての可能な状態キーに対してトリガーを強制しないようにします。ストアの残りの部分が使用できるトリガーの周りに単一のラッパー関数を作成することによってそれを克服することができますが、引き続きトリガーがすべての可能な状態キーを強制する必要があります。私はそれを避けたいです。 –

+0

これでsetStateはどこで起こっていますか? –

答えて

0

私は還流を使用していませんでしたので、私はその文書を読まなければなりませんでした。これには不正な方法を使用しています。ドキュメントから

var SomeComponent = React.createClass({ 
    mixins: [React.connect(SomeStore, 'someState')], 
    ----------------^---------------- 
    componentDidMount() { 
    SomeActions.updateName(this.props.name); 
    }, 
    render() { 
    console.log(this.state.someState); 
    ... 
    } 
}); 

あなたがしたいすべてがデータストアが送信ものは何でもあなたのコンポーネントの状態を更新している場合は、Reflux.connect(リスナー、stateKey)

を使用することができます

ストアのデータがコンポーネント全体の状態を変更しています。

この例のように更新する内容をドキュメントから指定できます。

var Status = React.createClass({ 
    mixins: [Reflux.listenTo(statusStore,"onStatusChange")], 
    onStatusChange: function(status) { 
     this.setState({ 
      currentStatus: status 
     }); 
    }, 
    render: function() { 
     // render using `this.state.currentStatus` 
    } 
}); 

それとも

DOCS

関連する問題