redux的简单使用
Redux
我从学react起,一共写了三次react项目
第一次是学生选课系统,完全不知道生命周期的规律和顺序,也不知道axios到底应该放在哪里才能更好的请求到,文件分工不明确,没有体现组件化的优势,各处state异常混乱,完全定位不到错误位置。
第二次是研究生双选导师的系统,由于时间原因,很多的组件、方法都是堆积在一个js文件中,单个文件过于臃肿,且大部分方法都是上一次的方法照搬。优点是明确了各生命周期该干的事情,且明白了当系统慢慢扩展,慢慢变大时,普通的state渲染界面的缺陷就会逐渐暴露而出,状态管理几乎是所有bug的根源之处:
一、排错困难:当出现问题的时候,难以定位到错误位置,组件嵌套组件,不知道到底是传进去的时候出现的错误,还是在子组件某一生命周期出现的错误。
二、过多嵌套的state,让开发者对于数据逻辑的混乱无所适从。
redux就是为此而生的一种技术,它使用单一的state仓库(store)来保存数据,修改其中数据只能通过动作(action)来进行,拿出来的数据只能可读不可修改,保证了开发者对数据的修改都在同一位置,不会出现各生命周期各有一堆请求数据的代码的情况。
第三次就是我现在正在写的餐厅管理系统,新使用的技术就是redux,使用前觉得,怎么会有这么麻烦的东西?修改还要通过动作,还不如我直接setState呢,还只有一个仓库来存state,我每个界面一个state不好吗?但是使用后才会发现,Redux很像是一个矫正工具,让你保证单项的数据流流入单一位置,再只从这个仓库取出数据。redux中修改数据的代码就像下方我举的例子
const action = changeHeadColor(index);
store.dispatch(action);
changeHeadColor这个方法返回一个对象,对象中一定有一个type属性,这个属性可以看作是方法名或者是钥匙,当你想去仓库中修改数据,你就需要这把钥匙去打开相应的门。
export const changeHeadColor = (index) => ({
type: CHANGE_HEAD_COLOR,
index
})
然后就是我们的仓库了,这个文件我们专门用来储存state。所以我们修改state的方法很明确了,通过调用action(动作),找到对应的reducer(操作仓库的方法),通过这个纯函数来修改state,且只有这种方式才能改变state
const defaultState = {
headActiveColorIndex: 0
};
export default (state = defaultState, action) => {
let newState;
switch (action.type) {
case CHANGE_HEAD_COLOR:
newState = JSON.parse(JSON.stringify(state));//深度拷贝
newState.headActiveColorIndex = action.index;
return newState;
}
return state;
}
接下来我就将需要建立的文件初步给大家展示一下。大概需要的文件是四个,外加一个使用的组件文件。
store.js
// 记得安装redux 和 redux-thunk(中间件,后面会讲)
import { createStore, applyMiddleware, compose } from 'redux';
import reducer from './reducer'
import thunk from 'redux-thunk' //增强函数 一步方法,执行两个函数
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ?
window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({}) : compose; //中间件
const enhancer = composeEnhancers(applyMiddleware(thunk)); const store = createStore(
reducer, /* preloadedState, */
enhancer
); export default store;
actionType.js
// 单独拿出一个文件用于定义action的typeheaction本身的名字,这样做的意想不到的好处是,当你输入type名错了的时候,是会出现报错的,而不写这个文件的话,reducer文件判断type处会以为你有这个变量,作为一个判断条件一直放在那里,并不会报错。报错有利于你处理BUG
// 改变顶部导航栏背景颜色
export const CHANGE_HEAD_COLOR = 'changeHeadColor';
actionCreators.js
import { CHANGE_HEAD_COLOR} from './actionTypes'
export const changeHeadColor = (index) => ({
type: CHANGE_HEAD_COLOR,
index
})
reducer.js
import { CHANGE_HEAD_COLOR } from './actionTypes'
const defaultState = {
headActiveColorIndex: 0,
tableList: []
};
export default (state = defaultState, action) => {
let newState;
switch (action.type) {
case CHANGE_HEAD_COLOR:
newState = JSON.parse(JSON.stringify(state));//深度拷贝
newState.headActiveColorIndex = action.index;
return newState;
}
return state;
}
head.js => 组件文件
import React, { Component } from 'react'
import store from '../store'
import { changeHeadColor } from '../store/actionCreators'
class Head extends Component {
constructor(props) {
super(props);
this.state = store.getState()
// 订阅 发生改变就修改视图
store.subscribe(this.storeChange.bind(this));
}
componentDidMount() {
const action = changeHeadColor(10)
store.dispatch(action)
}
render() {
let { headActiveColorIndex } = this.state;
return (
<div className="head">
{headActiveColorIndex }
</div>
<div onClick={this.testFun.bind(this)}>测试</div>
)
}
testFun(){
const action = changeHeadColor(1000)
store.dispatch(action)
}
storeChange() {
this.setState(store.getState())
}
}
export default Head
文件结构如下,大家使用的时候建议按照自己的路径重打一下路径,比如我这里就是因为全放在了一个store文件夹下,所以store.js文件改名成了index.js

