如何将反应组分连接到回流罐?

时间:2016-02-18 15:43:07

标签: javascript reactjs refluxjs

我是React和Reflux以及现代JavaScript开发的新手。想学习。所以,我正在制作一个基本上是一种聊天窗口的组件。带有行和输入框的列表。当您在输入框中键入内容并按Enter键时,它会将该行添加到列表中。我使用setState()使用纯React工作,现在我想让它使用Reflux商店。我的组件代码就像这样

import React from 'react';
import Reflux from 'reflux';

import ConsoleActions from '../actions';
import ConsoleStore from '../stores';

export default React.createClass({
  mixins: [Reflux.connect(ConsoleStore, "lines")],
  render() {
    var lines = this.state.lines.map(function(line) {
      return(<li>{line}</li>)
    });
    return (
       <ul>{lines}</ul>
       <input onKeyUp={this.enter}/>
    )
  },
  enter(e) {
    if (e.keyCode == 13) {
      ConsoleActions.addConsoleLines([e.target.value]);
      e.target.value = null
    }
  }
});

我的行为是

import Reflux from 'reflux';

export default Reflux.createActions(["addConsoleLines","clearConsoleLog",]);

我的商店是     从'回流'进口回流;

import Actions from './actions';

export default Reflux.createStore({
  lines: [],
  listenables: Actions,

  getInitialState: function() {
    return [];
  },

  addConsoleLines(lines) {
    lines.forEach(line => {
      this.lines.append(line);
    });
  },

  clearConsoleLog() {
    this.lines = []
  }
});

不确定我缺少什么,Reflux.connect()应该将我的商店连接到州,但我得到“TypeError:this.state.lines is undefined”错误。

1 个答案:

答案 0 :(得分:1)

您应该在追加行时触发更改事件。

export default Reflux.createStore({
  listenables: [Actions],
  lines:[],
  addConsoleLines(lines) {
    let self=this;
    lines.forEach(line => {
      self.lines.append(line);
    });
    self.trigger('change',self.lines);
  },

  clearConsoleLog() {
    this.lines = []
  }
});

并在您的组件中侦听该更改事件

export default React.createClass({
  mixins: [Reflux.connect(ConsoleStore, "onChange")],
  onChange(event,_lines){
         this.setState({lines:_lines});
    }
  render() {
    var lines = this.state.lines.map(function(line) {
      return(<li>{line}</li>)
    });
    return (
       <ul>{lines}</ul>
       <input onKeyUp={this.enter}/>
    )
  },
  enter(e) {
    if (e.keyCode == 13) {
      Actions.addConsoleLines([e.target.value]);
      e.target.value = null
    }
  }
});

编辑1 :是的,你是对的。还有另一种简单的方法。 Reflux.connect() mixin会检查商店是否有getInitialState方法。如果找到,它将设置组件getInitialState。我想你忘了回到初始状态。

export default Reflux.createStore({
  listenables: Actions,

  getInitialState() {
        return [];
    },

  addConsoleLines(lines) {
   ...
  }