跳到主要内容

 

不变性中间件

这是redux-immutable-state-invariant中间件的一个移植版本,专门用于Redux Toolkit。任何检测到的变异都会被抛出为错误。

这个中间件默认由configureStoregetDefaultMiddleware添加到存储中。

你可以通过将任何支持的选项作为getDefaultMiddlewareimmutableCheck值来自定义此中间件的行为。

选项

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