【问题标题】:this.props.dispatch is not a function in react with reduxthis.props.dispatch 不是与 redux 反应的函数
【发布时间】:2019-04-17 01:07:32
【问题描述】:

我用 redux action 调用 api,所以我创建了 reducer、action 和 store。但是当我从视图部分调用 redux 操作时。我收到以下错误。

this.props.dispatch 不是函数

下面是我的reducer、actions和view部分(React)代码,可以帮助你理解代码。

注意:当我使用 console.log(this.props) 时,我没有得到 dispatch() 函数。

actions.js

import { 
 FETCH_WORKS_SUCCESS,
 FETCH_WORKS_FAILURE
} from './actionTypes'

export function fetchFeaturedWork(){
  return dispatch => {
   return fetch("https://api.com/api/wp-json/customapi/all_posts?category=work&featured=true")
   .then(res => res.json())
   .then(json => {
     dispatch(fetchFeaturedWorkSuccess(json.works));
     return json.works;
   })
  };
}

export const fetchFeaturedWorkSuccess = works => ({
   type: FETCH_WORKS_SUCCESS,
   payload: { works }
});

reducer.js

import {
 OPEN_MENU,
 CLOSE_MENU,
 SET_DEVICE_TYPE,
 FETCH_WORKS_SUCCESS,
 FETCH_WORKS_FAILURE
} from '../actions/actionTypes'

const initialState = {
 isMenuOpen: null,
 isMobile: false,
 error:null,
 works:[] 
}

const reducer = (state = initialState, action) => {
 switch (action.type) {
  case OPEN_MENU:
   return {...state, isMenuOpen: true}
  case CLOSE_MENU:
   return {...state, isMenuOpen: false}
  case SET_DEVICE_TYPE: 
   return {...state, isMobile: action.isMobile} 
  case FETCH_WORKS_SUCCESS:
   return {...state,works:action.payload.works}
  case FETCH_WORKS_FAILURE:
   return {...state,error:action.payload.error,works:[]}
  default:
   return state
 }
}

export default reducer;

store.js

import { createStore, applyMiddleware } from 'redux';
import rootReducer from './reducers/reducer';
import thunk from "redux-thunk";

let store = createStore(rootReducer,applyMiddleware(thunk))
export default store

App.js

import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import Slider from "react-slick";
import Footer from '../footer'
import './index.css';
import { connect } from 'react-redux'
import { openMenu,fetchFeaturedWork } from '../../actions/actionCreators'
import Header from '../header'
import arrowRight from '../../images/arrow-right.svg'
import arrowLeft from '../../images/arrow-left.svg'

const mapStateToProps = (state) => ({
  isMobile: state && state.isMobile
})

const mapDispatchToProps = (dispatch, ownProps) => ({
 openMenu: (isMobile) => dispatch(openMenu(ownProps.isMobile))
})

class Work extends Component {
  getImgSlider = (slider) => {
   this.imgSlider = slider
  }
  getTextSlider = (slider) => {
   this.textSlider = slider
  }
  componentDidMount(){
    this.props.dispatch(fetchFeaturedWork());
  }

  render() {
   let className = 'idz_work'
   if (this.props.isMobile) {
     className = 'idle'
   }
   return (
    <div>
     {
      this.props.isMobile ?
        null
        :
        <Link to='/home'>
          <div className='idz_sidebar' style={{ left: 0 }}>
            <div>
              <label>FEATURED</label>
            </div>
          </div>
        </Link>
    }
    <div className={className}>
      {!this.props.isMobile &&
        <Header logo="dark"/>
      }
      <div className="content">
        <label className="light-gray" style={this.props.isMobile ? { fontSize: '1.3rem' } : { fontSize: '2rem' }}>Featured Works</label>
        <hr style={this.props.isMobile ? { marginBottom: '0.5rem', marginTop: '0.5rem' } : {}} />
        <hr style={this.props.isMobile ? { marginBottom: '0.5rem', marginTop: '0.5rem' } : {}} />
        <label className="light-gray" style={this.props.isMobile ? { fontSize: '1.3rem' } : { fontSize: '2rem' }}>All Works</label>
        <hr style={this.props.isMobile ? { marginBottom: '0.5rem', marginTop: '0.5rem' } : {}} />
        <hr />
      </div>
      {this.props.isMobile ? null : <Footer />}
    </div>
  </div>
);
}
}

export default connect(mapStateToProps, mapDispatchToProps)(Work);

【问题讨论】:

标签: javascript reactjs redux


【解决方案1】:

当你使用 mapDispatchToProps 时,dispatch 在 props 中不再可用。所以,要么摆脱 mapDispatchToProps 并使用 this.props.dispatch。或者将所有调度函数移动到 mapDispatchToProps。

【讨论】:

  • 其实我不知道 mapDispatchToProps 的功能。你能解释一下它是什么吗?您可以看到,我使用了 this.props.dispatch 并收到错误“this.props.dispatch is not a function”
  • 它定义了一个 prop(函数类型)来向 store 发送一个动作。从您的代码openMenu: (isMobile) =&gt; dispatch(openMenu(ownProps.isMobile)) 来看,openMenu 是您定义的函数道具。它向商店发送一个动作 - openMenu()openMenu() 的结果是一个动作。
  • 移动 this.props.dispatch(fetchFeaturedWork()); 到 mapDispatchToProps 就像你在那里的其他功能一样。
  • 我已经完成但收到错误。你能编辑一下代码吗?
  • 我在我的代码中看到了。当我 console.log(this.props); 时我没有得到 dispatch() 函数;
猜你喜欢
  • 1970-01-01
  • 2016-08-19
  • 2020-02-26
  • 2020-10-02
  • 2020-11-08
  • 2017-11-24
  • 2022-01-04
  • 2018-08-22
  • 1970-01-01
相关资源
最近更新 更多