【问题标题】:How to update component correctly?(react+flux)如何正确更新组件?(react+flux)
【发布时间】:2017-11-17 16:19:25
【问题描述】:

我正在使用 ReactJs + 通量。在我的商店中,我有一个方法 - getCurrentEvents(key)。它接收密钥并正确创建对象数组。之后它会发出变化。 我有组件列表,它有处理程序。此处理程序响应存储更改并调用方法displayEvents()。此方法更新组件的状态。这个概念有效但不正确。当我调用getCurrentEvents(key) 时,它会开始更新EventList-component 并且不会停止,因此浏览器中的选项卡会冻结。据我所知,我得到了无限循环更新之类的东西,我认为组件的方法有问题,但我无法理解错误在哪里。如何修复此错误?

商店代码:

class EventStore extends EventEmitter {
  constructor() {
    super();
    this.events = [{
        id: 1,
        title: 'title 1',
        date: '2017-04-11 09:14:01'
        }, {
        id: 2,
        title: 'title 2',
        date: '2017-04-11 09:24:01'
        }, {
        id: 3,
        title: 'title 3',
        date: '2017-04-12 09:14:01'
        }, {
        id: 4,
        title: 'title 4',
        date: '2017-11-12 19:14:01'
        }, {
        id: 5,
        title: 'title 5',
        date: '2017-06-13 19:00:01'
        }
    ];
  }

  getCurrentEvents(key) {
    var currentEvents = [];
    for (event in this.events){
        if (this.events[event].date.includes(key)) {
            currentEvents.push(this.events[event]);
        }
    }

    return currentEvents;
    this.emit("change");
  }

  createEvent(new_event) {
    this.events.push ({
        title: new_event.title,
        date: new_event.date
    })
    this.emit("change");
  }

  getAll() {
    return this.events
  }


  handleActions(action) {
    switch(action.type) {
        case 'CREATE_EVENT' : {
        this.createEvent(action.new_event);
      }
        case 'DISPLAY_CURRENT_EVENTS' : {
        this.getCurrentEvents(action.key);
      }
    }
  }
}

const eventStore = new EventStore;

dispatcher.register(eventStore.handleActions.bind(eventStore))

export default eventStore;

EventList组件代码:

export default class EventList extends React.Component {

      constructor () {
        super();
        this.state = {
            events: EventStore.getCurrentEvents()
        };
        this.displayEvents = this.displayEvents.bind(this);
      }

      componentWillMount() {
        EventStore.on("change", this.displayEvents)
      }

      displayEvents() {

        this.setState ({
                events: EventStore.getCurrentEvents()
        })
      }

      render() {
        console.log('form events LIST', this.state)

        const events = this.state.events ;
        var EventsList = [];

        for (event in events) {
            EventsList.push(
             <li key={events[event].id} id={events[event].id}>
                {events[event].title} , {events[event].date}
             </li>
             )
        }
        return (
        <div className="">
          <h3> Events on this day </h3>

          <ul className="event-list-wrapper">
             {EventsList}
          </ul>
        </div>
        );
      }
 }

【问题讨论】:

    标签: reactjs flux reactjs-flux


    【解决方案1】:

    看起来这是因为getCurrentEvents(key) 函数正在发出一个“更改”,它正在触发displayEvents...调用getCurrentEvents(key)...它发出一个调用displayEvents 的“更改”事件...

    【讨论】:

    • 非常感谢您的提示。我已经重新安排了一些方法,现在它可以工作了)
    猜你喜欢
    • 2016-09-12
    • 2016-02-01
    • 2021-06-29
    • 1970-01-01
    • 2019-10-30
    • 2019-02-08
    • 1970-01-01
    • 2022-11-23
    • 2016-08-08
    相关资源
    最近更新 更多