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相关推荐

  1. React学习笔记——Hooks中useStore、useDispatch和useSelector的基础介绍和使用,以及两者替代connect

    在 React 的世界中,有容器组件和 UI 组件之分,在 React Hooks 出现之前,UI 组件我们可以使用函数,无状态组件来展示 UI,而对于容器组件,函数组件就显得无能为力,我们依赖于类组 ...

  2. hooks的基本用法

    在 React 16.8 之前,函数组件只能是无状态组件,也不能访问 react 生命周期. hook 做为 react 新增特性,可以让我们在不编写 class 的情况下使用 state 以及其他的 ...

  3. redux异步action_Redux数据状态管理

    Redux 中文文档(https://www.redux.org.cn/) Redux入门教程(快速上手)(https://segmentfault.com/a/1190000011474522?fr ...

  4. Redux之useSelector、useDispatch

    React Redux 从 v7.1.0 开始支持 Hook API 并暴露了 useDispatch 和 useSelector 等 hook.以替代 Redux connect(),减少代码 us ...

  5. react-redux 中使用useSelector、useDispatch

    1. react-redux 之 Hooks api Hooks 提供了很多好用的api,甚至很多人认为Hooks的useReducer等Api已经可以取代Redux了.其实Hooks和Redux的使 ...

  6. slqite3库查询数据处理方式_绝活!十一个优质React Hook库, 收藏备用

    本文字数:6539字 预计阅读时间:18分钟 建议阅读方式:收藏备用 温馨提示:最近全国大幅降温,注意防寒保暖,开心跨年 长按识别,后台回复 "电子书" 即可领取<JavaS ...

  7. redux及react-redux

    redux 这篇文章谈一谈仓库redux. 首先,学习任何东西都离不开官网.在此附上官网网址 Redux - A predictable state container for JavaScript ...

  8. 由redux到react-redux再到rematch

    这比较适合看过redux但看了跟没看一样的同学,帮助记忆理清里面的基础知识 一. Redux 1. Store Store是保存数据的地方,可以把它看做一个容器.整个应用只能有一个Store. Red ...

  9. React 系列之基础二(状态管理)

    React 系列之基础二 React 状态管理 1.Flux 架构与 Redux 在 Flux 中, 状态完全从 React-components 分离到自己的存储中. 存储中的状态不会直接更改, 而 ...

  10. react数据集中式管理第四篇--@rematch/core

    今天,我们来介绍@rematch/core 其他几篇: react数据集中式管理第一篇–Redux初认识 react数据集中式管理第二篇–@reduxjs/toolkit react数据集中式管理第三 ...

最新文章

  1. mysql 主从 怎么 升级_MySQL详解主从(主库升级).doc
  2. vscode使用-添加格式化插件
  3. idea php 断点设置,php - xdebug在IntelliJ Idea中跳过断点 - SO中文参考 - www.soinside.com...
  4. 第七届蓝桥杯省赛JavaC组真题——详细答案对照(完整版)
  5. Zookeeper_原生API操作(一)
  6. tez安装官方文档整理+翻译
  7. 【caffe-Windows】以mnist为例的hdf5单标签处理——matlab实现
  8. 3、C#面向对象:封装、继承、多态、String、集合、文件(下)
  9. select2控件动态更新option
  10. centos7 mysql读写监控,《Centos7——zabbix监控mysql的常规操作》
  11. 浅谈算法和数据结构: 六 符号表及其基本实现
  12. r语言上机文本分析与词云绘制_R语言jiebaR包文本中文分词及词云上机练习,小白能做到...
  13. 基于WebGIS的车联网平台的研究与应用
  14. c语言课后第七章习题,c语言课后习题第7章函数
  15. android切图规范,APP切图详细规范终极指南
  16. 冬夜读书示子聿 鉴赏
  17. Python 练习实例2
  18. python中tuple的意思_pythontuple什么意思
  19. 易天光模块的兼容性验证及交换机型号介绍
  20. Hive的面试题总结

热门文章

  1. 在哪些场景下要使用CDN加速服务
  2. btrfs 入门使用
  3. Docker存储驱动之Btrfs简介
  4. 邻接表(Adjacency List)
  5. Python自动化修改word实例
  6. Captcha Cracker
  7. flea-frame-cache使用之Redis接入【旧】
  8. 2019念念不忘,2020必有回响!!!
  9. 编写吃c语言程序步骤,自己做的一个C语言小游戏——吃金子
  10. 具象的东西_学完就忘?掌握科学的记忆方法,你也能成为学习高手