【问题标题】:TypeError: Redux Action is not a functionTypeError:Redux Action 不是函数
【发布时间】:2020-06-09 13:36:33
【问题描述】:

我试图用 mapDispatchToProps 将一个 redux 操作(setMarker)分派到一个组件中,但是每当我调用该操作时,我都会得到这个

TypeError: setMarker 不是函数

import React from 'react';
import { connect } from 'react-redux';

import { setMarker } from '../../redux/map/map.actions';

import './suggestion.styles.scss';

const Suggestion = (location, { setMarker }) => {
  const { area, city, address } = location;

  return (
    <div className="suggestion" onClick={() => console.log(setMarker)}>
      <i className="fas fa-map-marker-alt fa-2x"></i>
      <div className="address">
        <h3 className="location-title">{`${area}, ${city}`}</h3>
        <p className="location-desc">{address}</p>
      </div>
    </div>
  );
};

const mapDispatchToProps = {
  setMarker,
};

export default connect(null, mapDispatchToProps)(Suggestion);

我的动作文件包含以下代码

import mapActionTypes from './map.types';

export const setMarker = (location) => ({
  type: mapActionTypes.SET_MARKER,
  payload: location,
});

我的reducer文件包含以下代码

import mapActionTypes from './map.types';

const INITIAL_STATE = {
  location: {
    lat: 23.810331,
    lng: 90.412521,
  },
};

const mapReducer = (state = INITIAL_STATE, action) => {
  switch (action.type) {
    case mapActionTypes.SET_MARKER:
      return {
        ...state,
        location: action.payload,
      };

    default:
      return state;
  }
};

export default mapReducer;

【问题讨论】:

    标签: reactjs redux react-redux


    【解决方案1】:

    你需要像这样导入它:{ setMarker } 使它成为一个解构的道具

    或者你可以这样做

    const Suggestion = (props) =&gt; {

    然后调用

    props.setMarker()

    如果您还需要其他提示,您现在可以为mapDispatch 进行此操作

    const mapDispatchToProps = {
        setMarker
    }
    

    更容易阅读:)

    【讨论】:

    • 你能console.log(setMarker) 它给你什么?
    • 它说未定义:|
    • 到目前为止,您的反馈有何变化?你能把代码更新到最新的代码吗?
    • 你能试试这个吗? ({location, setMarker }) 而不是
    • 你只会得到一个 props 参数,你应该解构它。 {location, setMarker}
    【解决方案2】:

    如果Suggestion 是函数形式的反应组件,那么您将获得道具作为参数。如果你想直接访问它们,你应该使用对象解构语法,或者你可以使用props.setMarker

    const Suggestion = ({location, setMarker}) => {
      const { area, city, address } = location;
    
      return (
        <div className="suggestion" onClick={() => setMarker(location)}>
          <i className="fas fa-map-marker-alt fa-2x"></i>
          <div className="address">
            <h3 className="location-title">{`${area}, ${city}`}</h3>
            <p className="location-desc">{address}</p>
          </div>
        </div>
      );
    };
    

    【讨论】:

    • 该错误是源自mapDispatchToProps 还是源自onClick 内部?如果是前者,请检查导入路径。
    • 导入路径没问题,我也试过附加一个点击处理程序,但那里也有同样的错误,所以,认为它在 onClick 函数内
    • 使用({location, setMarker}) 而不是(location, { setMarker })
    • 谢谢你,我解构了(道具),它正在工作
    猜你喜欢
    • 1970-01-01
    • 2019-03-06
    • 2017-12-05
    • 2020-09-06
    • 1970-01-01
    • 2015-02-15
    • 2018-11-24
    • 1970-01-01
    • 2011-09-25
    相关资源
    最近更新 更多