Redux学习day1
01.React介绍
Redux是一个用来管理管理数据状态和UI状态的JavaScript应用工具。随着JavaScript单页应用(SPA)开发日趋复杂,JavaScript需要管理比任何时候都要多的state(状态),Redux就是降低管理难度的。(Redux支持React,Angular、jQuery甚至纯JavaScript)
02.基础-Redux工作流程
1.Redux官网工作流程图
2.Redux举例理解图
就相当于我是借书者,要去图书馆借书,首先第一步就是要先去找图书管理员给他讲书名,然后图书管理员就去图书馆里先找,没找到就去图书管理软件里找,图书管理软件找到了则反馈给Store,然后最终反馈给借书者,也就是我。这样理解起来就好理解一点。
03.ant-design介绍和基本环境配置
1.Ant-Design介绍
Ant Design
是一套面向企业级开发的UI框架,视觉和动效作的很好。阿里开源的一套UI框架,它不只支持React
,还有ng
和Vue
的版本,我认为不论你的前端框架用什么,Ant Design
都是一个不错的选择。习惯性把AntDesign
简称为antd
。
Ant-Design官网链接:https://ant.design/index-cn
2.React脚手架的安装
1.在控制台输入以下命令安装creat-react-app
- npm install -g create-react-app
2.然后进入你的项目安装目录,执行
- create-react-app <项目名>
如果报错,则可以试一试
- npx create-react-app <项目名>
3.安装完成后执行
- npm run start
04.基础-用ant-design制作UI界面
这里需要去学习ant-design的使用,挺简单的
05.创建Redux中的仓库-store和reducer
从现在开始就开始了Redux的代码阶段,在前面的Redux的流程图里面我们会发现Redux四个部分中最重要的就是Store,因为它把所有的数据都放到了store
中进行管理,Store 就是保存数据的地方,你可以把它看成一个容器。整个应用只能有一个 Store。在编写代码的时候,因为重要,所以要优先编写store
。
所以我们要使用redux,在使用之前肯定要先安装redux,执行命令
- npm install redux --save
安装好redux
之后,在src
目录下创建一个store
文件夹,然后在文件夹下创建一个index.js
文件。
index.js
就是整个项目的store
文件,打开文件,编写下面的代码。
- import { createStore } from 'redux' //引入createStore方法
- const store = createStore() //创建数据存储仓库
- export default store //把store暴露出去
这样虽然已经建立好了仓库,但是这个仓库很混乱,这时候就需要一个有管理能力的模块出现,这就是Reducers
。这两个一定要一起创建出来,这样仓库才不会出现互怼现象。在store
文件夹下,新建一个文件reducer.js
,然后写入下面的代码。
- const defaultState={} //定义一个默认数据
- export default (state = defaultState,action)=>{
- return state
- }
state
: 是整个项目中需要管理的数据信息,这里我们没有什么数据,所以用空对象来表示。
这样reducer
就建立好了,把reducer引入到store
中,再创建store时,以参数的形式传递给store。
- import { createStore } from 'redux' // 引入createStore方法
- import reducer from './reducer'
- const store = createStore(reducer) // 创建数据存储仓库
- export default store //暴露出去
仓库store
和reducer
都创建好了,可以初始化一下todoList
中的数据了,在reducer.js
文件的defaultState
对象中,加入两个属性:inputValue
和list
。代码如下
- const defaultState = {
- inputValue : 'Write Something',
- list:[
- ]
- }
- export default (state = defaultState,action)=>{
- return state
- }
组件中获取store中的数据
前面我们创建好了store仓库,也在reducer中创建好了数据,所以在组件中我们可以通过引入store.js文件
- import store from './store/index.js
然后通过
- store.getState()
来获取数据
- //先打印store.getState()
- console.log(store.getState())
- //通过store.getState().inputValue可以获得inputValue属性的值
- //通过store.getState().list可以获得list数组中的值
06.Redux Dev Tools的安装
直接在chrome中的拓展程序商城里面搜索便可以安装,前提是要连接上外网,
在安装好后需要在createStore()中加入一个参数,代码如下
- const store = createStore(
- reducer,
- window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
- )
- export default store
然后在chrome控制台就可以看见redux调试工具
07.通过Input体验Redux的流程
这节课要作的就是通过Input
的改变,体验一下Redux
的整体流程,是如何编写代码的。我们要实现的是在TodoList
的Demo中,只要文本框中的值改变就redux
中store
的值就跟着改变,并且随着Redux
中的state
值改变,组件也跟着改变。整个流程就是以前讲过的这个图
增加Input响应事件
如果想Input
改变,redux
也跟着改变,需要在Input
组件上增加onChange
响应事件, 打开src
目录下的ToDolist.js
文件,修改具体代码如下:
- <Input
- placeholder={this.state.inputValue}
- style={{ width:'250px', marginRight:'10px'}}
- //---------关键代码----start
- onChange={this.changeInputValue}
- //---------关键代码----end
- />
这步完成后,就可以编写changeInputValue
方法的代码了。我们先在控制台打印出文本框的变化,代码如下:
- changeInputValue=(e)=>{
- console.log(e.target.value)
- }
下面需要作的事就是改变Redux
里的值了
创建action
想改变Redux
里边State
的值就要创建Action
了。Action就是一个对象,这个对象一般有两个属性,第一个是对Action
的描述,第二个是要改变的值。
- changeInputValue(e){
- const action ={
- type:'change_input_value',
- value:e.target.value
- }
- }
action就创建好了,但是要通过dispatch()
方法传递给store
。我们在action下面再加入一句代码。
- changeInputValue(e){
- const action ={
- type:'changeInput',
- value:e.target.value
- }
- store.dispatch(action)
- }
这是Action
就已经完全创建完成了,也和store
有了联系。
store
的自动推送策略
我已经说了store
只是一个仓库,它并没有管理能力,它会把接收到的action
自动转发给Reducer
。我们现在先直接在Reducer
中打印出结果看一下。打开store
文件夹下面的reducer.js
文件,修改代码。
- export default (state = defaultState,action)=>{
- console.log(state,action)
- return state
- }
讲到这里,就可以解释一下两个参数了:
- state: 指的是原始仓库里的状态。
- action: 指的是action新传递的状态。
通过打印你可以知道,Reducer
已经拿到了原来的数据和新传递过来的数据,现在要作的就是改变store里的值。我们先判断type
是不是正确的,如果正确,我们需要从新声明一个变量newState
。(记住:Reducer里只能接收state,不能改变state。),所以我们声明了一个新变量,然后再次用return
返回回去。
- export default (state = defaultState,action)=>{
- if(action.type === 'changeInput'){
- let newState = JSON.parse(JSON.stringify(state)) //深度拷贝state
- newState.inputValue = action.value
- return newState
- }
- return state
- }
让组件发生更新
现在store里的数据已经更新了,但是组件还没有进行更新,我们需要打开组件文件TodoList.js
,在constructor
,写入下面的代码。
- constructor(props){
- super(props)
- this.state=store.getState();//----------关键代码-----------start
- store.subscribe(this.storeChange) //订阅Redux的状态
- //----------关键代码-----------end
- }
当然我们现在还没有这个storeChange
方法,只要写一下这个方法,并且重新setState
一次就可以实现组件也是变化的。在代码的最下方,编写storeChange
方法。
- storeChange=()=>{
- this.setState(store.getState())
- }
学习是参照了技术胖的文档,若有侵权,请联系删除
Redux学习day1的更多相关文章
- redux学习
redux学习: 1.应用只有一个store,用于保存整个应用的所有的状态数据信息,即state,一个state对应一个页面的所需信息 注意:他只负责保存state,接收action, 从store. ...
- React Redux学习笔记
React Router React Router 使用教程 Redux中间件middleware [译]深入浅出Redux中间件 Redux学习之一:何为middleware? ES6 ES6新特性 ...
- React+Redux学习笔记:React+Redux简易开发步骤
前言 React+Redux 分为两部分: UI组件:即React组件,也叫用户自定义UI组件,用于渲染DOM 容器组件:即Redux逻辑,处理数据和业务逻辑,支持所有Redux API,参考之前的文 ...
- redux学习总结
redux学习总结 *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !imp ...
- Redux学习及应用
Redux学习及应用 一:Redux的来源? Redux 是 JavaScript 状态容器,提供可预测化的状态管理.Redux是由 Flux 演变而来,但受 Elm 的启发,避开了 Flux 的复杂 ...
- 【原】redux学习笔记
上周学习了flux,这周研究了一下redux,其实很早之前都已经在研究他们了,只是之前一直没搞懂,最近这两周可能打通了任督二脉,都算入门了. 写博客的目的主要是做一下笔记,总结一下思路,以及和大家交流 ...
- react与redux学习资料的整理
**重点内容**React学习 1.新手入门可以访问react的官方网站,如果英语不是特别好的同学可以访问中文版的,具体链接http://reactjs.cn/react/index.html 首页有 ...
- Redux 学习(1) ----- Redux介绍
Redux 有三个基本的原则: 1,单一状态树,redux 只使用一个javascript 对象来保存整个应用的状态. 状态树样式如下: const state = { count: 0 } 2,状态 ...
- Redux学习之解读applyMiddleware源码深入middleware工作机制
随笔前言 在上一周的学习中,我们熟悉了如何通过redux去管理数据,而在这一节中,我们将一起深入到redux的知识中学习. 首先谈一谈为什么要用到middleware 我们知道在一个简单的数据流场景中 ...
随机推荐
- 剑指Offer(一):二维数组中的查找
一.前言 刷题平台:牛客网 二.题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整 ...
- K8S环境的Jenkin性能问题处理续篇(任务Pod设置)
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos K8S环境的Jenkin性能问题处理 本文是<K ...
- C语言中的左移与右移 <<, >> 位运算
这里参考了一篇很好的位运算,涉及到位运算可能会遇到的正负号问题,左右溢出怎么处理问题. 参考: 1. https://www.cnblogs.com/myblesh/articles/2431806. ...
- 微信小程序中使用 npm包管理 (保姆式教程)
打开自己的微信小程序项目,在勾选这个选项 然后在第一次应该是失败的提示"没有找到可以构建的npm包". 在 小程序的根目录下比如我的项目如图: 右击鼠标在终端中打开. 然后输入:n ...
- Oracle误操作 数据恢复
SELECT * FROM v$sqlarea //查询最近sql记录 SELECT r.FIRST_LOAD_TIME,r.* FROM v$sqlarea r ORDER BY r.FIRST_L ...
- 多测师讲解 _教师(必备)_高级讲师肖sir
教学心得1.备课要充分,防止第二天上课会出现一些突发情况2.上课要有自己的思路,不一定要按照课件上的讲3.上课气氛比较沉闷的时候,可以适当的开下玩笑,缓解大家的学习氛围4.讲课的时候提醒学员不要做笔记 ...
- 【C++设计模式二】工厂模式
(1)定义3 简单工厂模式中,每新增一个具体产品,就需要修改工厂类内部的判断逻辑.为了不修改工厂类,遵循开闭原则,工厂方法模式中不再使用工厂类统一创建所有的具体产品,而是针对不同的产品设计了不同的工厂 ...
- Redis不重启的情况下 切换持久化模式
确保redis版本在2.2以上 [root@localhost /]# redis-server -v Redis server v=4.0.10 sha=00000000:0 malloc=jema ...
- 【C/C++编程入门学习】同样是数据类型,链表对比数组?哪一个更香?
说起链表,第一反应:链表是一种数据类型!它可以用来存储同种类型多个批量数据. 有了这种认知,很容易去联想到数组,它也是一种数据类型,也可以用来存储同种类型的批量数据.初学者往往对数组的印象比较好, ...
- Centos定时备份 MySQL数据库
一.编写数据库备份脚本 backupmysql.sh #!/bin/bash # Name:bakmysql.sh # This is a ShellScript For Auto DB Backup ...