React ReduxRedux 的官方React UI绑定层。它让您的 React 组件从 Redux 存储中读取数据,并将操作分派到存储以更新状态。
换句话说:react-redux就是用于连接reduxreact的。

基础使用

Provider组件

  1. import { render } from 'react-dom'
  2. import { StrictMode } from 'react'
  3. import { BrowserRouter } from 'react-router-dom'
  4. import store from '@/store'
  5. import { Provider } from 'react-redux'
  6. import App from './App'
  7. render(
  8. <StrictMode>
  9. <BrowserRouter>
  10. <Provider store={store}>
  11. <App />
  12. </Provider>
  13. </BrowserRouter>
  14. </StrictMode>,
  15. document.getElementById('root')
  16. )

然后我们怎么使用呢?

  • 通过hooks使用:useSelector ```typescript export interface DefaultRootState {}

export function useSelector( selector: (state: TState) => TSelected, equalityFn?: (left: TSelected, right: TSelected) => boolean ): TSelected;

  1. - 参数1:是一个函数,`state`参数是`Store`里面的数据,返回值就是`useSelector`的返回值得到的数据。推荐将第一个参数定义到函数组件外面,每次当前函数组件渲染的时候,不会生成新的函数进行执行。(这样只会在初始化的时候,渲染一次)。
  2. - `selector`函数还带有订阅的功能,只要store进行了改变,`selector`函数也会执行。
  3. - **注意:**`**selector**`**应该是一个纯函数,因为它可能会潜在的,在任意时间点,执行多次。**
  4. - 参数2:也是一个函数(可选)。表示前后两次的返回值是否相等,如果相等则还是用原来的值,如果不相等,则是用新的值。
  5. - 如果不传,则是`===`比较。我们可以自定义比较的函数。
  6. - `react-redux`有个自带的`shallowEqual`比较函数。表示浅比较。
  7. <a name="qVx4c"></a>
  8. ### `selector`的性能优化
  9. 起因:因为`selector`的函数带有订阅功能,即使我们改动的不是当前的`selector`返回的数据,`selector`对应的函数也会重新执行,这样的话,如果`selector`中有一些复杂的逻辑运算,就会造成性能瓶颈,有不必要的函数执行。
  10. 解决方法:使用`reselect`库中的`createSelector`
  11. `createSelector`方法返回一个`memoized selector functions`,也就是如果每一个`selector`的返回值不变的话,最后的参数函数也不会执行。
  12. ```typescript
  13. const makeSelectStudentData = () =>
  14. createSelector(
  15. (state: StoreType) => {
  16. const { loading } = state.student
  17. console.log('loadingSelector')
  18. return loading
  19. },
  20. loading => {
  21. console.log(loading, 'result')
  22. return {
  23. loading
  24. }
  25. }
  26. )

这里的loadingSekector每次都会执行打印,但是result却会比较,如果loading值没有变的话,那就不执行createSelector最后一个参数函数。而且这个方法至少需要两个参数。