丶明旭 2022-03-05 13:10 采纳率: 100%
浏览 22
已结题

最近在学习redux和react-redux,写了一个小计数器,遇到了一个bug。

redux&react-redux

源码

src/components/Count/index.js

import React from 'react'

function Count(props) {
  
  const { add, sub, pow, mul, div } = props

  return(
    <>
      <p>{props.num}</p>
      <button onClick={()=>add(1)}>加</button>
      <button onClick={()=>sub(1)}>减</button>
      <button onClick={()=>pow()}>幂</button>
      <button onClick={()=>mul(2)}>乘</button>
      <button onClick={()=>div(2)}>除</button>
    </>
  )
}

export default Count

src/container/Count/index.js

import { connect } from "react-redux";
import Count from "../../components/Count";
import { bindActionCreators } from "redux";
import * as mathActions from '../../actions/countAction'

const mapStateToProps = state => {
  return {
    num: state.num
  }
}
const mapDispatchToProps = dispatch => {
  return bindActionCreators(mathActions, dispatch)
}

export default connect(mapStateToProps, mapDispatchToProps)(Count)

src/App.js

import { Provider } from "react-redux";
import Count from './containers/Count'
import rootReducer from "./reducers";
import {createStore} from 'redux'

const store = createStore(rootReducer)

function App() {
  return (
    <Provider store={store}>
      <Count />
    </Provider>
  );
}

export default App;

src/reducers/index.js

import { combineReducers } from "redux";
import countReducer from "./countReducer";

const rootReducer = combineReducers({
  countReducer
})

export default rootReducer

src/reducers/countReducer.js

import { ADD, SUB, POW, MUL, DIV,} from '../constans/ActionTypes'

const initialState = { num: 0 }

const countReducer = (state = initialState, action) => {
  console.log(action);
  switch (action.type) {
    case ADD:
      return { num: state.num + action.num }
    case SUB:
      return { num: state.num - action.num }
    case POW:
      return { num: state.num * state.num }
    case MUL:
      return { num: state.num * action.num }
    case DIV:
      return { num: state.num / action.num }
    default:
      return state
  }
}

export default countReducer;

src/constans/ActionTypes.js

const ADD = 'ADD'
const SUB = 'SUB'
const POW = 'POW'
const MUL = 'MUL'
const DIV = 'DIV'
export { ADD, SUB, POW, MUL, DIV }

src/actions/countAction.js

import { ADD, SUB, POW, MUL, DIV } from '../constans/ActionTypes'

const add = (num) => {
  return {
    type: ADD,
    num,
  }
}
const sub = (num) => {
  return {
    type: SUB,
    num,
  }
}
const pow = () => {
  return {
    type: POW,
  }
}
const mul = (num) => {
  return {
    type: MUL,
    num,
  }
}
const div = (num) => {
  return {
    type: DIV,
    num,
  }
}

export { add, sub, pow, mul, div }

页面效果

img

无法渲染出num,但是可以触发dispatch,数据改变是正常的。

但是如果修改src/App.js,直接使用countReducer创建store页面显示却是正常的。

src/App.js

import { Provider } from "react-redux";
import Count from './containers/Count'
// import rootReducer from "./reducers";
import countReducer from './reducers/countReducer'
import {createStore} from 'redux'

const store = createStore(countReducer)

function App() {
  return (
    <Provider store={store}>
      <Count />
    </Provider>
  );
}

export default App;

效果:

img

img

测试了很长时间,个人感觉应该是src/reducers/index.js文件出了问题,但是没有找出来!

src/reducers/index.js

import { combineReducers } from "redux";
import countReducer from "./countReducer";

const rootReducer = combineReducers({
  countReducer
})

export default rootReducer

是我combineReducers的用法不对吗?!!

望指教!

  • 写回答

1条回答 默认 最新

  • _雪菜肉丝面_ 2022-03-06 16:54
    关注

    我的想法:combineReducers是用来组合Store的,所以传数据的地方需要加上对应别名

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月6日
  • 已采纳回答 3月6日
  • 创建了问题 3月5日

悬赏问题

  • ¥15 用lstm来预测股票价格
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上