源码:import{Component}from'@angular/core';import{createSelector}from'@ngrx/store';导出接口状态{counter1:number;counter2:数字;}exportconstselectCounter1=(state:State)=>state.counter1;exportconstselectCounter2=(state:State)=>state.counter2;exportconstselectTotal=createSelector(selectCounter1,selectCounter2,(counter1,counter2)=>计数器1+计数器2);//selectTotal的memoized值为null,因为它还没有被调用。createSelector里面:functioncreateSelector(...input){returncreateSelectorFactory(defaultMemoize)(...input);}defaultMemoize返回一个对象,每个字段指向一个函数:我传入了三个纯函数作为入参,也就是可以反复执行没有副作用的函数。这三个纯函数都维护在一个数组中:进入createSelectorFactory返回的函数体:从源码可以看出,createSelector接收的可变数量的参数被当做投影,其余的都当做选择器。讨论以下几种情况:(1)第一次执行,lastArgumentsundefined,进入IF分支,执行projection,保存结果,返回。(2)如果是重复执行,输入参数没有变化,则直接返回上次执行的结果(3)这里执行,说明是重复执行,参数有变化,然后重新执行投影(4)如果再次执行结果与上一次执行相同。返回之前的结果,createSelector最后返回一个带有记忆功能的选择器:如果以后要调试,记得code大概位置970,搜索关键字memoized。更多Jerry原创文章,尽在:《王子熙》:
