【问题标题】:How to connect my react component to reflux store?如何将我的反应组件连接到回流商店?
【发布时间】:2016-05-30 21:12:02
【问题描述】:

我对 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() 应该将我的商店连接到 state,但我收到“TypeError: this.state.lines is undefined”错误。

【问题讨论】:

  • self 是从哪里出现的?
  • 糟糕... python 太多了。但是在商店中将 self 替换为 this 后,我得到了同样的错误。
  • 添加init()到store中设置行为[],结果还是一样

标签: javascript reactjs refluxjs


【解决方案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
    }
  }
});

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

export default Reflux.createStore({
  listenables: Actions,

  getInitialState() {
        return [];
    },

  addConsoleLines(lines) {
   ...
  }

【讨论】:

  • 我认为 Reflux.connect() 应该透明地将存储绑定到组件状态。至少在文档中是这样写的。 “如果您只想将组件的状态更新为数据存储传输的任何内容,则可以使用 Reflux.connect(listener,[stateKey]) 作为 mixin。如果您提供 stateKey,则状态将通过此更新.setState({:data}),否则 this.setState(data)。"
  • @MadWombat 根据您的评论更新。仍然出现错误?
  • 我已经更新了代码,你是对的,文档实际上说 connect() 需要在商店中定义 getInitialState() 。现在我得到“TypeError:_this.lines 未定义”。我已经更新了帖子中的代码。
  • 在这个lines.forEach(line =&gt; { this.lines.append(line); }); 上你遇到错误了吗?
  • 好的,我把它换成了lines.forEach(this.lines.push, this);它似乎工作。现在我得到 TypeError: self.trigger is not a function
猜你喜欢
  • 2016-04-02
  • 2019-09-21
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 2016-05-20
相关资源
最近更新 更多