【问题标题】:Redux Router - "Dispatch is not defined"Redux 路由器 - “调度未定义”
【发布时间】:2016-07-27 12:20:56
【问题描述】:

我有一个简单的组件,它在用户加载页面时调用一个动作,在该动作中,我试图调度另一个动作来将商店的loggedIn 状态设置为真或假:

import React, { Component } from 'react'
import { Link, browserHistory } from 'react-router'
import $ from 'jquery'

class Login extends Component {

  constructor(props) {
    super(props)
  }
  componentDidMount() {
    this.props.actions.guestLoginRequest()
  }
  render() {
    return (
      <div>
        <div classNameName="container">
          <div className="row">
            We are signing you in as a guest
          </div>
        </div>
      </div>
    )
  }
}

export default Login

当调用guestLoginRequest 操作时,我可以获得登录信息,但是当我尝试在其中调度另一个操作时,什么也没有发生:

guestLoginRequest: function(){
    var ref = new Firebase("https://penguinradio.firebaseio.com");
    ref.authAnonymously(function(error, authData) {
      if (error) {
        console.log("Login Failed!", error);
      } else {
        console.log("Authenticated successfully with payload:", authData);
        return dispatch => {
          dispatch(actions.setLoginStatus(true, authData))
          console.log("dispatched");
        };
      }
    });
  }

当我删除return dispatch =&gt; { } 语句时,我收到Uncaught ReferenceError: dispatch is not defined 错误。在我的商店中,我使用的是 redux-thunk,所以我可以在动作内部调度:

// Store.js
import { applyMiddleware, compose, createStore } from 'redux'
import rootReducer from './reducers'
import logger from 'redux-logger'
import thunk from 'redux-thunk'

let finalCreateStore = compose(
  applyMiddleware(thunk, logger())
)(createStore)


export default function configureStore(initialState = { loggedIn: false }) {
  return finalCreateStore(rootReducer, initialState)
}

我也在我的 app.js 中将调度映射到道具:

function mapStateToProps(state) {
  return state
}
function mapDispatchToProps(dispatch) {
  return {
      actions: bindActionCreators(actions, dispatch)
  }
}

export default connect(mapStateToProps, mapDispatchToProps)(App)

以防万一,这是我的 client.js 和 reducer 文件:

// client.js
import React from 'react'
import { render } from 'react-dom'
import App from '../components/App'
import configureStore from '../redux/store'
import { Provider } from 'react-redux'


let initialState = {
  loggedIn: false
}

let store = configureStore(initialState)

render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('app')
)
// Reducer.js
import { combineReducers } from 'redux'

let LoginStatusReducer = function reducer(loggedIn = false, action) {
  switch (action.type) {
    case 'UPDATE_LOGIN_STATUS':
      return loggedIn = action.boolean
    default:
      return loggedIn
  }
}
export default LoginStatusReducer

const rootReducer = combineReducers({
  loggedIn: LoginStatusReducer
})

export default rootReducer

任何想法为什么我的调度功能不起作用?我很困惑,因为我确实用我的商店设置了 redux-thunk,当我调用 return dispatch =&gt; { } 时,我使用的代码类似于文档。有什么我想念的吗?提前感谢您的任何建议!

【问题讨论】:

    标签: javascript reactjs redux react-redux redux-thunk


    【解决方案1】:

    您需要您的操作返回一个函数以利用 thunk 中间件,然后 redux 会将调度程序注入其中。您将调度程序调用与实现细节混合在一起。以下 sn-p 修复了这两个缺陷。

    guestLoginRequest: function(){
      return function (dispatch) {
        var ref = new Firebase("https://penguinradio.firebaseio.com");
        ref.authAnonymously(function(error, authData) {
          if (error) {
            console.log("Login Failed!", error);
          } else {
            console.log("Authenticated successfully with payload:", authData);
            dispatch(actions.setLoginStatus(true, authData))
            console.log("dispatched");
          }
        });
      }
    }
    

    此外,您需要在 Login 类上正确调度您的操作。

    dispatch(this.props.actions.guestLoginRequest())
    

    您的操作调用始终通过调用dispatch 来完成。流程应该是这样的:

    React component --> dispatch ---> API call (thunk middleware) --> dispatch ---> reducer
    

    【讨论】:

    • 我已将我的操作替换为您在上面发布的操作,并更新了 Login.js 上的调度调用,但我在 Login.js 文件中收到“未定义调度”。我必须将该函数传递给登录组件吗?我还应该调用返回函数(dispatch)而不是返回函数(dispatcher)吗?
    • 您需要在商店的dispatch 周围公开一个包装器(通过 mapDispatchToProps)或直接获取商店的调度程序(store.dispatch)。这是一个实现示例:组件 - github.com/mattlo/consultant-app/blob/master/src/client/… 存储导出 - github.com/mattlo/consultant-app/blob/master/src/client/data/…
    • 我已经更新了我的答案以包含我的mapDispatchToProps 函数,看起来对吗?
    猜你喜欢
    • 2017-01-17
    • 2018-10-03
    • 2019-10-11
    • 1970-01-01
    • 2021-11-28
    • 2020-07-20
    • 2012-09-01
    • 1970-01-01
    • 2017-01-20
    相关资源
    最近更新 更多