[DOC] improve useEffect doc

This commit is contained in:
Géry Debongnie
2022-01-19 15:32:40 +01:00
committed by Aaron Bohy
parent 81f44ee5d3
commit ce8ddd1cbf
+32 -46
View File
@@ -14,7 +14,6 @@
- [`useEnv`](#useenv) - [`useEnv`](#useenv)
- [`useEffect`](#useeffect) - [`useEffect`](#useeffect)
- [Example: Mouse Position](#example-mouse-position) - [Example: Mouse Position](#example-mouse-position)
- [Example: Autofocus](#example-autofocus)
## Overview ## Overview
@@ -245,6 +244,38 @@ up when the component is unmounted.
If the dependency function is skipped, then the effect will be cleaned up and If the dependency function is skipped, then the effect will be cleaned up and
rerun at every patch. rerun at every patch.
Here is another example, of how one could implement a `useAutofocus` hook with
the `useEffect` hook:
```js
function useAutofocus(name) {
let ref = useRef(name);
useEffect(
(el) => el && el.focus(),
() => [ref.el]
);
}
```
This hook takes the name of a valid `t-ref` directive, which should be present
in the template. It then checks whenever the component is mounted or patched if
the reference is not valid, and in this case, it will focus the node element.
This hook can be used like this:
```js
class SomeComponent extends Component {
static template = xml`
<div>
<input />
<input t-ref="myinput"/>
</div>`;
setup() {
useAutofocus("myinput");
}
}
```
## Example: mouse position ## Example: mouse position
Here is the classical example of a non trivial hook to track the mouse position. Here is the classical example of a non trivial hook to track the mouse position.
@@ -280,48 +311,3 @@ class Root extends Component {
Note that we use the prefix `use` for hooks, just like in React. This is just Note that we use the prefix `use` for hooks, just like in React. This is just
a convention. a convention.
## Example: autofocus
Hooks can be combined to create the desired effect. For example, the following
hook combines the `useRef` hook with the `onPatched` and `onMounted` functions
to create an easy way to focus an input whenever it appears in the DOM:
```js
function useAutofocus(name) {
let ref = useRef(name);
let isInDom = false;
function updateFocus() {
if (!isInDom && ref.el) {
isInDom = true;
const current = ref.el.value;
ref.el.value = "";
ref.el.focus();
ref.el.value = current;
} else if (isInDom && !ref.el) {
isInDom = false;
}
}
onPatched(updateFocus);
onMounted(updateFocus);
}
```
This hook takes the name of a valid `t-ref` directive, which should be present
in the template. It then checks whenever the component is mounted or patched if
the reference is not valid, and in this case, it will focus the node element.
This hook can be used like this:
```js
class SomeComponent extends Component {
static template = xml`
<div>
<input />
<input t-ref="myinput"/>
</div>`;
setup() {
useAutofocus("myinput");
}
}
```