php配资系统源码
⽹站源码也分为两种,⼀种是动态源码如:ASP,PHP,JSP,.NET,CGI等,⼀种是静态源码如:HTML等。最⼤的特点就是能够和⽤户之间互动。⽐如说⽹易的信箱,张三登陆的时候,会看到欢迎光临张三,李四⼜登陆了,李四⼜看到欢迎光临李四,其实他们两个⼈登陆的是⼀个页⾯,这个就是动态源码的好处。
⽂件:(访问密码:551685)
以下内容⽆关:
-------------------------------------------分割线---------------------------------------------
redux 作为⼀个⼗分常⽤的状态容器库, ⼤家都应该见识过, 他很⼩巧, 只有 2kb, 但是珍贵的是他的 reducer 和 dispatch 这种思想⽅式
在阅读此⽂之前, 先了解/使⽤ redux 相关知识点, 才能更好地阅读本⽂
⼊⼝⽂件
⼊⼝是在 redux/src/index.js 中, 在⼊⼝⽂件中只做了⼀件事件, 就是引⼊⽂件, 集中导出
现在我们根据他导出的⽅法, 来进⾏分析
createStore
这个是 redux 最主要的 API
使⽤
搭配这使⽤⽅法⼀起, 可以更好的浏览源码
createStore(reducer, [preloadedState], [enhancer])
他的主要功能就是创建⼀个 store, 将 reducer 转换到 store
参数
⼀共可接受三个参数:
reducer (函数): ⼀个返回下⼀个状态树的还原函数,给定当前状态树和⼀个要处理的动作。
[preloadedState] (任意值): 初始值, 可以是来⾃于 storage 中的; 如果你⽤combinedReducers产⽣了reducer,这必须是⼀个普通对象,其类型与传递给它的键相同。
也可以⾃由地传递任何你的reducer能够理解的东西。
// 简单的例⼦:
function counterReducer(state, action) {
switch (pe) {
case ‘counter/incremented’:
return {value: state.value + 1}
case ‘counter/decremented’:
return {value: state.value - 1}
default:
return state
}
}
let store = createStore(counterReducer, {
value: 12345
})
store
createStore 返回的当然是⼀个 store, 他有⾃⼰的 api
getState
返回应⽤程序的当前状态树
const state = State()
dispatch(action)
这个其实不⽤我多说, 会 redux 的都应该知道这个
store.dispatch({type: ‘counter/incremented’})
subscribe(listener)
添加⼀个, 每当 action dispatch 的时候, 都会调⽤ listener, 在 listener 中可以使⽤ getState 来获取当前的状态树
const unsubscribe = store.subscribe(() => {
console.log(‘listener run’)
const current = State()
if (current.value === 12350) {
unsubscribe()
}
})
展⽰⼀个场景, 监听事件, 当达到某个条件之后, 解除监听事件
replaceReducer(nextReducer)
使⽤⼀个 reducer 替换当前的 reducer,对于 reducers 实现动态加载,也可以为 Redux 实现热重载机制
源码解析
createStore ⽂件是在 redux/src/createStore.js 中, 他接受的参数就是上⾯我们说的那三个, 返回的也就是 store
⾸先是⼀段参数的判断, 以及 enhancer 的返回
// 为了适配 createStore(reducer, enhancer) 的情况
if (typeof preloadedState === ‘function’ && typeof enhancer === ‘undefined’) {
enhancer = preloadedState
preloadedState = undefined
}
if (typeof enhancer !== ‘undefined’) {
if (typeof enhancer !== ‘function’) {
throw new Error(‘Expected the enhancer to be a function.’)
}
// enhancer 的使⽤场景
return enhancer(createStore)(reducer, preloadedState)
}
接下来定义⼀些变量和函数
let currentReducer = reducer
let currentState = preloadedState
let currentListeners = []
let nextListeners = currentListeners
let isDispatching = false
// 如果相等 , 做了⼀层浅拷贝 将 currentListeners 同步到 nextListeners 中// 避免相互影响
function ensureCanMutateNextListeners() {
if (nextListeners === currentListeners) {
nextListeners = currentListeners.slice()
}
}
function getState() {
// isDispatching 默认为 false, 表⽰当前 store 是否正在 dispatch
表格网站php源码
if (isDispatching) {
throw new Error(’//…’)
}
// 直接返回当前 state , 默认为⼊参 preloadedState
return currentState
}
store.subscribe
// 忽略了错误判断
function subscribe(listener) {
let isSubscribed = true
// 同步 nextListeners , currentListeners
ensureCanMutateNextListeners()
// 将 listener 加⼊ nextListeners
nextListeners.push(listener)
// 返回解除监听函数
return function unsubscribe() {
if (!isSubscribed) {
// 如果 isSubscribed 已经为 false 了则 return
// 情况 1, 已经执⾏过unsubscribe了⼀次
return
}
// flag
isSubscribed = false
// 同步 nextListeners , currentListeners
ensureCanMutateNextListeners()
const index = nextListeners.indexOf(listener)
nextListeners.splice(index, 1)
// 搜索, 删除
currentListeners = null
}
}
store.dispatch
function dispatch(action) {
/
/ 省略了 action 的 错误抛出
// 总结: action 必须是⼀个 Object 且 pe 必须有值存在
// 如果当前正在 isDispatching 则抛出错误(⼀般来说不存在
try {
isDispatching = true
// 执⾏ reducer, 需要注意的是 currentReducer 不能为异步函数
currentState = currentReducer(currentState, action)
} finally {
isDispatching = false
}
//  将 nextListeners 赋值给 currentListeners 执⾏ nextListeners ⾥⾯的const listeners = (currentListeners = nextListeners)
for (let i = 0; i < listeners.length; i++) {

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。