Redux 和react-redux之间的关系

首先要理解的是:redux 是独立的,和react没有什么关系,想要在react中使用redux需要进行一些列的操作把它们连接起来,这一些列的操作即为:react-redux
为了方便使用,Redux 的作者封装了一个 React 专用的库 React-Redux(这是阮一峰说的,不是我说的)

Redux是什么?

redux 是一种数据状态管理模式,就相当于 vuex ,当我们要做的项目中有很多组件需要共享数据时,这时候就可以用 redux 搭建。
Redux的三个原则:唯一数据源,保持状态只读(只能通过调用dispach的形式来修改状态),数据改变只能通过纯函数(reducer)完成

如何搭建Redux?

redux包含3个比较重要的结构:store reducer action

redux的使用流程

1.怎么开始创建一个rudex?
安装redux
npm i redux react-redux --save

首先 从redux中引入一个creatStore 用于创建store

import {creatStore} from "redux"const store = createStore(reducer);

这里需要传入一个纯函数 reducer 用于改变store里面所存储的状态(不可以直接操作他,具体怎么实现,稍后会讲)

2.如何获取store里面的值?

假如你要获取store里面存的状态state ,通过

store.getState()

即可获取整个State对象

3.如何修改store里面的值?

假如你想修改State里面的数据,则需要通过发送指令

store.dispach({type:“add”,num:20})

来触发reducer ,通过reducer即可改变state返回一个新的state

改变的过程是怎样的?我们需要看一下reducer里面的结构

4.reducer是什么?状态如何更新?

const reducer = (state,action)=>{switch (action.type){case 'add':return state+action.num;case 'del':return state-action.num;default:return state}
};

简单地说就是前面dispatch里面的对象会作为action参数传入reducer函数,通过switch来判断要做的是什么操作,完成相应操作后即可反回一个新的state

5.但是到这里只是有了一个新的state,要如何把它更新到dom上呢

我们需要用store.subscribe(conponent)这里的参数component就是dom视图, 实现一个监听的效果,只要state改变了,他会自动更新state到视图层

到这里基本上就完成了一个redux的基本流程

计时器例子

const Counter = ({ value, onIncrement, onDecrement }) => (<div><h1>{value}</h1><button onClick={onIncrement}>+</button><button onClick={onDecrement}>-</button></div>
);const reducer = (state = 0, action) => {switch (action.type) {case 'INCREMENT': return state + 1;case 'DECREMENT': return state - 1;default: return state;}
};const store = createStore(reducer);const render = () => {ReactDOM.render(<Countervalue={store.getState()}onIncrement={() => store.dispatch({type: 'INCREMENT'})}onDecrement={() => store.dispatch({type: 'DECREMENT'})}/>,document.getElementById('root'));
};render();
store.subscribe(render);

既然这样就已经实现了redux,那还需要react-redux干啥?

思考一个问题,如果我要在其他页面也操作这个store,要怎么做?
redux通过编写一些列的代码可以实现这个功能,但是代码量比较大逻辑比较复杂

react-redux 就是用来解决这个问题的

它提供 provider 和 connect 两函数来解决

直接看代码

安装 redux
npm install redux react-redux --save

1.创建action

//action.js
import actionTypes from './actionTypes'const actionCreator = {getInputChangeAction: (val) => ({type: actionTypes.CHANGE_INPUT_VLAUE,value: val}),btnClickAction: (val) => ({type: actionTypes.BTN_CLICK,value: val}),listDelAction: (val) => ({type: actionTypes.LIST_DEL,index: val})
}export default actionCreator;

2.创建actionTypes.js

//actionTypes.js
const types = {CHANGE_INPUT_VLAUE: 'change_input_value',BTN_CLICK: 'btn_click',LIST_DEL: 'list_del'
}export default types;

3.定义reducer纯函数

//reducer.js
import actionTypes from './actionTypes';const defaultState = {inputValue: '',list: [],
};
export default (state = defaultState, action) => {// reducer 可以接受state,但是绝不能修改stateconst newState = JSON.parse(JSON.stringify(state));switch (action.type) {case actionTypes.CHANGE_INPUT_VLAUE:newState.inputValue = action.value;break;case actionTypes.BTN_CLICK:newState.list.push(action.value);newState.inputValue = '';break;case actionTypes.LIST_DEL:newState.list.splice(action.index, 1);break;default:break;}return newState;
};

5.创建store

//store.js
import { createStore } from 'redux';
import reducer from './reducer';const store = createStore(reducer);export default store;

6.使用用react-redux 中的provider传递store

import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux'
import store from './store'
import TodoList from './components/TodoList';// if (process.env.NODE_ENV === "development") {// require('./mock/index.js');
// }ReactDOM.render(<Provider store={store}><TodoList /></Provider>,document.getElementById('root')
);

TodoList.js

