React|React中reducer的拆分,react redux hooks及redux-thunk中间件使用
文章目录
- react中 reducer的拆分,react redux hooks
- react redux hooks
- useSelector
- useStore
- useDispatch
- redux 中间件 - redux-thunk
react中 reducer的拆分,react redux hooks
combineReducers 官网的介绍
combineReducers(reducers)react redux hooks
复杂数据下reducer
的拆分,案例代码如下:
import {combineReducers} from "redux"; /* 原始: reducer function reducer(state={ list: { tab: "all", page: 1, data: [] }, article: { detail: {}, message:[] } },action){ switch(action.type){} return state; } */ // 拆分// 负责处理 list 的数据 function listReducer(list={ tab: "all", page: 1, data: [] },action){ switch(action.type){ case "LIST_ADD": let {data} = list; data.push("a"); return { ...list, data } } return list; }// 负责处理 article 的数据 function article(article={ detail: {}, message:[] },action){ switch(action.type){ case "ARTICLE_ADD": let {message} = article; message.push("b"); return { ...article, message } } return article; }#1. 不利用 combineReducers 的时候, 自己手动写函数合并reducer // function reducer(state={},action){ //return { //list:list(state.list,action), //article: article(state.article,action) //} // }#2. 利用提供的 combineReducers API 合并多个reducer const reducer = combineReducers({ listReducer, article }); // console.log(reducer); export default reducer;
由 combineReducers() 返回的 state 对象,会将传入的每个 reducer 返回的 state 按其传递给 combineReducers() 时对应的 key 进行命名。 即:combineReducers
会将拆分的单个reducer
包装到一个大的state
对象中集中返回.
useSelectorreact-redux
新增的hooks
:
相比于之前的react-redux
的用法写起来比较麻烦, 之前要用connect
方法对 组件进行高级组件的包装, 而现在的react-redux
给我们提供了几个常用的hooks
来获取store
,state
和dispatch
方法等, 新增hooks
如下:
- useStore - useDispatch - useSelector
【React|React中reducer的拆分,react redux hooks及redux-thunk中间件使用】useStoreuseSelector
用来获取store
中的state
状态数据.
useSelector
接收一个函数作为参数- 这个函数接收一个
state
参数, 返回一个state
#1. useSelector 接收一个函数作为参数 #2. 回调函数接收一个 state 作为参数, 返回一个 state const state = useSelector((state)=>{ return state });
useDispatchuseStore
用来获取store
的整个store
对象. 用法如下:
const store = useStore() console.log(store);
redux 中间件 - redux-thunkuseDispatch
用来获取dispatch
.
const dispatch = useDispatch();
- 中间件的概念: 在真正去修改 reducer 之前,做一些处理,比如我们的副作用,如:数据请求,数据验证……
- applyMiddleware()
- redux-thunk
案例代码演示如下:
src/index.js
import React from 'react'; import ReactDOM from 'react-dom'; import {Provider} from 'react-redux' import App from './App'; import store from './redux/index'ReactDOM.render(
, document.getElementById('root') );
src/App.js
import React,{Fragment,useEffect} from 'react' import{useSelector,useDispatch} from 'react-redux'function App(props) { const state = useSelector((state)=>{ return state}); const dispatch = useDispatch(); useEffect(()=>{ console.log('组件挂载了哦, state值为 -->>',state); },[]); return(
我是App件哦!! num的值为: {state.num} ) } export default App
src/redux/index.js
import {createStore,applyMiddleware} from 'redux' import thunk from 'redux-thunk'function reducer(state = { num: 1, }, action) { console.log('action执行了哦 --->>>',action); switch (action.type) { case 'ADD': return { num: state.num+1 } } return state } // 如果不使用 applyMiddleware(thunk) 中间件, 那么 redux 中的dispatch(action)中的action // 必须是一个简单的对象, 而使用 applyMiddleware(thunk) 之后, redux-thunk给我们封装了 // dispatch方法, 使得 dispatch可以接收一个函数作为参数. dispatch(function(){}) const store = createStore(reducer); // const store = createStore(reducer,applyMiddleware(thunk)); export default store
推荐阅读
- 热闹中的孤独
- Shell-Bash变量与运算符
- JS中的各种宽高度定义及其应用
- 2021-02-17|2021-02-17 小儿按摩膻中穴-舒缓咳嗽
- 深入理解Go之generate
- 异地恋中,逐渐适应一个人到底意味着什么()
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- “成长”读书社群招募
- 2020-04-07vue中Axios的封装和API接口的管理