内容简介:那么我们再来看看createStore这个api,可以看到上述例子有这么一段代码,我们知道createStore 是一个函数,并且他返回了一个对象store,也就是我们常说的存储状态的仓库如下图,现在让我们继续深入下去,可以看到createStore这个函数接收三个参数,那么这时候我们心里肯定在想三个参数分别干嘛用的呢?我们先把它们列出来,在逐一分析每个参数的含义写了这么多,首先我们来看看他的第一个api,store.getState()
- Redux 是 JavaScript 状态容器, 提供可预测化的状态管理。redux 其实说白就是一个状态管理存储
- 下面是一个简单的计数器例子,这里写了一个增加减数字相加的问题 复制代码
<div id="counter">
<div id="counterValue"></div>
<button id="incrementBtn">+</button>
<button id="decrementBtn">-</button>
</div>
复制代码
- 首先带你入门写个简单的使用的例子,下面这部分是JS的引用写法
// 引入了redux ,调用了createStore这个方法
import {createStore} from "redux"
let initState = 0;
// 定义了两个独一无二的类型 Symbol
const INCREMENT = Symbol.for('INCREMENT')
const DECREMENT = Symbol.for('DECREMENT')
// 用来表示动作类型reducer接收两个参数,一个是状态,另外一个是触发的行为
// reduce 就是根据触发行为的不同来返回对应的状态
function reducer(state =initState ,action){
console.log(action)
switch(action.type){
case INCREMENT:
return state+1;
case DECREMENT:
return state-1;
default:
return state;
}
}
// 新老状态对比然后生成新的状态
let store = createStore(reducer)
let state = store.getState()
console.log(state)
let counterValue = document.getElementById("counterValue")
let incrementBtn = document.getElementById("incrementBtn")
let decrementBtn = document.getElementById("decrementBtn")
function render(){
counterValue.innerHTML = store.getState()
}
// 可以手动订阅更新,也可以事件绑定到视图层。
store.subscribe(render)
incrementBtn.addEventListener("click",function(){
console.log(1111)
store.dispatch({type:INCREMENT,data:99})
})
decrementBtn.addEventListener("click",function(){
store.dispatch({type:DECREMENT})
})
复制代码
-
可以看看上面例子
-
在上面的例子中我们引入了redux ,其中运用了几个API,在上述例子中得到了引用,那么我们可以来看看这几个api在源码是怎么样?是如何暴露出来的?
- 1、createStore
- 2、getState
- 3、dispatch
- 4、subscribe
-
这是github上的源码目录,目录文件不是很多,第一篇首先分析的是入口redux的createStore.js
那么我们再来看看createStore这个api,可以看到上述例子有这么一段代码,我们知道createStore 是一个函数,并且他返回了一个对象store,也就是我们常说的存储状态的仓库
let store = createStore(reducer) let state = store.getState() 复制代码
- 现在点进去看createStore.js,滑到源码最底端,可以清晰的看到createStore方法暴漏出了五个api,前面三个是我们日常项目中常用的方法,看到这里,其实我们就能想到就是执行createStore方法时,会返回一个对象,这个对象上包含这五个属性。
如下图,现在让我们继续深入下去,可以看到createStore这个函数接收三个参数,那么这时候我们心里肯定在想三个参数分别干嘛用的呢?我们先把它们列出来,在逐一分析每个参数的含义
- reducer
- preloadedState
- enhancer
- reducer相信大家很常见,它为了描述 action 如何改变 state tree , 就是处理action的reducer的处理函数, reducers是一个纯函数,接收参数state和action。只需要根据action,返回对应的state,而且必须要有返回。
function reducer(state =initState ,action){
console.log(action)
switch(action.type){
case INCREMENT:
return state+1;
case DECREMENT:
return state-1;
default:
return state;
}
}
复制代码
- preloadedState:这个就是初始化的状态state,可以传一个初始的值进来
看着这里,我们就会想,createStore传入的的初始状态和reducer传入的初始状态哪个优先级高?
- enhancer:这个是createStore的增强器。你可以选择性的传入一个增强函 数取增强 store,例如中间件,时间旅行,持久化。这 redux 唯一一个自带的 增强器是的 applyMiddleware
写了这么多,首先我们来看看他的第一个api,store.getState()
- 通过store.getState()我们可以获取store里面存储的状态,官方源码,可以看到只有短短十几行代码就实现了getState方法,并且返回了一个当前的状态currentState,
function getState() {
if (isDispatching) {
throw new Error(
'You may not call store.getState() while the reducer is executing. ' +
'The reducer has already received the state as an argument. ' +
'Pass it down from the top reducer instead of reading it from the store.'
)
}
return currentState
}
复制代码
其实前面那个判断只是判断当reduce执行的时候不会进行获取状态,防止并发,如果把这个判断删掉,其实真正有用的就只有一行代码,也即是执行getState()方法 返回一个状态
function getState() {
return currentState
}
复制代码
currentState状态是如何获取的呢?
- 在源码中我们只可以看到这一句话,而这个preloadedState是createStore里传入进来的, 所以如果当你没有执行触发action的行为之前,执行store.getState()直接获取的是传入的初始化状态
let currentState = preloadedState 复制代码
那第二个问题要考虑的就是在哪里改变这个状态的呢,因为我们在项目中可是有需求想要去改变状态的,而不只是存着它们,当祖宗一样供着,那样消耗也会很大...现在让我们继续追踪,redux 到底是如何进行状态的改变?
function dispatch(action) {
currentState = currentReducer(currentState, action)
return action
}
复制代码
如上述例子,可以看到源码中这么一段代码,我进行简单的删减,只留下了这三行代码,从这三行代码我们就可以看出来很多问题。
- 首先可以看出currentState是在dispatch方法里执行然后进行获取值的,并且dispatch接收一个action函数
- 这就可以得出我们改变状态的唯一途径是必须出发一个action 也即是执行dispatch(action)这个方法,稍后我们在解读dispatch
- 然后currentState 是执行currentReducer(currentState, action)这个方法之后返回的值?
- 那么这个currentReducer(currentState, action)又是干嘛的呢?
以上所述就是小编给大家介绍的《一步步带你解读redux源码》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Phoenix解读 | Phoenix源码解读之索引
- Phoenix解读 | Phoenix源码解读之SQL
- Redux 源码解读 —— 从源码开始学 Redux
- AQS源码详细解读
- SDWebImage源码解读《一》
- MJExtension源码解读
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
TCP/IP网络管理
亨特 / 电子工业 / 2006年3月1日 / 79.00元
本书是一本架设与维护TCP/IP网络的完整指南,无论你是在职的系统管理员,还是需要访问Internet的家用系统用户,都可从本书获得帮助。本书还讨论了高级路由协议(RIPv2、OSPF、BGP),以及实现这些协议的gated软件。对于各种重要的网络服务,如DNS,Apache,sendmail,Samba,PPP和DHCP,本书都提供了配置范例,以及相关的软件包与工具的语法参考。一起来看看 《TCP/IP网络管理》 这本书的介绍吧!