【问题标题】:Not able to get counter working using redux无法使用 redux 让计数器工作
【发布时间】:2020-10-19 05:39:21
【问题描述】:

我正在学习 redux,但我无法让计数器工作。我设置了 action.js、reducer.js 和 store.js,并在 index.js 中创建了一个商店和一个提供者。我还在 App.js 中将 react-redux 用于 useSelector 和 useDispatch 我不知道我在这里缺少什么。

点击 App.js 时,计数器似乎没有增加。我在这里错过了什么?

非常感谢,提前:

//Reducer.js

const counterReducer = (state = 0,action) => {
    switch(action.type){
        case "INCREMENT":
            return state + action.payload
        case "DECREMENT":
            return state - action.payload
        default:
            return state
    }
}

export default counterReducer


//Action.js

const increment = (steps) => {
    return {
        type: 'INCREMENT',
        payload: steps
    }
}

const decrement = (steps) => {
    return {
        type: 'DECREMENT',
        payload: steps
    }
}


//store.js

import {createStore} from 'redux'
import counterReducer from './reducer'

const myStore = createStore(counterReducer)

export default myStore


//index.js

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
import {Provider} from 'react-redux'
import myStore from './store'

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


serviceWorker.unregister();


//App.js

import React from 'react';
import './App.css';
import {useSelector, useDispatch} from 'react-redux'
import {increment,decrement} from './action'

function App() {
  const counter = useSelector(state => state.counterReducer)
  const dispatch = useDispatch()
  console.log(counter)
  return (
    <div className="App">
       <h1>Counter {counter}</h1>
       <button onClick={() => dispatch(increment(2))}>+</button>
       <button onClick={() => dispatch(decrement(2))}>-</button>
    </div>
  );
}

export default App;

【问题讨论】:

  • 这里创建store是错误的,必须用thunk连接react和redux
  • 如果某些动作创建者是异步的,您应该使用 Thunk。所以对于这个例子,它似乎没有必要。

标签: reactjs redux


【解决方案1】:

非常小的错误。

您没有使用combineReducers。 因此,无需引用 reducer 的名称来访问其在 store 中的状态。

useSelector,应该是

  const counter = useSelector(state => state);

改为

  const counter = useSelector(state => state.counterReducer)

【讨论】:

  • 我明白了,谢谢。我已更改为 state => state,但我的按钮似乎抱怨 App.js:12 Uncaught TypeError: Object(...) is not a function which is the button onClick。我在按钮单击事件中没有看到任何语法错误。
  • 在你的action中,你导出action函数增量和减量吗?
  • 我今天有一些新的东西,那就是当你有 2 个或更多减速器时使用组合减速器,否则只使用状态。谢谢,伙计们
猜你喜欢
  • 2018-03-23
  • 2018-11-11
  • 1970-01-01
  • 2020-05-16
  • 2021-08-24
  • 2016-09-14
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
相关资源
最近更新 更多