权当暂记

    日后再行补充完善,若有阅读者,请翻到下文黄色标题‘从这里开始’起阅读。本文以一个最简单的demo进行注释性理解,全部拷贝下去,就能运行的一个demo。

    Rudex在我看来最本质做的事情就是将所有的State属性统一存储(一个属性就是一个注册到store的Reducer),然后用户触发事件,通过Redux修改State的状态(这里一定记住State只有一个,唯一唯一唯一),通过State状态影响Props状态,Props是与视图(JSX)直接挂钩的,从而达到刷新渲染视图的目的。

    然后其中的关键就是修改State的状态,Redux构建出了Action,Reducer,connect(mapStateToProps,mapDispatchToProps)(component),container等这些玩意儿搞了一套规则进行“规矩化”的修改状态,其实也就是分工了下,分成了几个层级。暂且理解到这,新手学习,拙见若有误,前端娱乐圈的朋友请不要怜惜我,评论处见。一切为了学习进步。

import React, { Component } from 'react'
import PropTypes from 'prop-types'
import ReactDOM from 'react-dom'
import { createStore } from 'redux'
import { Provider, connect } from 'react-redux'
// React component 视图组件(component)的实现,定义了props(包括简单的数值,字符串还有函数对象)
class Counter extends Component {
render() {
const { value, onIncreaseClick } = this.props
return (
<div>
<span>{value}</span>
<button onClick={onIncreaseClick}>Increase</button>
</div>
)
}
} //对props进行限定,如类型限定
Counter.propTypes = {
value: PropTypes.number.isRequired,
onIncreaseClick: PropTypes.func.isRequired
}

// Action 可以看作reducer中业务逻辑的路由,在mvc里不也是你要定义几个接口,就写几个action嘛,这个完全可以看作把action的名称单独拿出来作为一个路由的存在了,以至于这里没有单独的如mvc里的路由模块。

const increaseAction = {
type: 'increase'
}

1.2、 a、Reducer 定义了(初始化了)state,初始化了state(一个Reducer就是一个state里的一个属性,属性类型也是这里定义的,这个demo如果console.log(state);则结果为state:{counter:{count:0}}

//所有注册在store中的Reducer名称组合起来就是全局的state对象)才可以在下面的connect中的mapStateToProps、mapDispatchToProps中使用state

// b、Reducer 定义了一个或多个action的处理逻辑,而这多个action的处理逻辑怎么区分的呢,是靠传进来的参数action的一个属性字段type进行唯一性区分(可以将换这个type看作action之于Reducer的路由)

// c、

//这么看,其实Reducer就相当于一个controller,里面有多个action处理逻辑。

//好的,再回头看provider, Provider在根组件(App)外面包了一层,这样一来,App的所有子组件就默认都可以拿到state了。

//一结束,看二。

function counter(state = {
count: 0
}, action) {
const count = state.count
switch (action.type) {
case 'increase':
return {
count: count + 1
}
default:
return state
}
}

1.1、 Store 顶级,全局唯一,根据reducer生成的store“实例”,暂且只看作一个与reducer进行匹配的一种模式,不深究其作为状态树什么的地位。

//所以主要是看reducer(这里的ruducer实例:counter)里有什么。

const store = createStore(counter)

2.2、 Map Redux state to component props prop对象用state的值进行操作后赋上值,这里的state对象里面有什么,哪儿定义的呢?就是最上面讲store的时候,store里的reducer里定义的。想起来了吧。

function mapStateToProps(state) {
return { value: state.count }
}

2.3、Map Redux actions to component props事件绑定,但是呢,不直接写逻辑,而是用dispatch与事先定义的action进行关联。action相当于节点路由了,根据路由(action.type)在reducer(相当于controller)找到对应处理逻辑。

// 这样一来,事先定义的action-->reducer-->store就跟我们最顶层的dom关联起来了。说白了就是定义了套规则,在我粗鄙的看来,也是个mvc。

function mapDispatchToProps(dispatch) {
return {
onIncreaseClick: () => dispatch(increaseAction)
}
}

2.1Connected Component 、看了这行代码,先不管其中的参数啥意义,我们首先了解这行代码意义是什么,就是前面说的关联。

// Counter是上面定义的视图组件,你就直接看成这个是dom,dom里面需要显示东西(props)跟触发事件(函数类型props),显示跟触发这些东西就是定义在其中两个参数中。

// 第一个参数mapStateToProps作用:显示东西。简答说就是通过state作为输入参数,进行一堆操作或者不操作,给props赋值(因为我们显示东西总是跟props关联的)

// 第二个参数mapDispatchToProps作用:事件绑定。

const App = connect(mapStateToProps, mapDispatchToProps)(Counter)

这里开始看起

//一、Provider是react-redux提供的,先不深究。 store实例作为根节点元素与我们的组件进行‘绑定’,往上看啥是strore

//二、上面说的主要是定义了一堆规则进行状态state,action及其处理逻辑,现在要跟我们的组件结合起来,即上面最终的处理逻辑如何关联我们某个dom的事件触发(如onClick),这是我们最关心的。

// 所以看我们的App组件

class RudexDemo extends Component {
render() {
return (
<Provider store={store}>
<App />
</Provider>
);
}
} export default RudexDemo;

总结注意点:

1、State的初始化在哪儿呢?答案:所有的Reducer(注意是要注册要Store上的)构成了这个State,Reducer名称为State属性的名称,Reducer中第一个参数State里定义的参数类型就是State属性的类型。这个很重要!

2、State是一个全局的状态对象,这个对象是唯一的唯一的唯一的,跟component,Reducer什么的没有直接关联。记住就一个State,我们所有的操作都是为了改变这个State里面的部分属性值,从而达到刷新渲染页面的目的。

3、所有在component中需要与reducer挂钩的事情,都通过props让containers里去进行调用。这样分离合乎规矩。

原文:http://www.cnblogs.com/joeymary/p/7820047.html

个人公众号:

初识React-Redux之粗暴理解入门的更多相关文章

  1. react+redux官方实例TODO从最简单的入门(6)-- 完结

    通过实现了增-->删-->改-->查,对react结合redux的机制差不多已经了解,那么把剩下的功能一起完成吧 全选 1.声明状态,这个是全选状态 2.action约定 3.red ...

  2. react+redux官方实例TODO从最简单的入门(1)-- 前言

    刚进公司的时候,一点react不会,有一个需求要改,重构页面!!!完全懵逼,一点不知道怎么办!然后就去官方文档,花了一周时间,就纯react实现了页面重构,总体来说,react还是比较简单的,由于当初 ...

  3. webpack+react+redux+es6开发模式

    一.预备知识 node, npm, react, redux, es6, webpack 二.学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入 ...

  4. 【原】react+redux实战

    摘要:因为最近搞懂了redux的异步操作,所以觉得可以用react+redux来做一个小小的项目了,以此来加深一下印象.切记,是小小的项目,所以项目肯定是比较简单的啦,哈哈. 项目效果图如图所示:(因 ...

  5. webpack+react+redux+es6

    一.预备知识 node, npm, react, redux, es6, webpack 二.学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入 ...

  6. React+Redux开发实战项目【美团App】,没你想的那么难

    README.md 前言 开始学习React的时候,在网上找了一些文章,读了官网的一些文档,后来觉得React上手还是蛮简单的, 然后就在网上找了一个React实战的练手项目,个人学完之后觉得这个项目 ...

  7. React+Redux实现追书神器网页版

    引言 由于现在做的react-native项目没有使用到redux等框架,写了一段时间想深入学习react,有个想法想做个demo练手下,那时候其实还没想好要做哪一个类型的,也看了些动漫的,小说阅读, ...

  8. 实例讲解基于 React+Redux 的前端开发流程

    原文地址:https://segmentfault.com/a/1190000005356568 前言:在当下的前端界,react 和 redux 发展得如火如荼,react 在 github 的 s ...

  9. react+redux教程(四)undo、devtools、router

    上节课,我们介绍了一些es6的新语法:react+redux教程(三)reduce().filter().map().some().every()....展开属性 今天我们通过解读redux-undo ...

随机推荐

  1. Problem 2144 Shooting Game fzu

    Problem 2144 Shooting Game Accept: 99    Submit: 465Time Limit: 1000 mSec    Memory Limit : 32768 KB ...

  2. Online Bayesian Probit Regression介绍之Factor Graph

    下面就开始讲讲概率图中的Factor Graph.概率图博大精深,非我等鼠辈能够完全掌握,我只是通过研究一些通用的模型,对概率图了解了一点皮毛.其实我只是从概率这头神兽身上盲人摸象地抓掉几根毛,我打算 ...

  3. webpackJsonp is not defined

    解决方法公共模块放前面

  4. Spring ——依赖注入配置一些知识点

    依赖注入 依赖注入的原理与实现 依赖注入(DI)和依赖查找(Dependency Lookup)共同组成 控制反转(IoC).从原理的角度来说,依赖注入和控制反转是没 有不同的,可以看作是从两个角度来 ...

  5. 吾八哥学Python(六):运算符与表达式

    上篇简单学习了数学运算符,今天来学习下完整的Python运算符与表达式,具体看下面的表格吧! 表1 运算符与它们的用法 运算符 名称 说明 例子 + 加 两个对象相加 3 + 5得到8.’a’ + ‘ ...

  6. flying-saucer + iText + Freemarker实现pdf的导出, 支持中文、css以及图片

    前言 项目中有个需求,需要将合同内容导出成pdf.上网查阅到了 iText , iText 是一个生成PDF文档的开源Java库,能够动态的从XML或者数据库生成PDF,同时还可以对文档进行加密,权限 ...

  7. win10 uwp InkCanvas控件数据绑定

    本文主要说如何绑定InkCanvas,让笔画变化的时候我们可以知道. 我们本来的InkCanvas没有提供笔画绑定,所以我们自己写 using Windows.UI.Input.Inking; usi ...

  8. 怎用不用工具创建一个javaWeb项目

    整体步骤是: 1: 新建一个文件夹:  以项目名称命名 2:在新建的文件夹下再新建一个文件夹 WEB-INF  (注意:大小写) 和 一个文件  index.jsp : index.jsp里面的代码: ...

  9. ARM总线方面知识

    AMBA简介 随着深亚微米工艺技术日益成熟,集成电路芯片的规模越来越大.数字IC从基于时序驱动的设计方法,发展到基于IP复用的设计方法,并在SOC设计中得到了广泛应用.在基于IP复用的SoC设计中,片 ...

  10. LINUX 笔记-命令执行顺序 && ,||

    && 格式:命令1 && 命令2 说明:命令1返回真(即返回0,成功被执行)后,命令2才能够被执行 例:/apps/bin目录将会被移到/apps/dev/bin目录下 ...