回流:组件不会从商店获取触发事件

时间:2015-11-26 19:39:54

标签: reactjs refluxjs

在udemy完成了一个很好的React课程之后,我使用了Reflux创建了一个商店,但是,该商店的触发事件无法被该组件捕获。

我的问题: 为什么使用ImageStore.orderImage(component.jsx中的TODO 1)不起作用:不会触发this.onChange,而ImageStore.getImage和Actions.orderImage都可以工作。

感谢您的帮助。

在component.jsx里面:

  mixins: [
    Reflux.listenTo(ImageStore,'onChange')
  ],

  componentWillMount: function () {
    //TODO 1: why ImageStore.orderImage does not work: this.onChange will not be triggered
    // ImageStore.orderImage(this.props.params.id);     // WHY this does not work? this.onChange will not be triggered.
    // ImageStore.getImage(this.props.params.id);       // this works
    Actions.orderImage(this.props.params.id);           // this works, will use this method
  },

  onChange: function () {
    console.log("imageComponent: get a new event from imageStore");
    this.setState({
      image: ImageStore.findImage(this.props.params.id)
    });
  }

在store.jsx内部

listenables: [Actions],

  getImage: function (imageID) {
    API.get('gallery/image/'+imageID)
    .then(function(json){
      if(this.images){
        this.images.push(json.data);
      } else {
        this.images = [json.data];
      }
      this.updateStore();
    }.bind(this));
  },

  orderImage: function (imageID) {
    console.log("imageStore: get a new image order:", imageID);
    var image = _.findWhere(this.images, {id:imageID});
    if (!image) {
      this.getImage(imageID);
      console.log("imageStore: I start to get image:", imageID);
    }
    else {
      console.log("imageStore: I already have the image:", imageID);
      this.trigger('change',this.images);
      this.updateStore();
    }
  },

  findImage: function (imageID) {
    var image = _.findWhere(this.images, {id:imageID});
    if (image) {
      return image;
    } else {
      return null;
    }
  },

  updateStore: function () {
    console.log("imageStore: trigger the change");
    this.trigger('change',this.images);
  }

1 个答案:

答案 0 :(得分:0)

ImageStore.findImage并不酷。您希望使用操作让商店执行查找图像。然后触发一个事件。有了回流,你可以在参数中加入一个触发器来选择更新。



import Reflux from 'reflux';

import Actions from '../actions/sa.Actions';
import AddonStore from './Addon.Store';
import MixinStoreObject from './Mixin.Store';

function _GotData(data) { this.data1 = data; BasicStore.trigger('data1'); }

let BasicStoreObject = {
  init() { this.listenTo(AddonStore, this.onAddonTrigger); },
  data1: {},
  listenables: Actions,
  mixins: [MixinStoreObject],
  onGotData1: _GotData,
  onAddonTrigger() { BasicStore.trigger('data2'); },
  getData1() { return this.data1; },
  getData2() { return AddonStore.data2; },
  getData3() { return this.data3; }
}
const BasicStore = Reflux.createStore(BasicStoreObject);
export default BasicStore;






import React from 'react';

import BasicStore from '../stores/Basic.Store';

let AppCtrlSty = {
  height: '100%',
  padding: '0 10px 0 0'
}

const getState = () => {
  return {
    Data1: BasicStore.getData1(),
    Data2: BasicStore.getData2(),
    Data3: BasicStore.getData3()
  };
};

class AppCtrlRender extends React.Component {
   render() {
    let data1 = JSON.stringify(this.state.Data1, null, 2);
    let data2 = JSON.stringify(this.state.Data2, null, 2);
    let data3 = JSON.stringify(this.state.Data3, null, 2);
    return (
      <div id='AppCtrlSty' style={AppCtrlSty}>
        React 0.14 ReFlux with SuperAgent<br/><br/>
        Data1: {data1}<br/><br/>
        Data2: {data2}<br/><br/>
        Data3: {data3}<br/><br/>
      </div>
    );
  }
}

export default class AppCtrl extends AppCtrlRender {
  constructor() {
    super();
    this.state = getState();
  }

  componentDidMount = () => { this.unsubscribe = BasicStore.listen(this.storeDidChange); }
  componentWillUnmount = () => { this.unsubscribe(); }
  storeDidChange = (id) => {
    switch (id) {
      case 'data1': this.setState({Data1: BasicStore.getData1()}); break;
      case 'data2': this.setState({Data2: BasicStore.getData2()}); break;
      case 'data3': this.setState({Data3: BasicStore.getData3()}); break;
      default: this.setState(getState());
    }
  }
}
&#13;
&#13;
&#13;