Рубрики
Без рубрики

Очистка кода JavaScript: Как вы можете рефакторовать для использования классов

В меньших реагированных проектах сохранение всех ваших методов компонентов в самих компонентов хорошо работает. В средствах среднего размера вы можете оказаться желающим, чтобы вы могли получить эти методы из ваших компонентов и в «помощник». Здесь я покажу вам, как использовать класс (вместо экспорта

Автор оригинала: FreeCodeCamp Community Member.

В меньших реагированных проектах сохранение всех ваших методов компонентов в самих компонентов хорошо работает. В средствах среднего размера вы можете оказаться желающим, чтобы вы могли получить эти методы из ваших компонентов и в «помощник». Здесь я покажу вам, как использовать класс (вместо экспорта отдельных функций и переменных) для организации вашего кода.

Примечание : Я работаю в реакции, так что это пример, который мы обсудим здесь.

Типичный рефтектор

В типичном рефакторе вы бы сделали функцию на компоненте и переместите ее в другой помощник.

Из:

const MyComponent = () => {
  const someFunction = () => 'Hey, I am text'
  return (
    
{someFunction()}
) }

К:

import { someFunction } from 'functionHelper.js'
const MyComponent = () => {
  return (
    
{someFunction()}
) }

и

export const someFunction = () => 'Hey, I am text'

Этот пример действительно глупо, но вы видите, где мы идем:

  1. Возьмите свои функции и скопируйте их в отдельный файл
  2. Импортировать их и позвонить им как обычно.

Когда все усложняется, однако, вам придется пройти в кучу вещей к тем функциям – объектам, функциям для манипулирования состоянием и так далее. Сегодня я столкнулся с проблемой, где я хотел извлечь три функции из компонента, и все они требуют одних и тех же входов (A Resource и функция обновления Resource ). Там есть лучший способ …

Рефакторинг с классом

Я сделал большую демонстрацию для этого поста. Вы можете увидеть код на Github Отказ Первоначальный коммит показывает все функциональные возможности внутри основного компонента ( app.js ) и последующие коммиты Refactor код для использования класса.

Вы можете запустить это сами и делать все, что вы хотите. Не забудьте Пряжа устанавливает Отказ

Мы начинаем с компонента, который «вытесняет» объект (подражающий тому, как мы могли бы сделать это с API) с определенными атрибутами на него: повтор (количество коробок), боковой (высота и ширина), текст, цвет. Затем у нас есть несколько способов манипулировать видом – изменение цвета, обновляя текст и так далее. После каждого изменения мы отображаем сообщение.

Например, вот наша изменение ширины и метод высоты:

changeSide = side => {
  const obj = {...this.state.obj, side}
  this.fetchObject(obj);
  this.setState({ message: `You changed the sides to ${side} pixels!` });
}

У нас может быть ряд других методов, которые требуют подобных действий – или, возможно, очень разные методы. Мы могли бы начать думать о извлечении этого кода к помощнику. Тогда мы создадим другой метод, чтобы позвонить в SetState Действие, и мы должны были пройти, this.fetchObject , объект в штате, и сторона Мы получаем аргумент для метода. Если у нас есть несколько аналогичных методов, это многое количество прохождения параметров, и, возможно, это не так полезно (или читабельно).

Вместо этого мы можем использовать класс, в комплекте с помощью метода конструктора:

export default class ObjectManipulator {
  constructor( { object, fetchObject, markResettable, updateMessage, updateStateValue } ) {
    this.fetchObject = fetchObject;
    this.markResettable = markResettable;
    this.updateMessage = updateMessage;
    this.updateStateValue = updateStateValue;
  }

  changeSide = ( object, side ) => {
    const newObject = { ...object, side };
    this.fetchObject(newObject);
    this.updateMessage(`You changed the sides to ${side} pixels!`);
    this.markResettable();
    this.updateStateValue('side', side);
  };
};

Это позволяет нам создать объект, функции которых мы можем позвонить внутри нашего основного компонента:

const manipulator = new ObjectManipulator({
  object,
  fetchObject: this.fetchObject,
  markResettable: this.markResettable,
  updateMessage: this.updateMessage,
  updateStateValue: this.updateStateValue,
});

Это создает объект Манипулятор – пример нашего ObjectManipulator учебный класс. Когда мы называем Manipulator.Changeside (объект, 800 ') Это будет запускать переходит Метод мы определяем выше. Там нет необходимости проходить в UpdateMessage Или любой из других методов – мы забираем их от конструктора, когда мы создали экземпляр.

Вы можете представить, что это становится действительно полезным, если у нас есть много этих методов для решения. В моем случае мне нужно было позвонить .then (res => myфункция (r es) После всего, что я пытался извлечь. Defionaby NG Myfunctore Ион на экземпляре класса вместо того, чтобы пройти через каждую функцию, сохранил меня много кода.

Сохранение всего организовано

Этот метод организации может быть действительно полезным, чтобы все осталось на своем месте. Например, у меня есть массив цветов, которые я снова отображаю, чтобы получить цветные кнопки, которые вы видите в примере. Перемещая эту константу в ObjectManipulator Я могу убедиться, что он не столкнулся с любыми другими Цвета В остальной части моего приложения:

export default class ObjectManipulator {
  [...]

  colors = ['blue', 'red', 'orange', 'aquamarine', 'green', 'gray', 'magenta'];
};

Я могу использовать Манипулятор. Цвета Чтобы схватить правильные цвета для этой страницы, тогда как может быть глобальный Цвета Константа, которая используется для чего-то другого.

использованная литература

Хорошие добрые докторы Mozilla Class