Redux流程图如上:

Action就是一条命令

Store顾名思义就是存储数据的,

Reducers是一个回调函数用于处理数据,它处理完数据会返回给Store存储起来

基本流程就是:组件中用Store.dispach(action), 告诉Store要更新的数据,Store无法直接处理,而是将原本的数据和Action一起发送给Reducers处理,

Reducers根据Action命令来修改原本的数据,更新完数据就返回给Store存储起来。

看下面实例:

1.创建store文件夹,在文件夹下创建index.js,代码如下:

import {createStore} from "redux"
import reducer from "./reducer" const store = createStore(
reducer,
  // 启动redux控件
window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
) export default store

2.在store文件夹下,创建reducer.js文件,代码如下

const defaultState = {
inputValue: "",
list: []
}
//注意reducer只能复制state不能修改,不能直接修改state
export default (state=defaultState,action)=>{
if(action.type === "change_input_value"){
let newState = JSON.parse(JSON.stringify(state))
newState.inputValue = action.value
return newState
}
if(action.type === "add_todos_item"){
let newState = JSON.parse(JSON.stringify(state))
newState.list.push(newState.inputValue)
newState.inputValue = ""
return newState
}
if(action.type === "delete_todos_item"){
let newState = JSON.parse(JSON.stringify(state))
newState.list.splice(action.index,)
return newState
}
return state
}

在store文件夹同级创建todolist.js文件,代码如下:功能做一个简单的增删操作

import React,{Component} from "react"
import 'antd/dist/antd.css'
import { Input,Button,List} from 'antd'
import store from "./store" export default class TodoList extends Component{
constructor(props){
super(props)
this.state = store.getState()
store.subscribe(this.handleStoreChange)
}
render(){
return (
<div>
<div style={{margin:}}>
<Input
value={this.state.inputValue}
onChange={this.handleInputChange}
style={{width:,marginRight:}}
placeholder="todo info"
/>
<Button onClick={this.handleBtnClick} type="primary">Primary</Button>
</div>
<List
style={{width:,margin:}}
size="large"
bordered
dataSource={this.state.list}
renderItem={(item,index) => <List.Item onClick={this.handleItemClick.bind(this,index)}>{item}</List.Item>}
/>
</div>
)
}
handleInputChange=(e)=>{
const action = {
type: "change_input_value",
value: e.target.value
}
store.dispatch(action)
}
handleStoreChange=()=>{
this.setState(store.getState())
}
handleBtnClick=()=>{
const action = {
type: "add_todos_item"
}
store.dispatch(action)
}
handleItemClick=(index)=>{
const action = {
type: "delete_todos_item",
index
}
store.dispatch(action)
}
}

注意有三个原则:

我们只能创建一个store,作为公共数据区域,不能创建多个。

只有store能够改变自己的数据,所以reducer并不能改变传入的state,而是每次返回新的数据,由store自己更改

reducer必须是一个纯函数,纯函数:1.传入固定的参数,就返回固定的内容,这意味着像new Date这种数据不能返回。2不会有任何副作用,副作用是指,不能对传入的数据做任何修改,就像state,你不能更改它,只能复制它。

