miliko0022
@miliko0022
Краткие личные сведения, включая интересующую вас

Если props меняются, каким образом я могу дать начальное значение, чтобы избежать эффекта анти-паттерна?

Я использую реагирующие крючки. Если реквизиты изменены, какие способы получить начальное значение? Я хочу избежать эффекта анти-паттерна.

ситуация 1

перед построением DOM.

насколько я понимаю, для этих целей подойдет использование useMemo.if есть другие варианты, которые вы можете их показать.

ситуация 2

после DOM

И в этом варианте useLayoutEffect, useEffect.if есть другие варианты, которые вы можете их показать.

import React, { useState, useMemo, useLayoutEffect, useEffect } from "react";
import ReactDOM from "react-dom";

import "./styles.css";
const X = () => {
  const [x, setX] = useState(0);
  return (
    <div>
      <div>
        <Y x={x} />
      </div>
      <div onClick={() => setX(x + 1)}>{"go"}</div>
    </div>
  );
};

function Y({ x }) {
  const [y, setY] = useState(x);

 /* useMemo(() => {
    console.log("");
    setY(x);*/
  }, [x]);
  /*useEffect(() => {
    console.log("");
    setY(x);
  }, [x]);*/
  /*useLayoutEffect(() => {
    console.log("");
    setY(x);
  }, [x]);*/
  console.log(y);
  return <div className="App">{console.log(y, "DOM")}</div>;
}

const rootElement = document.getElementById("root");
ReactDOM.render(<X />, rootElement)


Я не думаю, что это хорошая практика, чтобы использовать все эти крючки. но я не вижу другого решения. Может быть, есть третий вариант без использования хуков?
  • Вопрос задан
  • 142 просмотра
Решения вопроса 1
rockon404
@rockon404 Куратор тега React
Frontend Developer
Думаю тут правильней использовать useEffect:
function Y({ x }) {
  const [y, setY] = useState(x);
  useEffect(() => {
    if (x !== y) {
      setY(x);
    }
  }, [x, y]);

  return ( ... );
}

useMemo лучше использовать для расчетов основанных на props, возврата колбеков, использующих, какой-нибудь debounce, но не для изменения состояния во время отрисовки.
Ну и главное, что библиотека может в любой момент забыть меморизированное значение и пересчитать его заново, о чем есть примечание в документации. Так вы можете потерять текущее состояние.
Третий вариант это использование классовых компонентов и методов жизненного цикла.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы