热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Redux入门0x101:简介及`redux`简朴完成

0x000概述这一章最先讲redux,实际上是承接前面的react,但实在作为一个框架来讲,redux和react并没有太多的关联,自身是自力存在的。在我看来它们的关联不会比共用r

0x000 概述

这一章最先讲redux,实际上是承接前面的react,但实在作为一个框架来讲,reduxreact并没有太多的关联,自身是自力存在的。在我看来它们的关联不会比共用re开首更深了,所以我就从新开了一个头,但实际上是基于前面写的…

0x001 redux资本

  • 中文文档
  • 英文文档
  • 官方视频

0x002 进修进程

当初为了进修redux,看了很多的材料,半途曾摒弃两次,然则末了照样英勇的拿起了它,如今终究委曲弄懂。

  • 第一次是人人都说redux牛逼,所以就打算进修一下,看了很多遍了redux中文文档,也看了英文文档–由于有些demo老是跑的不成功,怕是中文更新不实时的缘由。但末了照样不了了之,由于不晓得用它来干啥,反倒弄出了一堆的reduceraction之类的东西。
  • 第二次是在做毕业设计的时刻,做了一个相似看板一样的api自动测试及机能统计分析项目–相似postman,在这里遇到了一些超等辣手的题目,个中的最大的题目就是组件间通信一致的状况治理。由于是有一个超等庞杂的组件操纵体式格局和组件嵌套,在做组件间通信的时刻,为了坚持状况的一致性,不停的将事宜和属性一层一层往下传、或许往上传。真是蹩脚的回想啊……. 当时用的是Angular2。而我为了处置惩罚这个题目,写了一套基于定阅-宣布形式的事宜关照框架,原本想处置惩罚这些题目,结果,确切处置惩罚了组件间通信一致状况治理的题目,然则终究带来的确切越发庞杂的事宜治理和越发无无序的组件关联….
  • 厥后运用vue+vuex做了一些项目,反倒是倏忽意会的redux的头脑,就最先了第三次的进修,直到如今,我觉轻微缓解了我在前端项目所遭到的危险,redux的文档有点像天主视角,他彷佛在说,我晓得你应当晓得的,所以我这么说你应当晓得,实在我不懂。所以我要从伟人视角说说redux拨开他的神袍,看看他的胸毛......

0x003 再说一些空话

在前面react的文章中,我一直在反复react中都是js,就是为了把头脑引回react的实质,react是基于js写的一个框架罢了,只是一个框架,并非一门自力的言语。很多人老是用了jQuery就忘了原生,用了React就忘了jQuery和原生。而来了redux,就必须和react绑定。这是一个极大的头脑误区,从个别上来讲,vue是自力的、自在的,react也是自力的、自在的,redux也是自力的、自在的。

的确有redux在react中的最好实践,却相对没有redux的唯一实践这类说法,在js的天下中,各大框架各放异彩,他们既可以兼容并济,也可以互相排挤,不过就是js中的一员罢了。每一个框架就像每一个人一样,有本身的特性,react可以构建uiredux可以治理状况,axios在行收集,angular啥都行!你可以在vue中运用redux,也可以在vue中运用jQuery,以至也可在你本身的项目中同时运用vuereact,言语也好,框架也罢,都是为了向巨大航路进发而效劳的。

一句话总结:自在,然后次序,接着是人间万物

0x004 定阅-宣布形式

redux实质上也是基于定阅-宣布形式的产品(我记得没错的话,假如记错了,以后返来改),和我写的谁人小框架一样…..,所以在运用redux之前,先来研究一下这个形式,看看我之前写的谁人小东西:

let eventMap = {}
class MyEvent {
/**
* 宣布一个事宜并附带一份数据
*
* @param name 宣布的事宜名
* @param data 附带的数据
*/
static pub(name, data) {
if (!eventMap.hasOwnProperty(name)) return
let callbacks = eventMap[name]
if (callbacks.length === 0) return
callbacks.forEach((callback) => {
callback(data)
})
}
/**
* 定阅一个事宜并附带一个回调
* 申明这个事宜发作的时刻所要做的事变
*
* @param name 定阅的事宜称号
* @param callback 回调
* @returns {function(): *} 返回一个函数, 实行这个函数将会作废定阅
*/
static sub(name, callback) {
let callbacks = []
if (eventMap.hasOwnProperty(name)) {
callbacks = eventMap[name]
}
callbacks.push(callback)
eventMap[name] = callbacks
return () => callbacks.shift(callback)
}
}
export default MyEvent

