代码之家  ›  专栏  ›  技术社区  ›  tcoulson

mapDispatchToProps未将my ActionCreator设置为函数

  •  0
  • tcoulson  · 技术社区  · 7 年前

    我有以下代码:

    import React, {Component} from 'react';
    import {connect} from 'react-redux';
    import {bindActionCreators} from 'redux';
    import {getAgeOptions, getGenderOptions} from '../actions/options-actions';
    import ItemTextEdit from '../components/ItemTextEdit';
    import DropSelect from '../containers/DropSelect';
    
    export class BookDetail extends Component{
        render(){
            if(!this.props.book){
                return <div>Select a book to get started.</div>;
            }
    
    console.log(this.props.getGenderOptions());
            return(
               <div>
    ...other code was here to display
                </div>
            )
        }
    }
    
    function mapDispatchToProps(dispatch){
        return bindActionCreators({getAgeOptions:getAgeOptions, getGenderOptions:getGenderOptions}, dispatch);
    
    }
    
    function mapStateToProps(state){
        return{
            book: state.activeBook
        };
    }
    export default connect(mapStateToProps, mapDispatchToProps)(BookDetail);
    

    当我用“console.log(this.props.getGenderOptions);”运行此代码时它的控制台注销了一个f(){},但当我尝试在上面调用它时,它给出了以下错误:

    TypeError:此。道具。getGenderOptions不是函数 以下是操作创建者:

    import axios from 'axios';
    
    const ROOT_URL = `http://localhost:8080/`;
    const ROOT_OPTIONS_URL = `${ROOT_URL}options`;
    
    export const GET_GENDER_OPTIONS = 'GET_GENDER_OPTIONS';
    export const GET_AGE_OPTIONS = 'GET_AGE_OPTIONS';
    
    export function getGenderOptions() {
        const url = `${ROOT_OPTIONS_URL}/gender`;
        const request = axios.get(url);
        return {
            type: GET_GENDER_OPTIONS,
            payload: request
    
        }
    }
    
    export function getAgeOptions() {
        const url = `${ROOT_OPTIONS_URL}/age`;
        const request = axios.get(url);
        return {
            type: GET_AGE_OPTIONS,
            payload: request
    
        }
    }
    

    我不知道为什么我不能恢复我的函数。

    2 回复  |  直到 7 年前
        1
  •  1
  •   jovi De Croock    7 年前

    执行axios请求时,您应该等待, axios.get() 返回一个承诺,因此在您的情况下,您必须(对于其他函数也是如此):

    export async function getAgeOptions() {
      const url = `${ROOT_OPTIONS_URL}/age`;
      const request = await axios.get(url);
      return {
        type: GET_AGE_OPTIONS,
        payload: request
      }
    }
    

    这将 resolve reject 你的承诺给了你想要的产出。有关此主题的更多信息,请访问: https://developer.mozilla.org/nl/docs/Web/JavaScript/Reference/Global_Objects/Promise

    同时使用 connect() 从…起 react-redux 极大地提高了代码的可读性,它是一个高阶组件,可以用 mapStateToProps mapDispatchToProps .

        2
  •  1
  •   Oblosys    7 年前

    您很可能使用导出的 BookDetail 直接导出,而不是默认的连接导出。因此,移除 export 中的关键字 书籍详细信息 类声明,因此当您意外地直接按名称导入时,将出现错误。

    在导入站点,替换 import { BookDetail } from ... 通过

    import BookDetail from ...