//TodoList.js
import React from 'react';
import { connect } from 'react-redux';
import actions from '../store/actionCreator';//组件中创建state的映射关系
//建后传入到connect()函数中即可通过props直接访问
const mapStateToProps = state => {return {value: state.inputValue,list: state.list,};
};
//组件中创建dispatch的映射关系
//创建后传入到connect()函数中即可通过props直接调用方法
const mapDispatchToProps = dispatch => {return {inputChange: e => dispatch(actions.getInputChangeAction(e.target.value)),btnClick: value => dispatch(actions.btnClickAction(value)),listClick: index => dispatch(actions.listDelAction(index)),};
};// todolist组件目前只有dom可以写成函数组件以提升效率;
// ui组件
const TodoList = props => {const { value, list, inputChange, btnClick, listClick } = props;return (<div><div><input onChange={inputChange} value={value}></input><button onClick={() => btnClick(value)}>提交</button></div><ul>{list.map((item, index) => {return (<li key={index} onClick={() => listClick(index)}>{item}</li>);})}</ul></div>);
};// 容器组件
export default connect(mapStateToProps, mapDispatchToProps)(TodoList);

这样就实现了通过react-redux管理组件状态

redux,react-redux之间的关系相关推荐

  1. React + Redux + Express + Mongodb 零基础开发完整大型商城网站视频教程(97 个视频)

    React + Redux + Express + Mongodb 零基础开发完整大型商城网站视频教程(97 个视频) mern 架构零基础开发完整电商网站 React + Redux + Expre ...

  2. Flux -- Redux -- Redux React 基础实例教程

    本文的目的很简单,介绍Redux相关概念用法 及其在React项目中的基本使用 假设你会一些ES6.会一些React.有看过Redux相关的文章,这篇入门小文应该能帮助你理一下相关的知识 一般来说,推 ...

  3. Flux --gt; Redux --gt; Redux React 入门 基础实例教程

    本文的目的很简单,介绍Redux相关概念用法 及其在React项目中的基本使用 假设你会一些ES6.会一些React.有看过Redux相关的文章,这篇入门小文应该能帮助你理一下相关的知识 一般来说,推 ...

  4. React+Redux技术栈核心要点解析(中篇)

    感谢作者郭永峰的授权发布. 作者:郭永峰,前端架构师,现用友网络 FED团队负责人,目前主要负责企业级应用前端技术平台建设工作,在前端工程化实现.Node 应用开发.React技术.移动开发等方向有丰 ...

  5. [react] Redux基本介绍 ===

    目录 redux 是什么? redux 和 react 的关系 为什么Rect要用 Redux react 多组件共享 - 案例 使用redux来解决的思路 Redux 三个核心概念 理解三个核心概念 ...

  6. React + Redux

    相当长一段时间以来,我一直在React和Redux中实现应用程序.在过去的几年里,我写了两本关于它的电子书,并发布了学习React及其生态系统的课程平台.课程平台甚至内置在React和Redux中.我 ...

  7. 基于 react, redux 最佳实践构建的 2048

    前段时间 React license 的问题闹的沸沸扬扬,搞得 React 社区人心惶惶,好在最终 React 团队听取了社区意见把 license 换成了 MIT.不管 React license ...

  8. React Redux 的一些基本知识点

    一.React.createClass 跟 React.Component 的区别在于后者使用了ES6的语法,用constructor构造器来构造默认的属性和状态. 1. React.createCl ...

  9. 函数式编程在Redux/React中的应用

    本文简述了软件复杂度问题及应对策略:抽象和组合:展示了抽象和组合在函数式编程中的应用:并展示了Redux/React在解决前端状态管理的复杂度方面对上述理论的实践.这其中包括了一段有趣的Redux推导 ...

最新文章

  1. C语言的逻辑运算符以及优先级及标识符
  2. 【数字信号处理】基本序列傅里叶变换总结 ( 单位脉冲序列 δ(n) | {1} 序列 | e^jωn 序列 | cosωn 序列 | sinωn 序列 | a^nu(n) | 矩形窗函数 ) ★★★
  3. 上海计算机二级报名无法选择,上海2020年二级计算机怎么报名
  4. java编程彩球滑梯作弊_课内资源 - 基于C++的学生成绩管理系统
  5. 9个提高代码运行效率的小技巧你知道几个?
  6. 控制台服务编写 Linux,一步步搭建ubuntu server console(控制台,字符模式)开发环境...
  7. python设置随机数种子为12_Python标准库12 数学与随机数 (math包,random包)(转载)...
  8. ArcMap下栅格图象矢量化步骤:
  9. cpython vm_【协程原理】 - cPython的VM真变态
  10. HttpClient 4.5.3 模拟登陆CSDN
  11. ICMP协议与ping
  12. MySql每晚12点都会弹出这个?
  13. AR体感游戏,体感互动游戏,AR大屏互动
  14. 操作系统:进程间通讯的七种方式
  15. 动态渲染element组件el-table表头项+自定义el-table列表项
  16. 异端的制作:数字人物Gawain
  17. 美国商务签证面试经历
  18. php 已知概率抽奖,抽奖概率算法实现-用PHP来实现的
  19. SmallJava V2.0 产品说明书(20210405)
  20. Python Tkinter实现的WIN7电脑端共享WIFI热点(二)

热门文章

  1. Android推送分析
  2. UVA750 UVALive5358 8 Queens Chess Problem题解
  3. HDU1715 大菲波数【大数】
  4. HDU3790 最短路径问题【Dijkstra算法】
  5. Batch Normalization 反向传播(backpropagation )公式的推导
  6. matlab 类型转换(类型判断)
  7. 【学习 Opencv】—— 常见接口
  8. 面向项目(六)—— 错误(异常)信息的书写
  9. C++基础——有关FILE的那些函数
  10. mysql 分段解析_MYSQL分段统计