@bzotsss

React, почему в useState(value) в кастомном хуке не попадает новое значение? Какой тут исп. механизм?

Всем привет , есть такой код , коменты в нём обьясняют ситуацию . Вот ещё кодсандбох - https://codesandbox.io/s/use-is-mounted-49fxl?file... :
import { useState, useRef, useEffect } from "react";

function useLatestValue(val) {
  const ref = useRef();

  useEffect(() => {
    ref.current = val;
  });

  return ref;
}

function useDebounce(value, delay) {
  console.log("entry value ( new )", value);
  const [debouncedValue, setDebouncedValue] = useState(value);
  console.log("return value from debouncedValue ( old )", debouncedValue); // тут старое значение , ПОЧЕМУ?? 
//По идее , наш хук должен перевызыватся с новым значением value и 
//в useState(value - тут value - новое значение,разве нет ? ) должно попадать новое значение , разве нет ? 
  const effectRef = useLatestValue({ clearTimeout, delay });

  useEffect(() => {
    const handler = setTimeout(() => {
      setDebouncedValue(value);
    }, effectRef.current.delay);

    return () => {
      clearTimeout(handler);
    };
  }, [value, effectRef]);

  return debouncedValue;
}

export default function App() {
  const [inputValue, setInputValue] = useState(false);

  const debouncedValue = useDebounce(inputValue, 1000);

  return (
    <div>
      <input
        onChange={(e) => setInputValue(e.target.value)}
        placeholder="input"
      />
    </div>
  );
}

Может кто нибудь пожалуйста обьяснить почему в данном случае в useState ( в хуке useDebounce ) не попадает новое значение ? Всё работает как должно , просто интересно почему там нет нового значения .. Своё предположение я оставил в коде ..
  • Вопрос задан
  • 92 просмотра
Решения вопроса 1
SADFGHJAETJER
@SADFGHJAETJER
- console.log("return value from debouncedValue ( old )", debouncedValue);
+ useEffect(() => {
+   console.log("return value from debouncedValue ( old )", debouncedValue);
+ }, [debouncedValue])


Потому, что нужно изучить то, как работает реактивность реакта.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы