Уникальное хранилище для каждого вызова функции внутри React HOC - PullRequest
0 голосов
/ 10 апреля 2020

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

По сути, это помощник для оболочки высшего порядка. Это означает, что хранилище должно быть создано для каждого HO C, но не должно быть воссоздано при следующем повторном рендеринге.

Теперь это выглядит так: псевдокод

var storage; // I want to create this storage for every HOC only once.

function createDynamicStyles(theme, stylesCreator, status) {
// create a styles registry only once. This function can be re-called by the same HOC
// on each re-render so I want to use the memoized registry.
  if (!storage) { 
    storage = stylesCreator(theme);
   };

   return storage[status];
}

const styleCreator = theme => ({
  disabled: { color: theme.disabled },
  success: { color: theme.success }
})

const Component_1 = componentHOC((props) => {
  const { theme, status } = props;
  // I'd like to keep this helper call as simple as possible. It already has 3 arguments.
  const finalStyle = createDynamicStyles(theme, stylesCreator, status);

})(AwesomeComponent)

// these props can be changed during runtime
<Component_1 disabled={false} success={true} /> 

Функциональный поток этого помощника можно разделить на 2 этапа. 1) Первый звонок HO C. Он создает стили на основе темы и сохраняет их в хранилище 2) Следующая повторная визуализация HO C. Он должен извлечь ранее созданные стили и вернуть запомненное значение. Это значение должно быть уникальным для каждого HO C.

Проблема в том, что один и тот же помощник можно использовать и для других компонентов, и это означает, что мы не можем использовать одно и то же хранилище, поскольку оно будет перезаписано а вот «последние» HO C.

Возможные способы, как это решить: 1) Создайте класс, который будет содержать само хранилище и создаст новый экземпляр для каждого HO C. Честно говоря, я бы хотел этого избежать, потому что в данном случае это выглядит слишком сложно.

2) Создайте общий реестр и передайте UUID для каждого HO C. Было бы неплохо, но я не знаю, как автоматически это сделать. Я не хочу вручную передавать UUID на каждый HO C. Я хотел бы иметь эту функцию под капотом, чтобы облегчить вызовы HO C.

Я думал о new Map и сохранении созданных стилей в виде пары ключ-значение, но это просто не не работает, поскольку у нас нет сгенерированной ссылки KEY в HO C. Поэтому мы не можем использовать его в качестве ключа.

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

Спасибо за любую помощь и предложение. С уважением.

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