简体   繁体   English

Redux开发人员工具状态图显示减速器正在更新另一个减速器

[英]Redux dev tool state chart shows that reducer is updating another reducer

I have implemented a simple counter reducer with actions like 'increment', 'decrement' and so on. 我已经实现了一个简单的计数器减少器,它具有“增加”,“减少”等动作。 I have 'save' action that is supposed to save current counter value in array. 我有“保存”操作,应该将当前计数器值保存在数组中。

I have also implemented another reducer that is supposed to fetch some data on load and save it to an array. 我还实现了另一个reducer,应该在加载时获取一些数据并将其保存到数组中。

When I dispatch 'save' action to counter reducer Redux Dev tool state chart shows that fetch reducer is also updating. 当我将“保存”操作分派到计数器reducer时,Redux Dev工具状态图显示fetch reducer也正在更新。 It is not changing any values of fetch reducer but chart shows strange behaviour. 它没有更改fetch reducer的任何值,但图表显示了奇怪的行为。

I probably have a misstake into how I am using the fetch reducer or both. 我可能对我如何使用fetch reducer或两者兼而有之。

App.js (container component) App.js(容器组件)

    import React, { Component } from 'react';
    import { connect } from 'react-redux'
    import logo from './logo.svg';
    import './App.css';
    import Counter from './components/Counter'
    import Data from './components/Data'
    import {
      increaseAction,
      decreaseAction,
      resetAction,
      saveAction,
      removeAction,
      fetchData
    } from './actions'

    class App extends Component {
      componentDidMount() {
        // the only thing i dispatch to fetch reducer
        const response = [1,2,3,4,5,6,7,8]
        this.props.fetchData(response);
      }
      render() {
        return (
          <div className="App">
            <div className="App-header">
              <img src={logo} className="App-logo" alt="logo" />
              <h2>Welcome to React</h2>
            </div>
            <p className="App-intro">
              To get started, edit <code>src/App.js</code> and save to reload.
            </p>
            <Counter
              onIncreaseClick={this.props.onIncreaseClick}
              onDecreaseClick={this.props.onDecreaseClick}
              onResetClick={this.props.onResetClick}
              onSaveClick={this.props.onSaveClick}
              onRemoveClick={this.props.onRemoveClick}
              value={this.props.counterValue}
              savedCounter={this.props.savedCounter}
            />
            <Data data={this.props.fetch}/>
          </div>
        );
      }
    }

  // Map Redux state to component props
  function mapStateToProps(state)  {
    let counter = state.counter
    let fetch = state.fetch
    return {
      counterValue: counter.count,
      savedCounter: counter.saved,
      fetch: fetch.data
    };
  }

  // Map Redux actions to component props
  function mapDispatchToProps(dispatch) {
    return {
      onIncreaseClick: () => dispatch(increaseAction),
      onDecreaseClick: () => dispatch(decreaseAction),
      onResetClick: () => dispatch(resetAction),
      onSaveClick: () => dispatch(saveAction),
      onRemoveClick: () => dispatch(removeAction),
      fetchData: (data) => dispatch(fetchData(data))
    };
  }

  export default connect(mapStateToProps, mapDispatchToProps)(App)

Here are my reducers(they are in separate files) 这是我的减速器(它们在单独的文件中)

    // Reducer:
    function counter(state={count: 0, saved: []}, action) {
      let count = state.count;
      let saved = state.saved;
      switch(action.type){
        case 'increase':
          return {
            ...state,
            count: count  + 1
          };
        case 'decrease':
          if (count === 0) {
            return {...state, count: count }
          }
          return {
            ...state,
            count: count - 1
          };
        case 'reset':
          return {
            ...state,
            count: count  = 0
          };
        case 'save':
          return {
            ...state,
            saved: [...saved, count]
          };
        case 'remove':
          return {
            ...state,
            saved: [...saved.slice(0, -1)]
          };
        default:
          return state;
      }
    }

    export default counter

    // Reducer:
    function fetch(state={data: []}, action) {
      console.log("When I call 'save' this is also invoked");
      switch(action.type){
        case 'fetch':
        return {...state, data: [...action.payload] }
        default:
          return state;
      }
    }

    export default fetch

Actions: 操作:

    export const increaseAction = {type: 'increase'};
    export const decreaseAction = {type: 'decrease'};
    export const resetAction = {type: 'reset'};
    export const saveAction = {type: 'save'};
    export const removeAction = {type: 'remove'};
    export const FETCH_DATA = 'fetch';

    export function fetchData(payload) {
      return {
        type: FETCH_DATA,
        payload: payload,
      }
    }

How I create my store(note this logic is all situated in index.js for simplicity): 我如何创建商店(请注意,为简单起见,此逻辑全部位于index.js中):

    // Combine all application reducers
    const appStore = combineReducers({
      counter,
      fetch
    })


    // Store configuration
    const loggerMiddleware = createLogger()
    let store = createStore(
      appStore,
      // only for dev
      window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__(),
      applyMiddleware(
        loggerMiddleware
      )
    )

See what's the problem in a video: https://youtu.be/oKOkU_VjZ7E 观看视频中的问题: https//youtu.be/oKOkU_VjZ7E

Try it out: https://github.com/kdichev/personal-portfolio/tree/feature/add-create-redux-react-app 试试看: https : //github.com/kdichev/personal-portfolio/tree/feature/add-create-redux-react-app

当您分派任何动作时,即设计使然,所有reduce都会被调用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM