2015-11-03 6 views
-1

Я создаю приложение с React и Flux/McFly и хочу иметь НЕЗАВИСИМЫЕ магазины, но мои действия McFly передаются КАЖДОМУ Store i, созданному с помощью mcFly - несмотря на то, что я использую отдельные файлы для импорта в McFly InstanceFLUX с несколькими независимыми магазинами/диспетчерами

/stores/msg/mcfly.js:

var McFly   = require('mcfly'); 
, MsgDispatcher = new McFly() 
; 
module.exports = MsgDispatcher; 

/stores/user/mcfly.js:

var McFly  = require('mcfly') 
, UserMcFly = new McFly() 
; 
module.exports = UserMcFly; 

так что это должны быть разные экземпляры, не так ли? Но их диспетчеры, похоже, одинаковы.
(? Потому что «поток» диспетчер всегда синглтон?)

Когда я создать различные магазины/ActionCreator пар с различными McFly «экземплярами» каждое действие еще проходит через каждый магазин.
Я знаю, что многие люди предлагают иметь только одно глобальное состояние/магазин, но imho этот подход не подходит для каждого проекта, и я ненавижу это поведение.

TL; DR:
Можно ли создать полностью независимые магазины/диспетчеры
или он предназначен именно так и почему?
МИНУСЫ: плохой производительность, действительно большой StateObject, проверяя наличие обновлений, если это не обязательно, Standalone SubApps не возможен ?, spezification из DataModels ...

Как я создавать независимый автономный многоразовых Sub-Applications если не может быть отдельный магазин/диспетчер?

наилучшими пожеланиями, Стив

+0

неправильно понял магазин-редуктор pt ... вопрос не имеет смысла ... следует удалить – DoubleU23

ответ

1

Почему это вопрос о том, что действия доступны во всех магазинах? Вы можете использовать переключатель в каждом магазине, чтобы захватить действия, которые вас интересуют для этого магазина. Иногда вы действительно хотите слушать одно и то же действие в нескольких магазинах.

+0

проблема заключалась в том, что метод shoulUpdate (в mixin) был запущен, потому что Store излучает событие изменения, даже если состояние Stores не изменилось , Это было бы проблемой, если бы мой следующий элемент метода shouldComponentUpdate не был бы равен фактическому состоянию ... (это мой первый проект реагирования/потока). Я поймал этот changeevent, проверив, изменилось ли состояние. но это просто (плохо?) обходной путь – DoubleU23

+1

Возможно, тогда это mixin. Хранилище не должно запускать обновление только потому, что действие инициировано. Попробуйте альтернативный способ прослушивания набора хранилища в компонентеDidMount. –

0

большой ТНХ @Janaka Стивенс
я добавил компонента OnChange-обратный вызов к магазину и запустить его вручную, если это необходимо:

Thread.react.js

import React  from 'react'; 
import MsgStore  from '../stores/msg/MsgStore'; 
export default React.createClass({ 
     getInitialState: function() { 
      // returns the _msg object located in the MsgStore closure 
      return MsgStore.getState() 
     } 
    , onChange: function() { 
      // i don't think that's the right way but it works 
      this.setState(MsgStore.getState()); 
     } 
    // better than the mcFly mixin for multiple stores 
    // so you have more control to which store your component listens 
    , componentDidMount: function() { 
      MsgStore.on('change', this.onChange); 
     } 
     [ ... ] 
    ) 
; 

MsgStore

import React   from 'react'; 
import {MsgMcFly}  from './mcfly'; 
import {MsgReducers} from './MsgReducers'; 
import combineReducers from 'mcfly-combinereducers'; 
let combinedReducers = combineReducers(MsgReducers) 
// get _msgs per API | from DB 
, _msgs    = [ 
     {id: 0, txt: 'test0', user: 'steve23'} 
    , {id: 1, txt: 'test1', user: 'steve23'} 
    , {id: 2, txt: 'test2', user: 'steve23'} 
    ] 
; 
export default MsgMcFly.createStore({ 
     getMsgs: function(){ return _msgs; } 
    , getState: function(){ return {'msgs': _msgs} } 
    , createMsgObject: function(msg) { 
      return { 
       id:   _msgs.length // dev 
      , txt:  msg.txt 
      , timestamp: msg.timestamp || new Date() 
      , user:  msg.user || 'steve' // dev 
      } 
     } 
    }, function(action) { 

      // prevent the Store to fire for 'USER_' actions 
      if(action.type.substr(0, 3) !== 'MSG') 
       return false; 

      combinedReducers(MsgStore.getMsgs(), action); 

      MsgStore.emitChange(); 
      return true; 
     } 
    ) 
; 
Смежные вопросы