前言:大概一个月没有写博客了,这两天正好是周末,就写点东西来梳理下之前几个月的所写与所得;

两个月前,学习了一下 redux ,还是一点难度的,花了我一天的时间来搞明白他,

但是都没怎么记录,今天这篇博客就是用一个demo来介绍 redux , react-redux , react-thunk 的简单用法;

首先就是下载,使用命令:

npm install --save redux react-redux react-thunk

下好后 npm start 启动;

文件夹列表如下:

redux 的最关键的函数就是 dispatch !

而 dispatch 的本质是什么呢?

dispatch 接受的是一个对象,这个对象至少有一个是键值是用来判断类型的,其余的可以是任意的;

而他(其实也就是 reducer 函数)他本身有一个 state ,用来存储初始值,根据接受到的对象中的类型键值来判断对于当前值的不同操作,

而且他必须返回修改后的 state;

现在我们创建好文件后修改 src/index.js::

import { createStore,applyMiddleware} from 'redux'
import thunk from 'redux-thunk'
import { Provider } from 'react-redux'
import calcul from './redux/reducer'; let store = createStore(calcul,applyMiddleware(thunk));
ReactDOM.render(<Provider store={store}><App /></Provider>, document.getElementById('root'));

上部的代码中除了 reactDOM.render 是修改的,其他都是新添加的;

这里我们是引用了 redux, redux-thunk, react-redux模块和一个 reducer 文件;

讲一下 createStore 的作用,他在官方文档中的释义是这样的:

创建一个 Redux store 来以存放应用中所有的 state。

应用中应有且仅有一个 store。

其实这只是一个声明赋值,而如果你不用中间件(thunk)可以这样写:

let store = createStore(calcul);

一下子简单了很多;

而 Provider 这个html的标签就是将 redux 的值和函数,传递给整个项目;

上面说到了 create那我们先创建 reducer/index.js:

import { combineReducers } from 'redux'
const countReducer = (state = 0, action) => {
switch (action.type) {
case 'INCREMENT': return state + action.data;
case 'DECREMENT': return state - action.data;
default: return state;
}
}; const calcul = combineReducers({
countReducer
}); export default calcul;

combineReducers 是一个语法糖:他的作用就是将多个reducer函数合并成一个对象;

上面的 countReducer 就是一个reducer函数了,就像我上面所说的,action就是接受的那个对象,

而state就是他自带的初始值,通过switch操作,根据 action.type 的值来进行不同的操作,

但是也是最重要的就是必须有返回值;

接下来是修改src/App.js:

import React, { Component } from 'react';
import {connect} from 'react-redux';
import Calculation from './components/calculation'; class App extends Component {
render() {
const {dispatch,countNum} = this.props;
return (
<div className="App">
<Calculation getValue={countNum} dispatch={dispatch}></Calculation>
</div>
);
}
}
function showData(state) {
return {
countNum:state.countReducer
}
}
export default connect(showData)(App);

connect 函数是来自 react-redux 的,他是一个非常重要的函数,

在最下面一行代码中:connect(showData)(App);

第一个接受的是一个对象,在 showData 中, state 就是所有 reducer 的初始值;

通过这个函数将当前的组件与 redux 中的数值挂钩,他返回的是当期组件所需要的 reducer 的值(你也可以对值进行filter),

而第二个接受对象呢,就是当前组件了;

可以看到,我们还引用了一个名为 Calculation 的组件,他接收了来自 redux 的 dispatch , countNum 这两个参数(函数);

在下一个文件是 src/components/calculation.js:

import React, { Component } from 'react';
import {DECREMENT,middleINCRENT} from '../redux/action'; export default class Count extends Component {
constructor(props) {
super(props);
this.state = {
changeVal:1
}
} input = (e)=>{
this.setState({changeVal: Number(e.target.value)});
}; render() {
let {dispatch,getValue} = this.props;
return <div>
this is calculation
<h1>{getValue}</h1>
<input type="text" onChange={this.input} value={this.state.changeVal} />
<button onClick={() => (dispatch(middleINCRENT(this.state.changeVal)))}>+</button>
<button onClick={() => (dispatch(DECREMENT(this.state.changeVal)))}>-</button>
</div>
}
}

这个文件引用了文件:src/redux/action/index.js里的 DECREMENT , middleINCRENT 两个函数;

其中 middleINCRENT 便是添加了中间件的 action 函数;

这个组件的作用是什么呢:就是根据 input 里的值,来改变 redux 里的 countReducer 的初始值,靠着点击按钮来触发;

dispatch 我先不说,先说下 DECREMENT , middleINCRENT ,而这就不得不提到下面这个文件:

src/redux/action/index.js:

export function INCREMENT(data){
return {
type:'INCREMENT',
data
}
}
export function middleINCRENT(data) {
return (dispatch, getState) => {
const currentValue = getState();
if(currentValue.countReducer >=200){
return false;
}
dispatch(INCREMENT(data));
}
}
export function DECREMENT(data) {
return {
type:'DECREMENT',
data
}
}

现在你们知道中间件的作用了么?他就是在提交值的时候,对值进行统一的判断和修改, 可以在这个地方进行ajax操作;

我们看这个文件里的 INCREMENT 和 DECREMENT 函数,这两个 函数返回的值就是我最开始所说的, dispatch 所接收的值,

可以看到 type 即是判断的类型了,而 data 呢,就是组件 caculation.js 里的 input 的值;

现在看中间件 middleINCRENT 这个函数,他是返回一个函数,而这个函数可以接受到两个参数,一个呢是 dispatch 函数,而另外一个呢是当前的 reducer 函数的值;

