You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/api/hooks.md
+43-5
Original file line number
Diff line number
Diff line change
@@ -33,7 +33,7 @@ From there, you may import any of the listed React Redux hooks APIs and use them
33
33
## `useSelector()`
34
34
35
35
```js
36
-
const result :any=useSelector(selector :Function)
36
+
const result :any=useSelector(selector :Function, deps : any[])
37
37
```
38
38
39
39
Allows you to extract data from the Redux store state, using a selector function.
@@ -43,6 +43,7 @@ The selector is approximately equivalent to the [`mapStateToProps` argument to `
43
43
However, there are some differences between the selectors passed to `useSelector()` and a `mapState` function:
44
44
45
45
- The selector may return any value as a result, not just an object. The return value of the selector will be used as the return value of the `useSelector()` hook.
46
+
- The selector function used will be based on the `deps` array. If no deps array is provided, the latest passed-in selector function will be used when the component renders, and also when any actions are dispatched before the next render. If a deps array is provided, the last saved selector will be used, and that selector will be overwritten whenever the deps array contents have changed.
46
47
- When an action is dispatched, `useSelector()` will do a shallow comparison of the previous selector result value and the current result value. If they are different, the component will be forced to re-render. If they are the same, they component will not re-render.
47
48
- The selector function does _not_ receive an `ownProps` argument. If you wish to use props within the selector function to determine what values to extract, you should call the React [`useMemo()`](https://reactjs.org/docs/hooks-reference.html#usememo) or [`useCallback()`](https://reactjs.org/docs/hooks-reference.html#usecallback) hooks yourself to create a version of the selector that will be re-created whenever the props it depends on change.
48
49
@@ -70,10 +71,10 @@ Using props to determine what to extract:
70
71
importReact, { useCallback } from'react'
71
72
import { useSelector } from'react-redux'
72
73
73
-
exportconstTodoListItem=props=>{
74
-
consttodoSelector=useCallback(() => {
75
-
returnstate=>state.todos[props.id]
76
-
}, [props.id])
74
+
exportconstTodoListItem=props=>(
75
+
state=>state.todos[props.id],
76
+
[props.id]
77
+
)
77
78
78
79
consttodo=useSelector(todoSelector)
79
80
@@ -301,3 +302,40 @@ Some options for avoiding this problem:
301
302
- Try using the single function or array forms of `useActions()`
302
303
303
304
> **Note**: for more details on this problem, see [this comment and following in issue #1179](https://github.com/reduxjs/react-redux/issues/1179#issuecomment-482473235), as well as [this codesandbox that demonstrates the issue](https://codesandbox.io/s/7yjn3m9n96).
305
+
306
+
### Performance
307
+
308
+
As mentioned earlier, `useSelector()` will do basic shallow comparisons of return values when running the selector function after an action is dispatched. However, unlike `connect()`, `useSelector()` does not do anything to prevent your own function component from completing a re-render if the derived state has changed.
309
+
310
+
If further performance optimizations are necessary, you may consider either wrapping your function component in `React.memo(MyFunctionComponent)`, or using `useMemo()` to memoize the render output of your component:
311
+
312
+
```jsx
313
+
// Option 1: use React.memo() to keep the component from re-rendering
0 commit comments