javascript - React Flux 存储发出事件不起作用

标签 javascript reactjs reactjs-flux flux

由于某种原因,EventEmitter 的发出事件不起作用。
HomeStore.emit(CHANGE_EVENT)
这是因为我使用了 Coffeescript 吗?

我尝试将 5 篇文章作为初始状态提取到数组中。 当商店发出更改事件时,组件中的 _onChange 方法应调用 HomeStore.newsLatest() 来更新列表。

Home.js.jsx.coffee

  HomeActions = require "../actions/HomeActions.js.coffee"
  HomeStore = require "../stores/HomeStore.js.coffee"

  Latest = React.createClass {

    getInitialState: ->

      {
        list_latest: HomeActions.fetchLatest(1)
      }
    componentWillMount: ->
      HomeStore.addChangeListener(this._onChange)
    componentDidMount: ->

    componentWillUnmount: ->
      HomeStore.removeChangeListener(this._onChange)
    _onChange: ->
      this.setState {list_latest: HomeStore.newsLatest()}
      console.log "update list_latest"
    render: ->
      `<article className="post-article article clearfix">
      <h2 className="title awesome">
          adfsda
      </h2>
      </article>
      `

  }

HomeActions.js.coffee

HomeDispatcher = require "../dispatchers/HomeDispatcher.js.coffee"
HomeConstants = require "../constants/HomeConstants.js.coffee"

HomeActions =
  fetchLatest: (page) ->
    HomeDispatcher.handleAction {
      actionType: HomeConstants.FETCH_LATEST,
      page: page
    }
  fetchPopular: ->
    HomeDispatcher.handleAction {
      actionType: HomeConstants.FETCH_POPULAR
    }
  fetchFacebook: ->
    HomeDispatcher.handleAction {
      actionType: HomeConstants.FETCH_FACEBOOK
    }

module.exports = HomeActions

HomeStore.js.coffee

HomeDispatcher = require('../dispatchers/HomeDispatcher.js.coffee')
HomeConstants = require('../constants/HomeConstants.js.coffee')
objectAssign = require('object-assign')
EventEmitter = require('events').EventEmitter
CHANGE_EVENT = 'change'

_newsLatest =

  list: []
  set: (data) ->
    console.log "set #{data}"
    @list = data

_newsPopular =
  list: []

_newsFacebook =
  list: []

HomeStore = objectAssign({}, EventEmitter.prototype,
  addChangeListener: (callback) ->
    this.on(CHANGE_EVENT, callback)
  removeChangeListener: (callback) ->
    this.removeListener(CHANGE_EVENT, callback)
  newsLatest: ->
    _newsLatest.list
  setData: (d) ->
    _newsLatest.set d
  newsPopular: ->
    _newsPopular.list
  newsFacebook: ->
    _newsFacebook.list
)

HomeDispatcher.register (payload) ->
  action = payload.action
  switch action.actionType
    when HomeConstants.FETCH_LATEST
      console.log 'FETCH_LATEST'

      $.ajax
        url: HomeConstants.API_URL + action.page
        dataType: "json"
        method: "get"
        success: (res) ->
          HomeStore.setData res.articles

      HomeStore.emit(CHANGE_EVENT)
    when HomeConstants.FETCH_POPULAR
      console.log 'FETCH_POPULAR'
      return HomeStore.emit(CHANGE_EVENT)
    when HomeConstants.FETCH_FACEBOOK
      console.log 'FETCH_FACEBOOK'
      return HomeStore.emit(CHANGE_EVENT)
    else
      true

module.exports = HomeStore

最佳答案

我认为您没有在正确的时间附加事件监听器。

componentWillMount: ->
  HomeStore.addChangeListener(this._onChange)

这会尝试在安装组件之前向组件添加更改监听器。尝试将其添加到 componentDidMount:

componentDidMount: ->
  HomeStore.addChangeListener(this._onChange)

编辑(以反射(reflect)评论):

switch action.actionType
  when HomeConstants.FETCH_LATEST
    console.log 'FETCH_LATEST'

    $.ajax
      url: HomeConstants.API_URL + action.page
      dataType: "json"
      method: "get"
      success: (res) ->
        HomeStore.setData res.articles
        HomeStore.emit(CHANGE_EVENT)
    return

关于javascript - React Flux 存储发出事件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31768878/

相关文章:

javascript - 如何使用 jquery 获取特定类中的 ID 列表?

javascript - 更新使用 Object.assign 创建的变量中的数组也会更新原始变量

javascript - 转换后向用户显示文件

css - React中的Bootstrap 4 Scrollspy无法正常工作

reactjs - 如何在触发 onerror 时替换图像。 react js

javascript - 带有 Flux 的嵌套循环 React 组件,更改父级或子级的监听器?

javascript - 如何在 React FLUX 中创建 API 调用?

javascript - AngularJS 中是否有可能捕获 "load denied by x-frame option"错误?

javascript - 使用 Redux 在调度内传递许多 props

react-flux 中的 Javascript 获取 API