通过学习这个组件, redux 的基本流程可以掌握了,当然实际项目中并不会这么简单,但是原理就是这样;

最后我将这个 demo 放在了GitHub: https://github.com/Grewer/reduxDemo

如果帮到了你,还请推荐或者 star;

完;

redux入门指南的更多相关文章

  1. Web API 入门指南 - 闲话安全

    Web API入门指南有些朋友回复问了些安全方面的问题,安全方面可以写的东西实在太多了,这里尽量围绕着Web API的安全性来展开,介绍一些安全的基本概念,常见安全隐患.相关的防御技巧以及Web AP ...

  2. Vue.js 入门指南之“前传”(含sublime text 3 配置)

    题记:关注Vue.js 很久了,但就是没有动手写过一行代码,今天准备入手,却发现自己比菜鸟还菜,于是四方寻找大牛指点,才终于找到了入门的“入门”,就算是“入门指南”的“前传”吧.此文献给跟我一样“白痴 ...

  3. yii2实战教程之新手入门指南-简单博客管理系统

    作者:白狼 出处:http://www.manks.top/document/easy_blog_manage_system.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文 ...

  4. 【翻译】Fluent NHibernate介绍和入门指南

    英文原文地址:https://github.com/jagregory/fluent-nhibernate/wiki/Getting-started 翻译原文地址:http://www.cnblogs ...

  5. ASP.NET MVC 5 入门指南汇总

    经过前一段时间的翻译和编辑,我们陆续发出12篇ASP.NET MVC 5的入门文章.其中大部分翻译自ASP.NET MVC 5 官方教程,由于本系列文章言简意赅,篇幅适中,从一个web网站示例开始讲解 ...

  6. 一起学微软Power BI系列-官方文档-入门指南(1)Power BI初步介绍

    我们在前一篇文章微软新神器-Power BI,一个简单易用,还用得起的BI产品中,我们初步介绍了Power BI的基本知识.由于Power BI是去年开始微软新发布的一个产品,虽然已经可以企业级应用, ...

  7. 一起学微软Power BI系列-官方文档-入门指南(2)获取源数据

    我们在文章: 一起学微软Power BI系列-官方文档-入门指南(1)Power BI初步介绍中,我们介绍了官方入门文档的第一章.今天继续给大家介绍官方文档中,如何获取数据源的相关内容.虽然是英文,但 ...

  8. 一起学微软Power BI系列-官方文档-入门指南(3)Power BI建模

    我们前2篇文章:一起学微软Power BI系列-官方文档-入门指南(1)Power BI初步介绍 和一起学微软Power BI系列-官方文档-入门指南(2)获取源数据 中,我们介绍了官方入门文档与获取 ...

  9. 一起学微软Power BI系列-官方文档-入门指南(4)Power BI的可视化

    在前面的系列文章中,我们介绍了官方有关获取数据,以及建模的原始文档和基本介绍.今天继续给大家介绍官方文档中,有关可视化的内容.实际上获获取数据和建模更注重业务关系的处理,而可视化则关注对数据的解读.这 ...

随机推荐

  1. C语言之基本算法37—数组最大值及其位置

    //数组运算 /* ================================================================== 题目:查找数组的最大元素,并输出其位置和值! ...

  2. 几条jQuery代码片段助力Web开发效率提升

    平滑滚动至页面顶部 以下是jQuery最为常见的一种实现效果:点击一条链接以平滑滚动至页面顶部.虽然没什么新鲜感可言,但每位开发者几乎都用得上. $("a[href='#top']" ...

  3. JQuery插件开发标准写法

    ;//step01 定义JQuery的作用域 (function ($) { //step03-a 插件的默认值属性 var defaults = { prevId: 'prevBtn', prevT ...

  4. Photoshop 无法打开某些JPEG文件的成因

    最近想把QQ相册里的一些照片整理修复一下,所以下载了一些到本地,然后用PS CC 2018打开,结果PS告诉我"无法完成请求,因为程序错误".试了Win10系统自带的看图软件,能够 ...

  5. Html中行内元素有哪些?块级元素有哪些?

    1.关于行内元素和块状元素的说明 根据CSS规范的规定,每一个网页元素都有一个display属性,用于确定该元素的类型,每一个元素都有默认的display属性值,比如div元素,它的默认display ...

  6. epoll的使用实例

    在网络编程中通常需要处理很多个连接,可以用select和poll来处理多个连接.但是select都受进程能打开的最大文件描述符个数的限制.并且select和poll效率会随着监听fd的数目增多而下降. ...

  7. SpringMVC总结

    本文是对慕课网上"搞定SSM开发"路径的系列课程的总结,详细的项目文档和课程总结放在github上了.点击查看 MVC简介 Model-View-Control,MVC是一种架构模 ...

  8. arcgis api for js热力图优化篇-不依赖地图服务

    前面我写过一篇文章,介绍如何实现arcgis api的热力图效果,但是依赖arcgis server发布的地图服务来获取热力图的数据源.实际应用中,很多业务数据来源数据库,并不一定是从地图服务来获取的 ...

  9. IT服务(运维)管理实施的几个要点--序言

    IT服务(运维)管理(不是IT运维技术)是IT行业当中相对比较"窄"的一个分支,通常只被金融.电信等大型数据中心的中高层管理人员所关注.但是根据笔者多年从事IT服务和服务管理的经验 ...

  10. 使用jQuery制作一个简易的购物车结算流程

    因为今天下午时候在网上买了东西,在结算界面的时候突发奇想的也想自己动手做一个结算界面,当然了,只是一个最简易的结算界面,有商品数量的加减,有单价和小计,单个多个删除,全选和区县全选等等一些小功能,我在 ...