使用useSelector、useDispatch替代connect
Hooks 提供了很多好用的api,甚至很多人认为Hooks的useReducer等Api已经可以取代Redux了。其实Hooks和Redux的使用场景并不冲突,而且可以互相借鉴,最近react-edux最新版本(7.1)也引入了Hooks风格的Api。
useState和useReducer是Hooks中最常用的Api,适合用来进行简单的状态管理,但也都有一些无法满足的需求
useState
import React, { useState } from "react";const ComponentUseState = () => {const [num, setNum] = useState(0);return (<div><h2>Using useState</h2>Number: {num}<button onClick={() => setNum(num + 1)}>+</button><button onClick={() => setNum(num - 1)}>-</button></div>);
};export default ComponentUseState;
useState可以用最简单的方式更新状态,但是状态更新的逻辑(例如上面例子中的加减一运算)散落在UI中,不能独立复用,也不便于测试
useReducer
使用useReducer可以解决上面useState无法解决的问题。
import React, { useReducer } from 'react'const initialState = {num: 0};const reducer = (state, action) => {switch(action.type) {case 'decrement':return {...state, num: state.num - 1}case 'increment':return {...state, num: state.num + 1}default:return state;}
}const ComponentUseReducer = () => {const [state, dispatch] = useReducer(reducer, initialState)const { num } = statereturn (<div><h2>Using useReducer</h2>Number: {num}<button onClick={() => dispatch({type: 'increment'})}>+</button><button onClick={() => dispatch({type: 'decrement'})}>-</button></div>);
};export default ComponentUseReducer;
可以看到useReducer的逻辑脱离了UI,可以独立复用。reducer就是一个单纯的Js方法,我们可以对reducer进行单独测试,甚至可以在chrome中进行调试
实际使用中reducer应该以单独的文件存在,上面例子为了简单起见放到了一起。useReducer虽然很好地分离了逻辑和UI,但是无法像redux一样进行跨组件的状态共享,例如子组件无法方便的访问到num
useSelector、useDispatch
如上所述,Hooks仍然无法替代Redux的作用,特别是在状态共享方面。庆幸的是 react-redux 7.1之后也可以使用useSelector、useDispatch等HooksApi替代connect,减少模板代码。
import React from "react";
import { createStore } from "redux";
import { Provider, useSelector, useDispatch } from "react-redux";const initialState = { num: 0 };const reducer = (state, action) => {switch (action.type) {case "decrement":return { ...state, num: state.num - 1 };case "increment":return { ...state, num: state.num + 1 };default:return state;}
};const store = createStore(reducer, initialState);const ComponentUseReactRedux = () => {return (<div><h2>ComponentUseReactRedux</h2><Provider store={store}><ChildComponentUseReactRedux /></Provider></div>)
}const ChildComponentUseReactRedux = () => {const num = useSelector(state => state.num);const dispatch = useDispatch();return (<div><h3>Using useSelector, useDispatch</h3>Number: {num}<button onClick={() => dispatch({ type: "increment" })}>+</button><button onClick={() => dispatch({ type: "decrement" })}>-</button></div>);
};export default ComponentUseReactRedux;
useSelector
子组件可以通过useSelector访问name
const num = useSelector(state => state.num);
当然,也可以提出selector函数,方便替换和复用,如下
const selector = state => {return state.num;
}const num = useSelector(selector);
useDispatch
const dispatch = useDispatch()
即使多几个子组件也可以共享状态
const ComponentUseReactRedux = () => {return (<div><h2>ComponentUseReactRedux</h2><Provider store={store}><ChildComponentUseReactRedux /><ChildComponentUseReactRedux /></Provider></div>)
}
最后
通过useSelector、useDispatch等方法,我们可以用Hooks方法完成Redux的功能,Hooks和Redux之间没有替代关系,应该更好地共存和融合。
使用useSelector、useDispatch替代connect相关推荐
- React学习笔记——Hooks中useStore、useDispatch和useSelector的基础介绍和使用,以及两者替代connect
在 React 的世界中,有容器组件和 UI 组件之分,在 React Hooks 出现之前,UI 组件我们可以使用函数,无状态组件来展示 UI,而对于容器组件,函数组件就显得无能为力,我们依赖于类组 ...
- hooks的基本用法
在 React 16.8 之前,函数组件只能是无状态组件,也不能访问 react 生命周期. hook 做为 react 新增特性,可以让我们在不编写 class 的情况下使用 state 以及其他的 ...
- redux异步action_Redux数据状态管理
Redux 中文文档(https://www.redux.org.cn/) Redux入门教程(快速上手)(https://segmentfault.com/a/1190000011474522?fr ...
- Redux之useSelector、useDispatch
React Redux 从 v7.1.0 开始支持 Hook API 并暴露了 useDispatch 和 useSelector 等 hook.以替代 Redux connect(),减少代码 us ...
- react-redux 中使用useSelector、useDispatch
1. react-redux 之 Hooks api Hooks 提供了很多好用的api,甚至很多人认为Hooks的useReducer等Api已经可以取代Redux了.其实Hooks和Redux的使 ...
- slqite3库查询数据处理方式_绝活!十一个优质React Hook库, 收藏备用
本文字数:6539字 预计阅读时间:18分钟 建议阅读方式:收藏备用 温馨提示:最近全国大幅降温,注意防寒保暖,开心跨年 长按识别,后台回复 "电子书" 即可领取<JavaS ...
- redux及react-redux
redux 这篇文章谈一谈仓库redux. 首先,学习任何东西都离不开官网.在此附上官网网址 Redux - A predictable state container for JavaScript ...
- 由redux到react-redux再到rematch
这比较适合看过redux但看了跟没看一样的同学,帮助记忆理清里面的基础知识 一. Redux 1. Store Store是保存数据的地方,可以把它看做一个容器.整个应用只能有一个Store. Red ...
- React 系列之基础二(状态管理)
React 系列之基础二 React 状态管理 1.Flux 架构与 Redux 在 Flux 中, 状态完全从 React-components 分离到自己的存储中. 存储中的状态不会直接更改, 而 ...
- react数据集中式管理第四篇--@rematch/core
今天,我们来介绍@rematch/core 其他几篇: react数据集中式管理第一篇–Redux初认识 react数据集中式管理第二篇–@reduxjs/toolkit react数据集中式管理第三 ...
最新文章
- mysql 主从 怎么 升级_MySQL详解主从(主库升级).doc
- vscode使用-添加格式化插件
- idea php 断点设置,php - xdebug在IntelliJ Idea中跳过断点 - SO中文参考 - www.soinside.com...
- 第七届蓝桥杯省赛JavaC组真题——详细答案对照(完整版)
- Zookeeper_原生API操作(一)
- tez安装官方文档整理+翻译
- 【caffe-Windows】以mnist为例的hdf5单标签处理——matlab实现
- 3、C#面向对象:封装、继承、多态、String、集合、文件(下)
- select2控件动态更新option
- centos7 mysql读写监控,《Centos7——zabbix监控mysql的常规操作》
- 浅谈算法和数据结构: 六 符号表及其基本实现
- r语言上机文本分析与词云绘制_R语言jiebaR包文本中文分词及词云上机练习,小白能做到...
- 基于WebGIS的车联网平台的研究与应用
- c语言课后第七章习题,c语言课后习题第7章函数
- android切图规范,APP切图详细规范终极指南
- 冬夜读书示子聿 鉴赏
- Python 练习实例2
- python中tuple的意思_pythontuple什么意思
- 易天光模块的兼容性验证及交换机型号介绍
- Hive的面试题总结