【问题标题】:Each instance receive events when rendering my ES6 React/Reflux component twice每个实例在两次渲染我的 ES6 React/Reflux 组件时接收事件
【发布时间】:2015-12-04 08:30:49
【问题描述】:

我有一个组件(执行文本输入)在另一个组件中渲染了两次。

当我在其中一个文本输入组件中按下一个键时,每个都会收到通知...

该组件采用"14:30" 之类的时间字符串,并应允许输入小时和分钟部分。

反流动作:

let TimeActions = Reflux.createActions([
  'setHour',
  'setMinute'
]);

回流混合:

let TimeMixin = {
  init: function() {
    this.listenToMany(TimeActions);
  },

  onSetHour(h) {
    this.time.hour = h;
    this.trigger(this.time);
  },

  onSetMinute(m) {
    this.time.minute = m;
    this.trigger(this.time);
  }
};

反应组件:

export default class TimePicker extends React.Component {

  constructor(props) {
    super(props);

    let parts = this.props.time.split(':'),
        time = {
      hour: parts[0],
      minute: parts[1]
    };

    this.store = Reflux.createStore({
      mixins: [ TimeMixin ],
      time: time
    });

    this.state = time;
  }

  componentDidMount() {
    this.unsubscribe = this.store.listen(this.onTimeChanged.bind(this));
  }
  componentWillUnmount() {
    this.unsubscribe();
  }

  onTimeChanged(time) {
console.log('TIME SET TO', time);
    this.setState(time);
  }

  render() {
    let classes = classNames('time-picker');

    return (
      <div className={classes}>
        <table>
          <tbody>
            <tr>
              <td>
                <input type="text" className="hour" maxLength="2"
                       value={this.state.hour}
                       onChange={this.onHourChanged} />
              </td>
              <td class="separator">:</td>
              <td>
                <input type="text" className="minute" maxLength="2"
                       value={this.state.minute}
                       onChange={this.onMinuteChanged} />
              </td>
            </tr>
          </tbody>
        </table>
      </div>
    );
  }

  onHourChanged(event) {
    TimeActions.setHour($(this.getDOMNode()).val());
  }

  onMinuteChanged(event) {
    TimeActions.setMinute($(this.getDOMNode()).val());
  }
}

我从另一个 React 组件渲染了两次 TimePicker...

...
<TimePicker time={this.props.from} />
<TimePicker time={this.props.to} />
...

...当在任何实例的分钟输入中键入 "01" 时,我得到以下日志:

TIME SET TO Object {hour: "08", minute: "01"}
TIME SET TO Object {hour: "12", minute: "01"}

知道我做错了什么吗?

【问题讨论】:

  • 商店应该只有一个实例。将商店向上移动到组件级别。

标签: reactjs refluxjs


【解决方案1】:

这是因为您在组件的构造函数级别创建了两个存储。

您应该在组件之外创建商店,这样无论您有一个或数百万个组件实例,都只会存在一个。

【讨论】:

  • 好的,我明白你的意思了。但在这种情况下,任何组件都将共享唯一存储的状态。所以我将无法进行差异化渲染。我错了吗?
  • shouldComponentUpdate 会来这里帮助你。
  • 好的。 Thx,现在我明白了:我必须在通知中过滤商店的项目以根据其适当的数据集设置每个组件状态,shouldComponentUpdate 将避免无用的渲染。对吗?
猜你喜欢
  • 2019-05-26
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多