根据NgRx文档,Reducers和Selector是纯函数。
"Reducer是纯函数,因为它们为给定的输入产生相同的输出">
"因为选择器是纯函数,所以当参数匹配时可以返回最后一个结果,而无需重新调用选择器函数">
考虑以下的简单示例
export const AppState = {
dataArray: []
}
// A Simple action that adds to the dataArray (created by Action creator)
export const addAction = createAction('Add to dataArray', props<{ data:number }>())
// Initial state of dataArray is an empty array
const initialDataArray = [];
// A simple reducer to get new state (created by Reducer creator)
// The new data element is simply added to the previous dataArray and a new Array is returned
export const dataArrayReducer = createReducer(initialDataArray,
on(addAction, (state, newData) => ([...state.dataArray, newData])))
// A selector to get the dataArray
export const selectDataArray = (state: AppState) => state.dataArray;
// Suppose we dispatch actions to the store
store.dispatch(addAction(1)); // Reducer will return state : { dataArray : [1] }
store.dispatch(addAction(1)); // Reducer will return state : { dataArray [1, 1] }
// Different states returned even though the input was the same Action with same props
const dataArray$ = store.pipe(select(selectDataArray)); // [1, 1]
store.dispatch(addAction(1));
const dataArray2$ = store.pipe(select(selectDataArray)); // [1, 1, 1]
// We get different values from the same selector.
因此,正如我们所看到的,即使我们提供完全相同的参数,我们也会从Reducer和Selector中获得不同的值。那么,它们怎么能被认为是纯函数呢?
我是不是错过了什么?我是不是搞错了纯函数的定义?
要记住的关键是,除了其他参数外,Reducer和Selector都将State作为一个参数。createReducer和createSelector函数返回一个状态必须传递到的Reducer and Selector函数。
因此,对于给定的状态,相同的参数总是会返回相同的值,这就是为什么它们是纯函数。
第一次调度addAction时,状态为{dataArray=[]}第二次调度addAction时,状态为{dataArray=[1]}
因此,我们从Reducer中获得不同的值。
类似地,对于选择器,第一次调用选择器时,状态为{dataArray=[1,1]},第二次调用它时,状态为{dataArray=[1,1,1]}。
因此,选择器每次也返回不同的值。