这个库一共只要两个接口:

  • pub(name:String,data:data):void:宣布一个事宜,这个事宜附带一些数据,当这个事宜宣布的时刻,一切定阅这个事宜的都将会收到关照,并实行定阅这个事宜的时刻定义的操纵,即回调函数。
  • sub(name:String,callback:Function):Fuction:定阅一个事宜,当这个事宜发作的时刻,即挪用pub的时刻,该callback就会实行,并且在callback中可以收到这个事宜发作的时刻的附带数据。该函数还返回一个新的函数,挪用这个函数可以作废定阅该事宜

案例:

import MyEvent from '../../0x012-component-communication/src/MyEvent'
// 定义一个变量
let num = 1
// 定义一个事宜名
const EVENT_INCREMENT = 'EVENT_INCREMENT'
// 定阅这个事宜,并将作废定阅的函数保留起来
let unSub = MyEvent.sub(EVENT_INCREMENT, (data) => {
console.log(data)
})
// 当 num 发作变化的时刻,宣布这个时候
num += 1
MyEvent.pub(EVENT_INCREMENT, {num: num})
// 当 num 发作变化的时刻,宣布这个时候
num += 1
MyEvent.pub(EVENT_INCREMENT, {num: num})
// 作废定阅
unSub()
// 当 num 发作变化的时刻,宣布这个时候
num += 1
MyEvent.pub(EVENT_INCREMENT, {num: num})
// 当 num 发作变化的时刻,宣布这个时候
num += 1
MyEvent.pub(EVENT_INCREMENT, {num: num})
console.log({num})

检察浏览器,可以看到,我们收到了两次关照,由于我们在半途作废了定阅
《Redux入门0x101: 简介及`redux`简朴完成》

道理就是保留了MyEvent中的eventMap保留了一个Map,该Map是一个String=>Array,当我们定阅事宜的时刻,即挪用sub的时刻,就会构成以下的数据结构:

name | callbacks
EVENT_INCRECEMENT | (data)=>{...}
- | (data)=>{...}
- | (data)=>{...}
EVENT_DECRECEMENT | (data)=>{...}
- | (data)=>{...}

当我们挪用pub的时刻,就或寻找到这个事宜名,并轮回将该事宜名下挂载的callback行列实行。
当我们挪用unsub的时刻,则会将这个callback从行列中移除,如许就不会实行了。

redux的道理和这个大略的框架相似,就是比这精致多了,不过实质照样一样的,我们可以定阅某个值的变化,然后在某个值变化并收到这个关照的时刻作出我们本身的逻辑。

接下来我们会运用redux,然后经由历程redux来革新这个我们的ledux,打造成最少表面上相似的……

0x005 redux栗子

import {createStore} from 'redux'
// 定义一个 reducer
function counter(state = 0, action) {
switch (action.type) {
case 'INCREMENT':
return state + 1
case 'DECREMENT':
return state - 1
default:
return state
}
}
// 定义一个store,持有全局的 state
let store = createStore(counter)
// 定阅,并输出 state
store.subscribe(() =>
console.log(store.getState())
)
// 宣布一个事宜
store.dispatch({type: 'INCREMENT'})
store.dispatch({type: 'INCREMENT'})
store.dispatch({type: 'DECREMENT'})

检察浏览器
《Redux入门0x101: 简介及`redux`简朴完成》

可以看到,实在形式差不多:

  • 定义数据:

    • redux:reducer 部份
    • MyEvent:let num部份
  • 定阅:

    • redux:subscribe 部份
    • MyEvent:sub部份
  • 宣布:

    • redux:dispatch 部份
    • MyEvent:pub部份

然则实在内部差别又非常大,在MyEvent中,都是很随意的,我可以随意定义事宜,随意修正数据,随意宣布事宜,所以我写的东西叫做事宜关照,而不是状况治理。redux是用来做状况治理的,可以说是在事宜关照当中再一次做了封装。

  • MyEvent中数据是可以随意修正的,然则在redux中,数据的修正只能经由历程dispatch提交一个修正要求,而在reducer中处置惩罚这个要求。

0x006 ledux完成:

  • 编写redux

class Ledux {
static createStore(reduer) {
return new Store(reduer)
}
}
class Store {
constructor(reducer) {
this.state = reducer(null, {})
this.callbacks = []
this.reducer = reducer
}
subscribe(callback) {
this.callbacks.push(callback)
}
getState() {
return this.state
}
dispatch(action) {
this.state = this.reducer(this.state, action)
this.callbacks.forEach(callback => callback())
}
}
export default Ledux

  • 运用Ledix


