【问题标题】:Redux action not triggering reducersRedux 操作未触发减速器
【发布时间】:2018-04-05 01:37:25
【问题描述】:

问题

我将我的 react 应用程序与 Redux 存储连接起来,添加了一个 api 操作来从我的后端收集数据,包括中间件 redux-promise。大多数一切似乎都可以工作,因为我可以在 React Web 编辑器中看到我的商店以及组合减速器键。当我调用我的操作时,它会起作用并且控制台会记录完成的承诺。但是,我的减速器从不运行。我认为这是我在主容器上调度的问题,但我已经尝试了此时我能想到的所有方法 - 常规调度()和 bindActionCreators。帮助!

Index.js

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App.js';
import { createStore, applyMiddleware } from 'redux';
import { Provider } from 'react-redux';
import promiseMiddleware from 'redux-promise';
import RootReducer from './reducers';

const createStoreWithMiddleware = applyMiddleware(promiseMiddleware)(createStore)

let store = createStore(RootReducer);

ReactDOM.render(
            <Provider store={store}>
                <App />
            </Provider>, 
            document.getElementById('root'));`

组合减速器

import { combineReducers } from 'redux';
import ReducerGetPostings from './reducer_get_postings'

const rootReducer = combineReducers({
    postingRecords: ReducerGetPostings
})

export default rootReducer;

减速器

import { FETCH_POSTINGS } from '../actions/get_postings'

export default function (state = null, action) {
    console.log('action received', action)
    switch (action.type) {
        case FETCH_POSTINGS:
            return [ action.payload ]
    }
    return state;
}

动作 API

import axios from 'axios';
import { url } from '../api_route';

export const FETCH_POSTINGS = 'FETCH_POSTINGS'

export function fetchpostings() {
    const postingRecords = axios.get(`${url}/api/postings`)

    console.log('Postings', postingRecords)
    return {
        type: FETCH_POSTINGS,
        payload: postingRecords
    };
}

容器

import { connect } from 'react-redux';
import { bindActionCreators } from 'redux'
import { fetchpostings } from '../../actions/get_postings.js'

class Dashboard extends Component {

    //....lots of other functionality already built here.

    componentDidMount() {
      axios.get(`${url}/api/postings`)
        .then(res => res.data)
        .then(
          (postingRecords) => {
            this.setState({
              postingData: postingRecords,
              postingOptions: postingRecords
            });
          },
          (error) => {
            this.setState({
              error
            })
          }
        )
    // primary purpose is to replace the existing api call above with Redux Store and fetchpostings action creator

        fetchpostings()
    }
}

function mapDispatchToProps(dispatch) {
   // return {actions: bindActionCreators({ fetchpostings }, dispatch)}
  return {
    fetchpostings: () => dispatch(fetchpostings())
  }
}

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

【问题讨论】:

    标签: javascript reactjs redux react-redux reducers


    【解决方案1】:

    您没有调度您的操作,当您在 componentDidMount 中调用 fetchpostings() 时,您调用的是从 actions/get_postings.js 导入的方法,而不是将调度的方法。

    改用this.props.fetchpostings()

    您也没有将状态绑定到您需要这样做的道具。

    【讨论】:

    • 这是一个关键点。调用从 actions/get_postings.js 导入的方法仍然会调用 action 方法,但没有发生什么事情(就 action 调度和 reducer 无论如何都会拾取调度的 action 而言),因为它没有被调度。我完全忘记了这一点,浪费了很多时间,直到看到 HMR 的答案。
    猜你喜欢
    • 2017-10-18
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    相关资源
    最近更新 更多