1. Какой UseEffect будет вызываться после каждого рендеринга?
Ответ: Согласно официальному ответу do c useEffect
заботится о 3 методах жизненного цикла а именно componentDidMount
componentDidUpdate
и componentWillUnmount
. Итак, независимо от того, сколько useEffect
у вас есть, все перехватчики эффектов будут выполняться при componentMount в первый раз. Но useEffect
будет выполняться дальше, только когда зависимость получит обновления, иначе он проигнорирует
2. Почему и как console.log () вызывается 13 раз?
Ответ: Я пытался воспроизвести повторную визуализацию 13 раз, но не могу этого сделать. Но да, он перерисовывается несколько раз, потому что во втором useEffect
в каждом хранилище ключей состояние обновляется, и из-за того, что этот компонент перерисовывается несколько раз.
происходит что-то вроде этого
changeName () → setName () → useEffect () → setFilter () → (на каждом хранилище ключей, повторяющем один и тот же шаг) → ... l oop
вы можете попробовать debounce
или throttling
, которые могут помочь вам Избегайте непрерывного обращения к хранилищу ключей, из-за которого никакая повторная отрисовка не может значительно сократить
Вместо использования console.log , есть хак, чтобы узнать количество повторных отрисовок
объявите приведенный ниже код в компоненте
const cunter = useRef(0);
, а затем в блоке возврата добавьте {cunter.current++}
, с помощью этого вы можете увидеть, сколько раз ваш компонент фактически перерисовывает
3. Почему полученные данные не отображаются в браузере до тех пор, пока я не наберу что-то в строке поиска?
Это потому, что в вашем состоянии ваша проверка !filteredMonster
, где filteredMonster
- массив, а !filteredMonster
всегда будет возвращать false
вместо этого попробуйте Array length
properties
filteredMonster.length === 0
{monster && !filteredMonster && monster.map((item, index) => (
<p key={index}>{item.name}</p>
))}
{(monster && filteredMonster.length === 0) && monster.map((item, index) => (
<p key={index}>{item.name}</p>
))}