Вы можете найти это введение полезным:
https://medium.com/dailyjs/tracing-or-debugging-vue-js-reactivity-the-computed-tree-9da0ba1df5f9
Как вы упомянули, каждое свойство данных будет иметь свой собственный экземпляр Dep
. Каждый Dep
имеет свойство subs
, которое содержит массив подписчиков. Все подписчики в этом массиве будут экземплярами класса Watcher
. Если свойство данных изменяется, то соответствующий Dep
уведомит каждого Watcher
в своем subs
.
Каждый Watcher
также содержит ссылки на свои зависимости в свойстве с именем deps
. Это просто массив объектов Dep
, на которые подписан Watcher
.
Вы сможете увидеть это в инструментах разработчика вашего браузера. Если вы зарегистрируете экземпляр Vue, вы обнаружите свойство с именем _watchers
, которое содержит все наблюдатели, связанные с этим компонентом. Расширение их deps
приведет вас к Dep
объектам, хотя сложно определить, какое именно свойство данных представляет Dep
.
Процесс рендеринга имеет Watcher
, который он использует для отслеживания своих зависимостей данных. Вы получите только один из них для каждого экземпляра компонента.
A Watcher
также создается, если вы используете часы или $ часы . Снова вы сможете увидеть их в _watchers
.
Вычисляемые свойства имеют по одному Watcher
каждое. Они будут присутствовать в массиве _watchers
, но их легче увидеть в _computedWatchers
.
Ключевым моментом, который следует отметить, является то, что зависимости сглаживаются. Если вы используете вычисляемое свойство, вы на самом деле просто получите зависимость от всех свойств данных, которые в него повлияли. Вы не можете сформировать прямую зависимость от самого вычисляемого свойства.
Итак, вернемся к исходному вопросу:
- Рендеринг, вычисленные свойства и
watch
будут вносить вклад в subs
из Dep
. Вычисленные свойства часто приносят больше подписчиков, чем можно было ожидать из-за сглаживания зависимостей.
- Почти. Функция
render
не вызывается напрямую. Когда Watcher
для рендеринга уведомляется об изменении данных, он фактически просто добавляет компонент в очередь. Эта очередь рендеринга не будет обработана до начала следующего тика.