1.Redux学习1,Redux的更多相关文章

  1. Redux 学习(1) ----- Redux介绍

    Redux 有三个基本的原则: 1,单一状态树,redux 只使用一个javascript 对象来保存整个应用的状态. 状态树样式如下: const state = { count: 0 } 2,状态 ...

  2. redux学习

    redux学习: 1.应用只有一个store,用于保存整个应用的所有的状态数据信息,即state,一个state对应一个页面的所需信息 注意:他只负责保存state,接收action, 从store. ...

  3. React Redux学习笔记

    React Router React Router 使用教程 Redux中间件middleware [译]深入浅出Redux中间件 Redux学习之一:何为middleware? ES6 ES6新特性 ...

  4. React+Redux学习笔记:React+Redux简易开发步骤

    前言 React+Redux 分为两部分: UI组件:即React组件,也叫用户自定义UI组件,用于渲染DOM 容器组件:即Redux逻辑,处理数据和业务逻辑,支持所有Redux API,参考之前的文 ...

  5. redux学习总结

    redux学习总结 *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !imp ...

  6. Redux学习及应用

    Redux学习及应用 一:Redux的来源? Redux 是 JavaScript 状态容器,提供可预测化的状态管理.Redux是由 Flux 演变而来,但受 Elm 的启发,避开了 Flux 的复杂 ...

  7. Redux学习之我对于其工作流程的理解和实践

      目录 1 工作流程图 2 各部位职责 3 Demo   1 工作流程图   2 各部位职责 我在理解这个流程图的时候,采用的是一种容易记住的办法,并且贴切实际工作职责. 我们可以把整个Redux工 ...

  8. 读redux有感: redux原来是这样操作的。

    2017.9.10日 教师节 : ~当一个事物你没有接触,但是生活中 常常用到他,你就不得不去了解他了. 注:新手可以看一下,毕竟博主也是个菜鸟,没法写高深的东西,不想看博主扯淡的直接看第三节啦~~ ...

  9. react第十八单元(redux中间件redux-thunk,redux工程目录的样板代码,规范目录结构)

    第十八单元(redux中间件redux-thunk,redux工程目录的样板代码,规范目录结构) #课程目标 中间件:中间件增强redux的可扩展性,实现功能复用的目的. redux-thunk异步逻 ...

  10. 【原】redux学习笔记

    上周学习了flux,这周研究了一下redux,其实很早之前都已经在研究他们了,只是之前一直没搞懂,最近这两周可能打通了任督二脉,都算入门了. 写博客的目的主要是做一下笔记,总结一下思路,以及和大家交流 ...

随机推荐

  1. MySQL数据库day20190922

    1.dos命令 set names gbk; 2.MySQL练习#创建school数据库: create database school;#切换school数据库: use school; # pri ...

  2. 【Android - 问题解决】之ScrollView嵌套ListView时总是自动滑动到ListView顶部的问题

    最近做了一个项目,里面有一个ScrollView嵌套ListView的布局. 做出来之后发现,进入这个界面之后,总是自动滑动到ListView的顶部,而ScrollView中位于ListView上面的 ...

  3. 【Android - IPC】之使用文件共享实现IPC

    文件共享是一种非常不错的IPC方式,即两个进程可以通过读/写同一个文件来交换数据.和Windows系统不同,Android系统是基于Linux的,这使得并发读/写文件的操作可以没有限制地进行,甚至两个 ...

  4. WebGPU学习(二): 学习“绘制一个三角形”示例

    大家好,本文学习Chrome->webgl-samplers->helloTriangle示例. 准备Sample代码 克隆webgl-samplers Github Repo到本地. ( ...

  5. SimpleXML使用详解

    SimpleXML使用详解 介绍 SimpleXML提供了一种简单,直观的方法来处理XML.它只有一个单一类型的类,三个函数和六个方法. 使用SimpleXML SimpleXMLElement 类是 ...

  6. python函数-参数

    python函数-参数 实验室 # 演示形参是可变类型 def register(name, hobby, hobby_list=[]): hobby_list.append(hobby) print ...

  7. 文件和目录权限chmod、更改所有者和所属组chown、umask、隐藏权限lsattr/chattr 使用介绍

    第2周第3次课(3月28日) 课程内容:2.14 文件和目录权限chmod2.15 更改所有者和所属组chown2.16 umask2.17 隐藏权限lsattr/chattr 2.14 文件和目录权 ...

  8. 一个缓存使用案例:Spring Cache VS Caffeine 原生 API

    最近在学习本地缓存发现,在 Spring 技术栈的开发中,既可以使用 Spring Cache 的注解形式操作缓存,也可用各种缓存方案的原生 API.那么是否 Spring 官方提供的就是最合适的方案 ...

  9. DRF Django REST framework 之 序列化(三)

    Django 原生 serializer (序列化) 导入模块 from django.core.serializers import serialize 获取queryset 对queryset进行 ...

  10. 【原创】004 | 搭上SpringBoot事务诡异事件分析专车

    前言 如果这是你第二次看到师长,说明你在觊觎我的美色! 点赞+关注再看,养成习惯 没别的意思,就是需要你的窥屏^_^ 本专车系列文章 目前连载到第四篇,本专题是深入讲解Springboot源码,毕竟是 ...