4 примера хуков useState

JavaScript React.js

Автор: Дэйв Седдиа Переводчик: Front-end Xiaozhi Источник: daveceddia

Ставь лайк и смотри, поиск в WeChat【Переезд в мир】Обратите внимание на этого человека, который не имеет большого фабричного прошлого, но имеет восходящий и позитивный настрой. эта статьяGitHub GitHub.com/QQ449245884…Он был включен, статьи были классифицированы, и многие мои документы и учебные материалы были систематизированы.

Все говорили, что нет проекта для написания резюме, поэтому я помог вам найти проект, и это было с бонусом.【Учебник по строительству】.

Что касается React 16.8, то если мы пишем функциональный компонент, а затем сталкиваемся с ситуацией, когда нам нужно добавить состояние, мы должны преобразовать компонент в компонент класса.

записыватьclass Thing extends React.Component, скопируйте тело функции вrender()метод, исправьте отступ и, наконец, добавьте требуемое состояние.

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

что делает useState

useStateХуки позволяют нам добавлять состояние к функциональным компонентам, мы обычно называем их «хуками», но на самом деле они являются функциями и входят в состав React 16.8. Вызывая функциональный компонентuseStateЭто создаст отдельное состояние.

В компоненте классаstateВсегда объект, для которого можно добавить свойства сохранения.

Для хуков состояние не обязательно должно быть объектом, оно может быть любого типа — массивы, числа, логические значения, строки и т. д. каждый звонокuseStateсоздастstateблок, содержащий значение.

Пример: показать/скрыть компоненты с помощью useState

Этот пример представляет собой компонент, который отображает некоторые текст и в концеread moreСсылка, при нажатии на ссылку она расширяет остальную часть текста.

import React, { useState } from 'react';
import ReactDOM from 'react-dom';

// 两个 props:
//   text - 显示的内容
//   maxLength - 在点击“read more”之前显示多少个字符
function LessText({ text, maxLength }) {
  // 创建一个状态,并将其初始化为“true”
  const [hidden, setHidden] = useState(true);


  if (text <= maxLength) {
    return <span>{text}</span>;
  }

  return (
    <span>
      {hidden ? `${text.substr(0, maxLength).trim()} ...` : text}
      {hidden ? (
        <a onClick={() => setHidden(false)}> read more</a>
      ) : (
        <a onClick={() => setHidden(true)}> read less</a>
      )}
    </span>
  );
}

ReactDOM.render(
  <LessText
    text={`专注、努力是成功的真正关键。把你的眼睛盯在目标上,然后朝着目标迈出下一步`}
    maxLength={35}
  />,
  document.querySelector('#root')
);

Всего одной строкой кода мы делаем этот функциональный компонент с состоянием:

const [hidden, setHidden] = useState(true);

Но что именно делает эта функция?Если она вызывается при каждом рендеринге (что она и делает), как она сохраняет состояние.

Советы по реализации хуков

«Магия» здесь заключается в том, что React поддерживает объект за кулисами для каждого компонента, и внутри этого постоянного объекта есть массив «ячеек состояния». когда ты звонишьuseStateчас,ReactСохраните это состояние в следующей доступной ячейке и увеличьте индекс массива.

Предположим, вашhooksвсегда вызываются в одном и том же порядке (при соблюдении правил для хуков они будут в том же порядке), React умеет находить конкретныеuseStateПредыдущее значение вызова. правильноuseStateПервый вызов сохраняется в первом элементе массива, второй вызов сохраняется во втором элементе и так далее.

Это тоже не очень волшебная вещь, в основном это зависит от того факта, что вы, возможно, не думали об этом: компоненты, которые мы пишем, сделаныReactcall , поэтому он может выполнить некоторую работу заранее, прежде чем вызывать компонент. Кроме того, акт рендеринга компонента — это не просто вызов функции. картина<Thing />ТакойJSXкомпилируется какReact.createElement(Thing)- Судя по всему, React контролирует, как и когда он вызывается.

Пример: обновить состояние на основе предыдущего состояния

Посмотрите другой пример: обновление на основе предыдущего значенияstateценность .

Мы собираемся создать шагомер, который подсчитывает каждый раз, когда вы нажимаете кнопку, и после того, как вы нажмете на нее, он сообщит вам, сколько шагов вы сделали.

