React - это наиболее используемая интерфейсная библиотека для создания современных интерактивных интерфейсных веб-приложений. Его также можно использовать для создания мобильных приложений.

В этой статье мы рассмотрим, как правильно писать компоненты React.

Переключение компонентов

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

import React from "react";
const Foo = () => <p>foo</p>;
const Bar = () => <p>bar</p>;
export default function App() {
  const [toggle, setToggle] = React.useState(false);
  return (
    <>
      <div>
        <button onClick={() => setToggle(toggle => !toggle)}>Toggle</button>
        {toggle ? <Foo /> : <Bar />}
      </div>
    </>
  );
}

В приведенном выше коде у нас есть компоненты Foo и Bar, между которыми мы хотим переключаться. Для этого мы использовали тернарное выражение в следующем коде:

{toggle ? <Foo /> : <Bar />}

Приведенный выше код возвращает Foo или Bar с учетом значения toggle. Поэтому, когда мы нажимаем кнопку Toggle, вызывается метод setToggle, а затем React отображает Foo или Bar в зависимости от того, является ли toggle true или нет.

Если мы хотим включать и выключать один компонент, мы можем написать следующий код:

import React from "react";
const Foo = () => <p>foo</p>;
export default function App() {
  const [toggle, setToggle] = React.useState(false);
  return (
    <>
      <div>
        <button onClick={() => setToggle(toggle => !toggle)}>Toggle</button>
        {toggle ? <Foo /> : undefined}
      </div>
    </>
  );
}

Мы можем поместить null или undefined в JSX, если не хотим ничего отображать. Также мы можем написать:

import React from "react";
const Foo = () => <p>foo</p>;
export default function App() {
  const [toggle, setToggle] = React.useState(false);
  return (
    <>
      <div>
        <button onClick={() => setToggle(toggle => !toggle)}>Toggle</button>
        {toggle && <Foo />}
      </div>
    </>
  );
}

В приведенном выше коде мы использовали оператор &&, чтобы показать Foo только тогда, когда toggle равно true.

Разрушение свойств и состояния

Деструктуризация свойств и состояния - это здорово, потому что мы можем выборочно выбирать, какие свойства и состояние отображать в соответствии с нашими предпочтениями.

Мы можем деструктурировать props, написав следующее для функциональных компонентов:

import React from "react";
const Person = ({ firstName, lastName, age }) => (
  <p>
    {firstName} {lastName} {age}
  </p>
);
export default function App() {
  return (
    <>
      <div>
        <Person firstName="Jane" lastName="Smith" age={20} />
      </div>
    </>
  );
}

В приведенном выше коде мы передаем свойства firstName, lastName и age в Person, затем мы использовали синтаксис деструктуризации в параметре Person, чтобы извлечь свойства из параметров.

Таким образом, мы видим:

Jane Smith 20

отображается на экране, когда мы передаем реквизиты в App и рендерим их в Person.

Для компонентов класса мы можем деструктурировать свойства и указать следующее:

import React from "react";
class Person extends React.Component {
  render() {
    const { firstName, lastName, age } = this.props;
    return (
      <p>
        {firstName} {lastName} {age}
      </p>
    );
  }
}
export default function App() {
  return (
    <>
      <div>
        <Person firstName="Jane" lastName="Smith" age={20} />
      </div>
    </>
  );
}

В приведенном выше коде у нас есть компонент класса Person, который имеет метод render. Мы получаем доступ к реквизитам с помощью this.props, а затем деструктурируем свойства this.props в их собственные переменные.

Затем мы отображаем их в элементе p. Таким образом, мы получим тот же результат, что и раньше.

Точно так же мы можем деструктурировать состояния следующим образом:

import React from "react";
export default class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      posCount: 0,
      negCount: 0
    };
  }
  render() {
    const { posCount, negCount } = this.state;
    return (
      <div>
        <button
          onClick={() => this.setState(count => ({ posCount: posCount + 1 }))}
        >
          Increment
        </button>
        <button
          onClick={() => this.setState(count => ({ negCount: negCount - 1 }))}
        >
          Decrement
        </button>
        <p>{posCount}</p>
        <p>{negCount}</p>
      </div>
    );
  }
}

В приведенном выше коде у нас есть состояния posCount и negCount. Затем у нас есть 2 обработчика событий для установки состояния posCount и negCount соответственно. Затем мы отображаем их в тегах p.

Поскольку мы деструктурировали this.state в первой строке render метода, мы можем получить к ним доступ, не ссылаясь на this.state в каждой строке, что сэкономило нам много времени на набор текста и сделало код намного чище.

Заключение

Мы можем переключать компоненты с помощью тернарного выражения, если мы хотим переключаться между двумя компонентами. Если мы хотим включать и выключать один компонент, мы можем использовать оператор &&.

Кроме того, мы должны деструктурировать наши реквизиты и состояния, чтобы нам не приходилось постоянно ссылаться на props, this.props или this.state, и сделать наш код чище, и мы также можем меньше печатать.