Трекинг¶
Вначале изучите эти темы: сигналы, эффекты, предметы.
Трекинг - это механизм, который Solid использует для "отслеживания" того, когда был получен доступ к сигналу. Так он узнает, какие эффекты следует повторно запустить при изменении сигнала.
Что нужно знать¶
- Цель отслеживания - регистрация подписок. Когда эффект "подписывается" на сигнал, он будет повторно запускаться при изменении этого сигнала.
- Отслеживание происходит при доступе. При обращении к сигналу (или хранимому значению) внутри эффекта сигнал "отслеживается", и эффект подписывается на него.
- Отслеживание происходит не везде. Если обратиться к сигналу вне эффекта, то отслеживания не произойдет. Это связано с тем, что нет эффекта, который мог бы подписаться на этот сигнал.
- Эмпирическое правило отслеживания: Обращайтесь к реактивному значению в то же время, когда вы его используете.
Это относится не только к сигналам, созданным с помощью createSignal - свойства и хранилища работают аналогичным образом.
Пример¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
Проблемы с трекингом¶
Рассмотрим несколько примеров, в которых мы можем применить элемент отслеживания для отладки кода.
Производное состояние¶
В этом примере абзац не будет обновляться при изменении count, поскольку доступ к count был получен вне области отслеживания.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Решение заключается в том, чтобы превратить doubleCount в функцию. Таким образом, при использовании doubleCount в JSX будет вызываться count() и регистрироваться подписка.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Деструктуризация свойств¶
В этом примере абзац в DoubleCountView никогда не будет обновляться.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
Здесь реактивным значением является свойство value, переданное от родителя. Где находится доступ к этому значению?
1 | |
Это деструктурирующее присваивание является единственным кодом, который действительно обращается к свойствам props.value! После этого value просто представляет собой статическое значение, к которому обращались в данный момент.
Чтобы исправить это, нам необходимо убедиться, что мы доступаем к значению одновременно с тем, как используем его. Мы можем вызвать props.value напрямую:
1 2 3 4 | |
В качестве альтернативы можно деструктурировать свойства props одновременно с их использованием:
1 2 3 4 5 6 7 | |