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

Immutable.js утилита обертки

Автор оригинала: Rex Ogbemudia.

Обо мне

Привет! Я Rex Ogbemudia от Lagos Nigeria, в настоящее время я работаю в Andela в качестве разработчика программного обеспечения JavaScript за последние один год. Мой фокус в основном был на Frontend, создавая нашу внутреннюю систему управления информацией, используя React/Redux.

Для чего мы решаем?

Когда вы создаете масштабные приложения, используя React/Redux и предотвращая государственную мутацию, кажется большим вопросом, первое решение, которое может прийти к уму, с использованием Immutable.js. Хотя это может быть хорошая идея, у него также есть свои недостатки. Одним из его главных недостатков является тот факт, что для того, чтобы свидетельствовать о том, чтобы потреблять данные из магазина, вам либо нужно использовать Тойс Способ, который, как говорят, имеет свой собственный выпуск производительности или вы должны представить APIS Immutable.js в ваших компонентах. Добавление Immutable.js apit apit к вашим компонентам реагирования делают их плотно связанные с библиотекой immutable.js, следовательно, предотвращают использование ваших компонентов без необходимости редактирования их.

Прокси к спасению!

Основная ответственность представления в вашем приложении является отображение данных. Для компонентов реагирования для потребления данных из магазина без добавления Immutable.js API в них в них необходимо создать обертку вокруг наших коллекций Immutable.js. Для этого нам нужно использовать Proxy API, представленного JavaScript в ES6. Что такое прокси? Прокси – объекты в JavaScript, которые обертывают другие объекты. У них есть ловушки, которые являются методами, которые перехватывают нормальные операции, выполняемые против прокси, ниже, является примером прокси.

var person = {
  name: "john doe",
  age: 12
}

var handler = {
  get(target, key) {
    console.log(`get person's ${key}`);
    return target[key];
  }
};

var personProxy = new Proxy(person, handler);
personProxy.name
// console.log => get person name
// return => john doe
    

Создание Immutable.js объектная обертка с прокси

Теперь я собираюсь работать на нас, как построить обертку Immutable.js, используя прокси;

Создание объекта обработчика

Обработчик прокси – это объект, который удерживает разные способы обработчика. Методы обработчиков являются методами, которые перехватывают операции, выполняемые на объекте. Посетите эту ссылку, чтобы узнать больше о Прокси-обработчики Отказ В нашем случае нам нужно только использовать получить метод обработчика.

Класс обработчика

class Handler {
  get(target, name) {
   //...
  }
}

Выше находится наш класс обработчика, и у него есть получить Метод, получить Метод принимает два аргумента, цель и Имя , цель является ссылкой на обернутый объект в нашем случае Immutable.js коллекция и Имя Относится к собственности, мы пытаемся получить из нашей неизменной коллекции.

class Handler {
  get(target, name) {
   const isValue = target.has(name);
    if (isValue) {
      const value = target.get(name);
      return value
    }
  }
}

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

class Handler {
  get(target, name) {
   const isValue = target.has(name);
    if (isValue) {
      const value = target.get(name);
      return value
    }
    
    const attribute = target[name];
    if (typeof attribute === 'function') {
      return (...args) => {
        const value = attribute.apply(target, args);
        return value;
      };
    }
    return attribute;
  }
}

Если isvalue Неверно, нам нужно проверить, пытается ли абонент получить доступ к Immutable.js-методу или переменной, примеры таких методов и переменных являются Получить () , Установить () , имеет () , Размер так далее. Чтобы удовлетворить это, мы получаем атрибут, а затем проверьте, является ли атрибут функцией, если да, мы возвращаем функцию еще, что мы возвращаем атрибут.

Создание прокси-функции

Ага! Мы успешно создали обработчик прокси. Теперь мы должны создать прокси-объект, чтобы сделать это, мы должны создать функцию.

function createImmutableProxy(value, throwError = false) {
  if (!isImmutable(value)) {
    if (throwError) throw new Error('Expected an immutable object');
    return value;
  }

  const handler = new Handler();
  return new Proxy(value, handler);
}

Вышеуказанная функция создает неизменяемую объекту прокси-обертки при прохождении значения, является неизмеренным объектом, оно бросает ошибку или возвращает значение, когда он не является коллекцией Immutable.js.

Вложенные коллекции

В сценарии, в котором значение, возвращенное из нашего метода обработчика, является коллекцией Immutable.js, нам нужно вернуть завернуваемую версию нашей коллекции Immutable.js, чтобы сделать это, нам нужно сделать несколько корректировку метода обработчика.

class Handler {
  get(target, name) {
   const isValue = target.has(name);
    if (isValue) {
      const value = target.get(name);
      return createImmutableProxy(value);
    }
    
    const attribute = target[name];
    if (typeof attribute === 'function') {
      return (...args) => {
        const value = attribute.apply(target, args);
        return createImmutableProxy(value);
      };
    }
    return attribute;
  }
}

Теперь мы обновили метод обработчика для возврата неизменной прокси-обертки, когда значение является Immutable.js Collection, что мы возвращаем значение так, как оно есть.

Последние мысли

Было бы неплохо иметь ловушку для добавления значений на Immutable.js коллекции, но Immutable.js коллекции всегда возвращают новый объект, когда мы добавляем или обновляем объект. Лучшим способом было бы, чтобы мы были противостоять искушению модификации сбора Immutable.js по мнению, модификации, должны быть сделаны на уровне «редуктора». Вид должен заботиться только о диспетчере действиях к редуктору и не добавлять или удалять значения из коллекции Immutable.js.