網站搜尋

javascript - 在 Redux 中作為 mapToDispatchToProps() 參數時,'dispatch' 不是一個函數


我正在使用 redux、react-redux 和 react 建立一個小型應用程式。出於某種原因,當我將 mapDispatchToProps 函數與 connect(react-redux 的綁定)一起使用時,當我試圖執行所得到的 prop 時,會收到一個 TypeError,提示 dispatch 不是一個函數。然而,當我以 prop 的形式呼叫 dispatch(參見提供的程式碼中的 setAddr 函數)時,它是可行的。

我很好奇為什麼會這樣,在 redux 文件的範例 TODO 應用程式中,mapDispatchToProps 方法也是以相同的方式設置的。當我在函數內使用 console.log(dispatch) 時,它顯示 dispatch 的類型是對象。我可以繼續以這種方式使用 dispatch,但在進一步使用 redux 之前,我想先了解為什麼會發生這種情況。我正在使用 webpack 與 babel-loaders 來編譯。

我的程式碼:

import React, { PropTypes, Component } from 'react';
import { connect } from 'react-redux';
import { setAddresses } from '../actions.js';
import GeoCode from './geoCode.js';
import FlatButton from 'material-ui/lib/flat-button';

const Start = React.createClass({
    propTypes: {
        onSubmit: PropTypes.func.isRequired
    },

    setAddr: function(){
        this.props.dispatch(
            setAddresses({
                pickup: this.refs.pickup.state.address,
                dropoff: this.refs.dropoff.state.address
            })
        )   

    },

    render: function() {
        return (
            <div>
                <div className="row">
                    <div className="col-xs-6">
                        <GeoCode ref='pickup' />
                    </div>
                    <div className="col-xs-6">
                        <GeoCode ref='dropoff' />
                    </div>
                </div>
                <div className="row">
                    <div className="col-xs-6">
                        <FlatButton 
                            label='Does Not Work'
                            onClick={this.props.onSubmit({
                                pickup: this.refs.pickup.state.address,
                                dropoff: this.refs.dropoff.state.address
                            })} 
                            />
                    </div>
                    <div className="col-xs-6">
                        <FlatButton 
                            label='Works'
                            onClick={this.setAddr} 
                            />
                    </div>
                </div>
            </div>
        );
    }
})

const mapDispatchToProps = (dispatch) => {
    return {
        onSubmit: (data) => {
            dispatch(setAddresses(data))
        }
    }
}

const StartContainer = connect(mapDispatchToProps)(Start)

export default StartContainer

答案#1

如果你想在沒有 mapStateToProps 的情況下使用 mapDispatchToProps,只需對第一個參數使用 null。

export default connect(null, mapDispatchToProps)(Start)

答案#2

你只是缺少了 connect 的第一個參數,那就是 mapStateToProps 方法。摘自 Redux 待辦事項應用程式:

const mapStateToProps = (state) => {
  return {
    todos: getVisibleTodos(state.todos, state.visibilityFilter)
  }
}

const mapDispatchToProps = (dispatch) => {
  return {
    onTodoClick: (id) => {
      dispatch(toggleTodo(id))
    }
  }
}

const VisibleTodoList = connect(
  mapStateToProps,
  mapDispatchToProps
)(TodoList)

答案#3

使用

const StartContainer = connect(null, mapDispatchToProps)(Start) 

而不是

const StartContainer = connect(mapDispatchToProps)(Start)