然后大家就可以尝试使用redux做项目了,这里再提醒一点,如果大家没有认为或是没有意识到自己的react项目的状态管理混乱的话,redux是没有必要使用的。
这里引用阮一峰老师的文章的话:
"如果你不知道是否需要 Redux,那就是不需要它。"
今天就到这里,鉴于篇幅的问题没有办法说得更多,如果有其他问题的话可以加我的qq或私信我或留下您的信息,我看到了会尽我的能力给大家解答。希望大家的项目少出BUG!下次更新再见啦。
redux的简单使用的更多相关文章
- redux 的简单实用案例
redux 的简单实用案例 整体思想与结构 创建一个Action 创建一个Reducer 创建Store 在App组件开始使用 整体思想与结构 文件目录如下: 构建 action,通过创建一个函数,然 ...
- React之 redux 的简单介绍及使用
1.为什么使用redux?在小型react项目的开发中 ,view(视图层)中的数据模型(即数据),可以存放在组件中的 state 对象,换句话说页面中的动态数据存放在 state 中. 但对于开发大 ...
- TypeScript + React + Redux 实战简单天气APP全套完整项目
下载链接:https://www.yinxiangit.com/171.html 目录: 从面向过程的js到面向对象的js,让web前端更加高大尚.让你的前端步步日上,紧跟技术发展的前沿.让你构建更加 ...
- 初学redux笔记,及一个最简单的redux实例
categories: 笔记 tags: react redux 前端框架 把初学redux的一些笔记写了下来 分享一个入学redux很合适的demo, 用redux实现计数器 这是从阮一峰老师git ...
- 【原】redux学习笔记
上周学习了flux,这周研究了一下redux,其实很早之前都已经在研究他们了,只是之前一直没搞懂,最近这两周可能打通了任督二脉,都算入门了. 写博客的目的主要是做一下笔记,总结一下思路,以及和大家交流 ...
- 使用Redux管理你的React应用
因为redux和react的版本更新的比较频繁,博客园这里用的redux版本是1.0.1,如果你关心最新版本的使用技巧,欢迎来我的Github查看(https://github.com/matthew ...
- 如何理解 Redux?
作者:Wang Namelos 链接:https://www.zhihu.com/question/41312576/answer/90782136 来源:知乎 著作权归作者所有,转载请联系作者获得授 ...
- Redux管理你的React应用
使用Redux管理你的React应用 因为redux和react的版本更新的比较频繁,博客园这里用的redux版本是1.0.1,如果你关心最新版本的使用技巧,欢迎来我的Github查看(https ...
- Flux --> Redux --> Redux React 入门
本文的目的很简单,介绍Redux相关概念用法 及其在React项目中的基本使用 假设你会一些ES6.会一些React.有看过Redux相关的文章,这篇入门小文应该能帮助你理一下相关的知识 一般来说,推 ...
随机推荐
- SparkSQL Adaptive Execution
转自 https://mp.weixin.qq.com/s/Oq9L3Cmc-8G9oL8dvZ5OHQ 1 背景 本文介绍的 Adaptive Execution 将可以根据执行过程中的中间数据优化 ...
- .net必问的面试题系列之面向对象
上个月离职了,这几天整理了一些常见的面试题,整理成一个系列给大家分享一下,机会是给有准备的人,面试造火箭,工作拧螺丝,不慌,共勉. 1.net必问的面试题系列之基本概念和语法 2.net必问的面试题系 ...
- aabccd统计每个字符出现的次数,结果显示{ a: 2, b: 1, c: 2, d: 1 };去掉重复的字符,使结果显示abcd
遍历字符串的方式和遍历数组的方式有点相似,或者说就是相同的.在学习数组的遍历方法之前,可以通过for循环去遍历数组,同样,字符串也可以:字符串跟数组都有一个length的属性.下面代码奉上,个人思路! ...
- Nacos(八):Nacos持久化
参考和感谢 Spring Cloud Alibaba基础教程:Nacos的数据持久化 前言 前景回顾: Nacos(七):Nacos共享配置 Nacos(六):多环境下如何"管理" ...
- Maven项目添加ojdbc8
1.找到Oracle中的ojdbc8,它的位置在Oracle客户端 2.找到它的位置后,把你放ojdbc8的位置复制,改如下代码"D:\ojdbc8.jar"为你的ojdbc8位置 ...
- python初级知识
一级标题 空格+内容 二级标题 空格+内容 有序内容 1.+Tab 无序内容 -+Tan 代码块 print("hello world") 三个```+回车 添加图片 表格创建 C ...
- vue-cli3.x创建及运行项目
Node 版本要求 Vue CLI 需要 Node.js 8.9 或更高版本 (推荐 8.11.0+).如果你已经全局安装了旧版本的 vue-cli (1.x 或 2.x),你需要先通过 npm un ...
- WPF 浏览PDF 文件
添加成功后会在工具箱里看到下图所示的控件.打开VS2010,新建项目(WpfPDFReader),右键项目添加User Control(用户控件).因为Adobe PDF Reader COM 组件是 ...
- C#开发BIMFACE系列8 服务端API之获取文件上传状态信息
系列目录 [已更新最新开发文章,点击查看详细] 在BIMFACE控制台上传文件,上传过程及结束后它会自动告诉你文件的上传状态,目前有三种状态:uploading,success,failure ...
- 【转载】Windows api数据类型
最近在接触windows api函数,看到了很多之前没有看到过的数据类型,发现“个人图书馆”中有个帖子说的挺详细的,特地搬运过来 Windows 数据类型 Delphi 数据类型 描述 LPSTR P ...