欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

redux基础源码解读

程序员文章站 2022-07-07 19:49:34
> wodata1的博客... > redux 解读- --> redux 源码解读-  个人分类: reux 这里直接贴代码:...

    redux 源码解读-

     个人分类: reux 这里直接贴代码: export default function combinereducers(reducers) { // reducers : {} const reducerkeys = object.keys(reducers) // 获得传进来对象的key const finalreducers = {} // 声明finalreducers 这用来存储最终的reducers for (let i = 0; i < reducerkeys.length; i++) { // 这个循环是用来筛选数据的。 const key = reducerkeys[i] //获得key if (process.env.node_env !== 'production') { // 如果是生产环境 if (typeof reducers[key] === 'undefined') { // 如果reducers[key] 是 undefinded 抛出错误 warning(`no reducer provided for key "${key}"`) } } if (typeof reducers[key] === 'function') { // 筛选reducers【key】 如果是函数才保存 finalreducers[key] = reducers[key] } } const finalreducerkeys = object.keys(finalreducers) // 获得 finalreducers keys let unexpectedkeycache if (process.env.node_env !== 'production') { unexpectedkeycache = {} } let shapeassertionerror try { assertreducershape(finalreducers) // 判断finalreducers的合法性。 } catch (e) { shapeassertionerror = e } // 这里返回一个函数。这个函数就是传入到createstore的函数。 return function combination(state = {}, action) { console.log(shapeassertionerror); if (shapeassertionerror) { throw shapeassertionerror } if (process.env.node_env !== 'production') { const warningmessage = getunexpectedstateshapewarningmessage( // 判断数据的合法性 state, finalreducers, action, unexpectedkeycache ) if (warningmessage) { warning(warningmessage) } } let haschanged = false // 是否改变的flag const nextstate = {} // 存储最终的state for (let i = 0; i < finalreducerkeys.length; i++) { // 遍历 finalreducerkeys const key = finalreducerkeys[i] // 获得key const reducer = finalreducers[key] // 获得对应的reducer const previousstateforkey = state[key] // 获得key对应的state const nextstateforkey = reducer(previousstateforkey, action) // 获得根据key 改变后的state if (typeof nextstateforkey === 'undefined') { const errormessage = getundefinedstateerrormessage(key, action) throw new error(errormessage) } nextstate[key] = nextstateforkey // 将改变后的key 存储到 nextstate 对应的key haschanged = haschanged || nextstateforkey !== previousstateforkey // 判断是否改变,是否需要更新state } return haschanged nextstate : state // 如果改变了 返回新的state 没改变则返回旧state。 } }