import React, { useState } from 'react';

function StepTracker() {
  const [steps, setSteps] = useState(0);

  function increment() {
    setSteps(steps => steps + 1);
  }

  return (
    <div>
      总共走了 {steps} 步!
      <br />
      <button onClick={increment}>
        点点我,步数不是个事!
      </button>
    </div>
  );
}

ReactDOM.render(
  <StepTracker />,
  document.querySelector('#root')
);

Во-первых, позвонивuseStateсоздать новыйstateи инициализируйте его как0. он возвращаетсяstepsтекущая стоимость0а такжеsetStepsфункция обновленияsteps,использоватьincrementфункционировать, чтобыstepsУвеличить на 1.

Здесь вы также можете оптимизировать извлечениеincrementфункция, вы можете напрямуюincrementвстроенный внутри функции дляonClickв:

<button onClick={() => setSteps(steps => steps + 1)}>
  I took another step
</button>

Пример: состояние как массив

запомнить,stateВы можете сохранить любое значение, которое хотите. Вот пример списка случайных чисел, нажатие на кнопку добавит в список новое случайное число:

function RandomList() {
  const [items, setItems] = useState([]);

  const addItem = () => {
    setItems([
      ...items,
      {
        id: items.length,
        value: Math.random() * 100
      }
    ]);
  };

  return (
    <>
      <button onClick={addItem}>Add a number</button>
      <ul>
        {items.map(item => (
          <li key={item.id}>{item.value}</li>
        ))}
      </ul>
    </>
  );
}

Обратите внимание, что мыstateинициализируется пустым массивом[], И вaddItemОбновите значение в функции.

setItemsвозобновитьstateСтарое значение не будет "объединяться" - оно будет использовать покрытие нового значения.state. Это то же самое, чтоthis.setStateВ классе это работает иначе.

Пример: состояние с несколькими ключами

Посмотри снова,stateДля примера объекта создайте форму входа с 2 полями:usernameа такжеpassword.

Следующий пример в основном показывает, какstateОбъекты хранят несколько значений и как обновить одно значение.

function LoginForm() {
  const [form, setValues] = useState({
    username: '',
    password: ''
  });

  const printValues = e => {
    e.preventDefault();
    console.log(form.username, form.password);
  };

  const updateField = e => {
    setValues({
      ...form,
      [e.target.name]: e.target.value
    });
  };

  return (
    <form onSubmit={printValues}>
      <label>
        Username:
        <input
          value={form.username}
          name="username"
          onChange={updateField}
        />
      </label>
      <br />
      <label>
        Password:
        <input
          value={form.password}
          name="password"
          type="password"
          onChange={updateField}
        />
      </label>
      <br />
      <button>Submit</button>
    </form>
  );
}

Если вы хотите попробовать, см.CodeSandbox.

Во-первых, мы создаемstateфрагмент и инициализировать его объектом

const [form, setValues] = useState({
  username: '',
  password: ''
})

Это похоже на способ инициализации состояния в классе.

Существует также функция, которая обрабатывает представления, где,e.preventDefaultчтобы предотвратить обновление страницы и распечатать значения формы.

updateFieldФункции интереснее. оно используетsetValuesПри передаче объекта, чтобы гарантировать, что существующее состояние не будет перезаписано, используется операция распространения (...form).

Ошибки, которые могут существовать после развертывания кода, нельзя узнать в режиме реального времени.Чтобы решить эти ошибки впоследствии, много времени тратится на отладку логов.Кстати, всем рекомендую полезный инструмент мониторинга ошибок.Fundebug.

оригинал:Дэйв Решительность 嗲.com/usst-ну...

общаться с

Статья постоянно обновляется каждую неделю. Вы можете выполнить поиск «Big Move to the World» в WeChat, чтобы прочитать и обновить ее как можно скорее (на одну или две статьи раньше, чем в блоге). Эта статья находится на GitHub.GitHub.com/QQ449245884…Он был включен, и многие мои документы были разобраны. Добро пожаловать в Звезду и совершенство. Вы можете обратиться в тестовый центр для ознакомления во время собеседования. Кроме того, обратите внимание на паблик-аккаунт и ответьте в фоновом режиме.Благосостояние, вы можете увидеть преимущества, вы знаете.