Как использовать методы жизненного цикла с хуками в React? - PullRequest
0 голосов
/ 08 ноября 2018

Я прошел через хуки, представленные в реакции v16.7.0.

https://reactjs.org/docs/hooks-intro.html

Итак, мое понимание хуков состоит в том, что мы можем играть с состоянием в функциональном компоненте без написания компонентов класса в реакции. Это действительно удивительная особенность.

Но я не получаю четкого представления об использовании хуков в функциональных компонентах.

   import { useState } from 'react';

   function Example() {
   const [count, setCount] = useState(0);

    return (
      <div>
        <p>You clicked {count} times</p>
        <button onClick={() => setCount(count + 1)}>
         Click me
        </button>
      </div>
   );
  }

как я могу использовать методы жизненного цикла в вышеупомянутом функциональном компоненте, если я использую хуки?

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Команда React предоставила useEffect хук для этой цели. Давайте возьмем компонент в вашем примере и добавим загрузку на сервер для подсчета, который мы бы в противном случае поместили, например, componentDidUpdate

 import { useState, useEffect } from 'react';

 function Example() {
   const [count, setCount] = useState(0);
   useEffect(() => {
     fetch(
       'server/url',
       {
         headers: {
           'Accept': 'application/json',
           'Content-Type': 'application/json'
         },
         body: JSON.stringify({count}),
       }
     ); 
   });

   return (
     <div>
       <p>You clicked {count} times</p>
       <button onClick={() => setCount(count + 1)}>
         Click me
       </button>
     </div>
   );
 }

Это не похоже на огромную победу в этом примере, потому что это не так. Но проблема с методами жизненного цикла состоит в том, что вы получаете только один из них в своем компоненте. Что, если вы хотите загрузить на сервер, запустить событие и поместить сообщение в очередь, и ни одна из этих вещей не связана? Жаль, что все они собрались вместе в componentDidUpdate. Или у вас есть n слоев обернутых HOC для ваших n вещей, которые вы хотите сделать. Но с помощью хуков вы можете разделить все эти вызовы на разъединенные вызовы на useEffect без ненужных слоев HOC.

0 голосов
/ 12 ноября 2018

Вот примеры наиболее распространенных жизненных циклов:

componentDidMount

Передать пустой массив в качестве второго аргумента useEffect(), чтобы запустить только обратный вызов только при монтировании.

function Example() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    document.title = `You clicked ${count} times`;
  }, []); // Pass an empty array to run only callback on mount only.

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

componentDidUpdate (свободно)

Передав только один аргумент в useEffect, он будет запускаться после каждого рендеринга. Это свободный эквивалент, потому что здесь есть небольшая разница: componentDidUpdate не будет работать после первого рендера, но эта версия ловушек запускается после каждого рендера.

function Example() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    document.title = `You clicked ${count} times`;
  }); // No second argument, so run after every render.

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

componentDidUpdate (строго)

Разница этого примера с примером выше в том, что обратный вызов здесь не будет выполняться при начальном рендеринге, строго эмулируя семантику componentDidUpdate. Этот ответ принадлежит Толле , вся заслуга ему.

function Example() {
  const [count, setCount] = useState(0);

  const firstUpdate = useRef(true);
  useLayoutEffect(() => {
    if (firstUpdate.current) {
      firstUpdate.current = false;
      return;
    }

    console.log('componentDidUpdate');
  });

  return (
    <div>
      <p>componentDidUpdate: {count} times</p>
      <button
        onClick={() => {
          setCount(count + 1);
        }}
      >
        Click Me
      </button>
    </div>
  );
}

componentWillUnmount

Возвращает обратный вызов в аргументе обратного вызова useEffect, и он будет вызван перед размонтированием.

function Example() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    // Return a callback in useEffect and it will be called before unmounting.
    return () => {
      console.log('componentWillUnmount!');
    };
  });

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

shouldComponentUpdate

Вы уже можете достичь этого на уровне компонентов, используя React.PureComponent или React.memo. Для предотвращения повторного рендеринга дочерних компонентов этот пример взят из React docs :

function Parent({ a, b }) {
  // Only re-rendered if `a` changes:
  const child1 = useMemo(() => <Child1 a={a} />, [a]);
  // Only re-rendered if `b` changes:
  const child2 = useMemo(() => <Child2 b={b} />, [b]);
  return (
    <>
      {child1}
      {child2}
    </>
  )
}

getDerivedStateFromProps

Снова взято из React docs

function ScrollView({row}) {
  let [isScrollingDown, setIsScrollingDown] = useState(false);
  let [prevRow, setPrevRow] = useState(null);

  if (row !== prevRow) {
    // Row changed since last render. Update isScrollingDown.
    setIsScrollingDown(prevRow !== null && row > prevRow);
    setPrevRow(row);
  }

  return `Scrolling down: ${isScrollingDown}`;
}

getSnapshotBeforeUpdate

Нет эквивалента для крючков.

componentDidCatch

Нет эквивалента для крючков.

0 голосов
/ 08 ноября 2018

Ну, на самом деле у вас нет методов жизненного цикла.=) Но вы могли бы использовать ловушку эффекта, как показано здесь https://reactjs.org/docs/hooks-effect.html

Хук эффекта сможет копировать поведение componentDidMount, componentDidUpdate и componentWillUnmount

Так что вы действительно этого не делаетенужны методы жизненного цикла в компоненте.Хук эффекта занимает их место вместо этого.=)

Прочитайте ссылку выше, и вы получите несколько примеров того, как они работают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...