import Ledux from "./ledux";
function counter(state = 0, action) {
switch (action.type) {
case 'INCREMENT':
return state + 1
case 'DECREMENT':
return state - 1
default:
return state
}
}
let store=Ledux.createStore(counter)
store.subscribe(()=>{
console.log(store.getState())
})
store.dispatch({type: 'INCREMENT'})
store.dispatch({type: 'INCREMENT'})
store.dispatch({type: 'DECREMENT'})

  • 检察浏览器

《Redux入门0x101: 简介及`redux`简朴完成》

可以看到,结果是一样的,而历程除了我喜好用class封装之外也没有太大的区分,就如许完成了ledux了,固然跟着对reduxapi的深切进修,这个框架也可以不停的深切发展。

0x007 资本

  • 源码

推荐阅读
  • Vue基础一、什么是Vue1.1概念Vue(读音vjuː,类似于view)是一套用于构建用户界面的渐进式JavaScript框架,与其它大型框架不 ... [详细]
  • 随着前端技术的发展,越来越多的开发者开始使用react、vue等web框架,但很少有人深入理解这些框架的源码。然而,这些框架底层都是由原生的javascript构建而成。对于初学前端的人来说,可能会认为javascript很容易上手,但实际上只是因为它被高度封装了。与能够使用封装类的人相比,能够理解框架原理的人则处于另一个层面。本文将深入剖析jquery源码,探寻框架底层的原理,帮助读者更好地理解web框架的运行机制。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • React基础篇一 - JSX语法扩展与使用
    本文介绍了React基础篇一中的JSX语法扩展与使用。JSX是一种JavaScript的语法扩展,用于描述React中的用户界面。文章详细介绍了在JSX中使用表达式的方法,并给出了一个示例代码。最后,提到了JSX在编译后会被转化为普通的JavaScript对象。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • wpf+mvvm代码组织结构及实现方式
    本文介绍了wpf+mvvm代码组织结构的由来和实现方式。作者回顾了自己大学时期接触wpf开发和mvvm模式的经历,认为mvvm模式使得开发更加专注于业务且高效。与此同时,作者指出mvvm模式相较于mvc模式的优势。文章还提到了当没有mvvm时处理数据和UI交互的例子,以及前后端分离和组件化的概念。作者希望能够只关注原始数据结构,将数据交给UI自行改变,从而解放劳动力,避免加班。 ... [详细]
  • angular.element使用方法及总结
    2019独角兽企业重金招聘Python工程师标准在线查询:http:each.sinaapp.comangularapielement.html使用方法 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • 本文介绍了使用FormData对象上传文件同时附带其他参数的方法。通过创建一个表单,将文件和参数添加到FormData对象中,然后使用ajax发送POST请求进行文件上传。在发送请求时,需要设置processData为false,告诉jquery不要处理发送的数据;同时设置contentType为false,告诉jquery不要设置content-Type请求头。 ... [详细]
  • php缓存ri,浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
    thinkPHP的F方法只能用于缓存简单数据类型,不支持有效期和缓存对象。S()缓存方法支持有效期,又称动态缓存方法。本文是小编日常整理有关thinkp ... [详细]
  • 获取ul中第一个li元素的五种方法和多个ul中第一个li元素的四种方法
    本文介绍了获取ul中第一个li元素的五种方法和多个ul中第一个li元素的四种方法,包括使用jQuery的选择器和遍历方法。通过这些方法,可以方便地获取到所需的元素,并进行相应的操作。 ... [详细]
  • 本文介绍了如何对PHP二维数组进行排序以及如何获取最大值。同时还提到了在数据分析系统中使用排序的实例,以及如何统计角色等级和创建角色总数。 ... [详细]
  • 简述在某个项目中需要分析PHP代码,分离出对应的函数调用(以及源代码对应的位置)。虽然这使用正则也可以实现,但无论从效率还是代码复杂度方面考虑ÿ ... [详细]
  • 本文介绍了如何使用OpenXML按页码访问文档内容,以及在处理分页符和XML元素时的一些挑战。同时,还讨论了基于页面的引用框架的局限性和超越基于页面的引用框架的方法。最后,给出了一个使用C#的示例代码来按页码访问OpenXML内容的方法。 ... [详细]
author-avatar
殇子休
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有