开发者问题收集

React-redux 操作未定义

2017-05-16
12076

我试图用 redux 动作调用 API 但每次我在 componentDidMount 函数中调用它时,它都会给我一个错误,指出我的函数未定义..我很困惑,我一直在使用我过去的 redux 项目作为参考,它使用相同的方法,但它有效。

看看我的代码

Reducer

import * as types from '../actions/actionconst';

const initialState = {
  isfetching: false,
  categories: [],
  error: null
}
const categoryReducer = (state = initialState, action) => {
  switch(action.type){
    case types.FETCH_CATEGORIES:
    console.log('in fetch categories');
    state = {
      ...state,
      isfetching: true,
      categories: action.payload
    }
    break;
    case types.FETCH_CATEGORIES_SUCCESS:
    state ={...state, categories: action.payload, isfetching: false}
    break;

    case types.FETCH_CATEGORIES_ERROR:
    state = {...state, isfetching: false, error: action.payload}
  }
  return state;
}

export default categoryReducer

Action

import * as types from './actionconst';
import categoryAPI from '../api/categoryAPI';

export function getCategory(){

  return {dispatch => {
    fetch("http://localhost:8000/api/v1/categories")
    .then((response) => response.json())
    .then((responseData) => {
      dispatch({
        type: types.FETCH_CATEGORIES
        payload: responseData
      })
    })
    .catch((err) => {
      dispatch({type: types.FETCH_CATEGORIES_ERROR, payload: err});
    })
  }}
}

Container

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

import Category from '../components/category';

class CategoryContainer extends Component{
  constructor(props){
    super(props);
    console.log('category props', this.props);
  }
  componentDidMount(){
    console.log('masuk CDM');
    this.props.fetchCategory()
  }

  render(){
    var viewtypequery = window.innerWidth >= 1025 ? "computers" : "mobile"
    return(
      <Category alphabets={this.state.alph}
        categorylist={this.state.categoriestemp}
        view={viewtypequery}
        active={this.state.isActive}
      />
    )
  }

}

const mapStateToProps = (state) => {
  console.log('state is', state);
  return{
    categories: state.category
  }
}

const mapDispatchToProps = (dispatch) => {
    return{
      fetchCategory: () => {
        console.log('cuk ta');
        dispatch(getCategory())
      }
    }
}

export default connect(mapStateToProps, mapDispatchToProps)(CategoryContainer)

我不知道我是否错过了什么,我已经有一段时间没有接触这个项目了,一直在重新观看 redux 教程,但我仍然找不到任何解决方案..

2个回答

我没有看到您在组件中导入 getCategory 操作。我通常会这样写:

import { getCategory } from '../path-to-action';
.......

export default connect(mapStateToProps, {getCategory})(CategoryContainer)

然后直接在 componentDidMount 生命周期方法中使用它:

  componentDidMount(){
    this.props.getCategory()
  }
Simeon Simeonoff
2017-05-16

嗨,Arga,尝试使用 redux 中的 bindActionCreators。将代码更改为

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

import Category from '../components/category';
import CategoryActions from '../actions/category'; // notice this will be your category actions file

class CategoryContainer extends Component{
  constructor(props){
    super(props);
    console.log('category props', this.props);
  }
  componentDidMount(){
    console.log('masuk CDM');
    this.props.getCategory(); // change here we call function from props binded to category component, this function is defined in your actions file
  }

  render(){
    var viewtypequery = window.innerWidth >= 1025 ? "computers" : "mobile"
    return(
      <Category alphabets={this.state.alph}
        categorylist={this.state.categoriestemp}
        view={viewtypequery}
        active={this.state.isActive}
      />
    )
  }

}

const mapStateToProps = (state) => {
  console.log('state is', state);
  return{
    categories: state.category
  }
}

const mapDispatchToProps = (dispatch) => {
    return bindActionCreators(CategoryActions, dispatch) // notice change here we use bindActionCreators from redux to bind our actions to the component
}

export default connect(mapStateToProps, mapDispatchToProps)(CategoryContainer)

希望有帮助。

Rishabh Bhatia
2017-05-16