createMemo¶
Мемо позволяют эффективно использовать производное значение во многих реактивных вычислениях. createMemo создает реактивное значение readonly, равное возвращаемому значению заданной функции, и следит за тем, чтобы эта функция выполнялась только при изменении ее зависимостей.
1 2 3 4 5 6 7 | |
Вот пример использования createMemo:
1 2 3 4 5 6 | |
В Solid часто нет необходимости оборачивать функции в памятки; в качестве альтернативы можно просто определить и вызвать обычную функцию, чтобы получить аналогичное реактивное поведение. Основное различие заключается в том, что функция вызывается в нескольких реактивных настройках. В этом случае при обновлении зависимостей функция будет вызываться несколько раз, если она не обернута в createMemo. Например:
1 2 3 4 5 6 7 8 9 10 | |
Когда сигнал имени пользователя обновляется, searchForUser будет вызван только один раз. Если возвращаемый пользователь действительно изменился, то обновляется памятка пользователя, и тогда оба элемента списка обновляются автоматически.
Если бы вместо этого мы определили user как простую функцию () => searchForUser(username()), то searchForUser вызывался бы дважды, по одному разу при обновлении каждого элемента списка.
Еще одно ключевое отличие заключается в том, что мемо может защитить зависимые элементы от обновления, когда изменяются зависимости мемо, но не изменяется результирующее значение мемо. Как и createSignal, производный сигнал, созданный createMemo, обновляется (и вызывает повторное выполнение зависимостей) только тогда, когда значение, возвращаемое функцией memo, действительно меняется по сравнению с предыдущим значением, в соответствии с оператором JavaScript ===. В качестве альтернативы можно передать объект options с equals, установленным в false, чтобы всегда обновлять memo при изменении зависимостей, или передать собственную функцию equals для проверки равенства.
Функция memo вызывается с аргументом, равным значению, возвращенному при предыдущем выполнении функции memo, или, при первом вызове, равным необязательному второму аргументу функции createMemo. Это удобно для сокращения вычислений, таких как:
1 2 | |
Функция memo не должна изменять другие сигналы путем вызова сеттеров (она должна быть "чистой"). Это позволяет Solid оптимизировать порядок выполнения обновлений мемов в соответствии с их графом зависимостей, так что все мемы могут обновляться не более одного раза в ответ на изменение зависимости.
Параметры и аргументы¶
| Наименование | Тип | Описание |
|---|---|---|
fn | (v: T) => T | Функция для мемоизации. |
value | T | Начальное значение мемо. |
options | { equals?: false | ((prev: T, next: T) => boolean) } | Необязательный объект с функцией equals для проверки равенства. |