当前位置: 首页 > 知识库问答 >
问题:

redux-mapdispatchtoprops-typeerror:_this.props.setCurrentUserHandle不是函数

阳念
2023-03-14

我试图让一个简单的react-redux应用程序工作,但我遇到了一个奇怪的错误,我无法解决。我正在尝试简单地设置我当前用户的名字和处理商店,一个设置函数工作,而另一个不。

setCurrentUserFirstName-工作setCurrentUserHandle-不工作


    import React, { Component } from 'react';
    import { Link } from 'react-router';
    import { connect } from 'react-redux';
    import store from '../../store';
    var Utilities = require('../../../common/commonutilities.js');
    var RestClient = require('../../../common/restClient.js');

    //actions
    import { setCurrentUserHandle, setCurrentUserFirstName } from '../../actions/userActions';

    class Header extends Component {
      constructor(props) {
        super(props);

        this.state = {};

        RestClient.api.fetchGet('/getcurrentuser', (response) => {
          if(response.success) {
            this.setState({
              isAuthenticated: true,
              currentUser: response.currentUser
            });

            store.dispatch({
              type: 'USER_DID_LOGIN',
              userLoggedIn: true
            });

            //works fine
            this.props.setCurrentUserFirstName(response.currentUser.firstName);      

            //doesn't work and throws the error: "TypeError: _this.props.setCurrentUserHandle is not a function"
            this.props.setCurrentUserHandle(response.currentUser.handle);

          }
        },
        (err) => {
          console.log(err);
        });
      }

      render() {
        return (
          

            {this.props.user.currentUserFirstName}, {this.props.user.currentUserHandle}

          

        );
      }

    }

    const mapStateToProps = function(store) {
      return {

             //user properties
             user: store.userState
      };
    };

    const mapDispatchToProps = (dispatch) => {

          return{
            setCurrentUserFirstName: (currentUserFirstName) =>{
              dispatch(  setCurrentUserFirstName(currentUserFirstName));
            }
          }

          return{
            setCurrentUserHandle: (currentUserHandle) =>{
              dispatch(  setCurrentUserHandle(currentUserHandle));
            }
          }     

    };


    //connect it all
    export default connect(mapStateToProps, mapDispatchToProps)(Header);

我将它们作为操作放在useractions.js文件中


    export function  setCurrentUserFirstName(currentUserFirstName){
            return{
                    type:  'SET_CURRENT_USER_FIRST_NAME',
                    payload: currentUserFirstName
            };      
    }


    export function  setCurrentUserHandle(currentUserHandle){
            return{
                    type: 'SET_CURRENT_USER_HANDLE',
                    payload: currentUserHandle
            };      
    }

在减速器中


    const initialUserState = {
      user: {}, 
      currentUserFirstName:[],
      currentUserHandle:[]
    };

    // The User reducer
    const userReducer = (state = initialUserState, action) => {

      //using newState object to be immutable
            let newState = state;

            switch (action.type) {

              case 'SET_CURRENT_USER_FIRST_NAME':
                    newState = {
                      ...state,   
                      currentUserFirstName:  action.payload 
                };
                break;

              case 'SET_CURRENT_USER_HANDLE':
                    newState = {
                      ...state,   
                      currentUserHandle:  action.payload
                };
                break;

                break;

              default:
            break;
      }

      return newState;
    };

    export default userReducer;

我有什么不对的?

共有2个答案

明财
2023-03-14

除了Tony的正确答案之外,我高度鼓励您改用mapdispatch的“对象速记”形式。您可以将一个充满操作创建者的对象作为第二个参数传递给connect(),而不是一个实际的mapdispatch函数。在你的情况下,它看起来像:

import { setCurrentUserHandle, setCurrentUserFirstName } from '../../actions/userActions';

const actionCreators =  { setCurrentUserHandle, setCurrentUserFirstName };

class Header extends Component {}


export default connect(mapStateToProps, actionCreators)(Header);    
裘嘉木
2023-03-14

您的mapdispatchtoprops中有两个return语句--第二个语句永远不会到达。您可以返回单个对象,如下所示:

const mapDispatchToProps = (dispatch) => {
      return{
        setCurrentUserFirstName: (currentUserFirstName) =>{
          dispatch(  setCurrentUserFirstName(currentUserFirstName));
        },
        setCurrentUserHandle: (currentUserHandle) =>{
          dispatch(  setCurrentUserHandle(currentUserHandle));
        }
      }  
};
 类似资料:
  • 问题内容: 我正在尝试在React中创建一个项目,并且正在使用Firebase。在我的react-redux- firebase项目中,有一行代码出错,但我无法解决。如何解决此“ TypeError:Object(…)不是函数” 我已经搜索了此问题,但无法解决该问题。 我正在关注一个React版本为16.4.1的教程。我不确定这是否是问题 index.js文件 如果我注释掉reatReduxFir

  • 有人能给我解释一下为什么Redux有两个函数mapStateToProps和mapDispatchToProps都将道具添加到容器中吗? 定义: MapStateTops是一个帮助组件获得更新状态(由其他组件更新)的实用程序 mapDispatchToProps是一个实用程序,它将帮助您的组件触发操作事件(调度操作可能导致应用程序状态的更改) 为什么Redux团队选择将其分为两个映射函数——也就是

  • 问题内容: 我正在尝试创建一个简单的AJAX请求,该请求从MySQL数据库返回一些数据。这是我的以下功能: …在这里我称之为解析所需的参数: 但是,我的成功回调未运行(因为“成功!”未记录到控制台),并且在控制台中出现错误: 这是什么意思?在成功事件触发$ .ajax内部的匿名函数之前,我已经完成了AJAX请求,但是现在我试图运行一个单独的命名函数(在本例中为回调)。我该怎么办? 问题答案: 这里

  • 我正在创建一个简单的AJAX请求,它从数据库返回一些数据。下面是我的函数: 这就是我称之为它的地方,提供了所需的参数: 但是,回调没有运行,相反,我在控制台中得到一个错误: 为什么?我以前做过AJAX请求,成功事件会触发$.AJAX中的匿名函数,但现在我尝试运行一个单独命名的函数。我该怎么办?

  • 我用创建了一个简单的React-app,它在本地主机上运行良好。我现在正在尝试对应用程序进行Dockerify。这是我的包裹。json: 这是我的Dockerfile: 我用以下方法构建图像: 然后我运行图像作为一个容器: 这抛出: $docker run--发布3000:3000 yeet yeet@0.1.0生产/应用程序npm运行构建 yeet@0.1.0生成/应用程序响应脚本生成 /app

  • 我在WordPress插件中有一个简单的jQuery脚本,它使用了如下jQuery包装器: 我从WordPress仪表板中调用这个脚本,并在jQuery框架加载后加载它。 当我检查Firebug中的页面时,我总是收到错误消息: TypeError:$不是函数 $(document).Ready(function(){ 我是否应该将脚本包装在这个函数中: 这个错误我已经犯了好几次了,不知道该怎么处理