不变性中间 件
这是redux-immutable-state-invariant
中间件的一个移植版本,专门用于Redux Toolkit。任何检测到的变异都会被抛出为错误。
这个中间件默认由configureStore
和getDefaultMiddleware
添加到存储中。
你可以通过将任何支持的选项作为getDefaultMiddleware
的immutableCheck
值来自定义此中间件的行为。
选项
type IsImmutableFunc = (value: any) => boolean
interface ImmutableStateInvariantMiddlewareOptions {
/**
回调函数,用于检查一个值是否被认为是不可变的。
这个函数会递归应用到状态中的每一个值。
默认实现会对原始类型返回true
(如数字、字符串、布尔值、null和undefined)。
*/
isImmutable?: IsImmutableFunc
/**
一个由点分隔的路径字符串数组或匹配来自
根状态的命名节点的RegExps,当检查不变性时忽略。
默认为undefined
*/
ignoredPaths?: (string | RegExp)[]
/** 如果检查超过N毫秒,则打印警告。默认:32ms */
warnAfter?: number
}
导出
createImmutableStateInvariantMiddleware
使用给定的选项创建一个不变性检查中间件的实例。
你最可能不需要自己调用这个,因为getDefaultMiddleware
已经这样做了。
示例:
// 文件:exampleSlice.ts
import { createSlice } from '@reduxjs/toolkit'
export const exampleSlice = createSlice({
name: 'example',
initialState: {
user: '将跟踪更改',
ignoredPath: '单级',
ignoredNested: {
one: '一',
two: '二',
},
},
reducers: {},
})
export default exampleSlice.reducer
// 文件:store.ts
import {
configureStore,
createImmutableStateInvariantMiddleware,
Tuple,
} from '@reduxjs/toolkit'
import exampleSliceReducer from './exampleSlice'
const immutableInvariantMiddleware = createImmutableStateInvariantMiddleware({
ignoredPaths: ['ignoredPath', 'ignoredNested.one', 'ignoredNested.two'],
})
const store = configureStore({
reducer: exampleSliceReducer,
// 注意,这将替换所有默认的中间件
middleware: () => new Tuple(immutableInvariantMiddleware),
})
使用getDefaultMiddleware在不移除所有其他中间件的情况下做同样的事情:
// 文件:exampleSlice.ts noEmit
import { createSlice } from '@reduxjs/toolkit'
export const exampleSlice = createSlice({
name: 'example',
initialState: {
user: '将跟踪更改',
ignoredPath: '单级',
ignoredNested: {
one: '一',
two: '二',
},
},
reducers: {},
})
export default exampleSlice.reducer
// 文件:store.ts
import { configureStore } from '@reduxjs/toolkit'
import exampleSliceReducer from './exampleSlice'
const store = configureStore({
reducer: exampleSliceReducer,
// 这将用定制版本替换原始的默认中间件
middleware: (getDefaultMiddleware) =>
getDefaultMiddleware({
immutableCheck: {
ignoredPaths: ['ignoredPath', 'ignoredNested.one', 'ignoredNested.two'],
},
}),
})
isImmutableDefault
"这个值是不可变的吗?"检查的默认实现。目前实现为:
return (
typeof value !== 'object' || value === null || typeof value === 'undefined'
)
这将对原始类型(如数字、字符串、布尔值、null和undefined)返回true