React Redux
是 Redux
的官方React UI
绑定层。它让您的 React
组件从 Redux
存储中读取数据,并将操作分派到存储以更新状态。
换句话说:react-redux就是用于连接redux
和react
的。
基础使用
Provider组件
import { render } from 'react-dom'
import { StrictMode } from 'react'
import { BrowserRouter } from 'react-router-dom'
import store from '@/store'
import { Provider } from 'react-redux'
import App from './App'
render(
<StrictMode>
<BrowserRouter>
<Provider store={store}>
<App />
</Provider>
</BrowserRouter>
</StrictMode>,
document.getElementById('root')
)
然后我们怎么使用呢?
- 通过hooks使用:
useSelector
```typescript export interface DefaultRootState {}
export function useSelector
- 参数1:是一个函数,`state`参数是`Store`里面的数据,返回值就是`useSelector`的返回值得到的数据。推荐将第一个参数定义到函数组件外面,每次当前函数组件渲染的时候,不会生成新的函数进行执行。(这样只会在初始化的时候,渲染一次)。
- `selector`函数还带有订阅的功能,只要store进行了改变,`selector`函数也会执行。
- **注意:**`**selector**`**应该是一个纯函数,因为它可能会潜在的,在任意时间点,执行多次。**
- 参数2:也是一个函数(可选)。表示前后两次的返回值是否相等,如果相等则还是用原来的值,如果不相等,则是用新的值。
- 如果不传,则是`===`比较。我们可以自定义比较的函数。
- `react-redux`有个自带的`shallowEqual`比较函数。表示浅比较。
<a name="qVx4c"></a>
### `selector`的性能优化
起因:因为`selector`的函数带有订阅功能,即使我们改动的不是当前的`selector`返回的数据,`selector`对应的函数也会重新执行,这样的话,如果`selector`中有一些复杂的逻辑运算,就会造成性能瓶颈,有不必要的函数执行。
解决方法:使用`reselect`库中的`createSelector`
`createSelector`方法返回一个`memoized selector functions`,也就是如果每一个`selector`的返回值不变的话,最后的参数函数也不会执行。
```typescript
const makeSelectStudentData = () =>
createSelector(
(state: StoreType) => {
const { loading } = state.student
console.log('loadingSelector')
return loading
},
loading => {
console.log(loading, 'result')
return {
loading
}
}
)
这里的loadingSekector
每次都会执行打印,但是result
却会比较,如果loading值没有变的话,那就不执行createSelector
最后一个参数函数。而且这个方法至少需要两个参数。