Цели дизайна Vue3.0
- меньше
- Быстрее (*)
- Укрепление поддержки TeampStry (*)
- Повышение согласованности дизайна API
- Улучшить их ремонтопригодность
- Открыть больше низкоуровневых функций
Быстрее
- Object.defineProperty -> Прокси (более детально)
- Реконструкция виртуального дома
Реконструкция виртуального дома
Гранулярность является компонентом.
Хотя Vue может гарантировать, что компонент, запускающий обновление, сведен к минимуму, все же необходимо пройти все дерево Virtual DOM компонента внутри одного компонента.
Производительность традиционного виртуального DOM положительно связана с размером шаблона, а не с количеством динамических узлов. В случае некоторых компонентов с несколькими динамическими узлами во всем шаблоне эти обходы являются пустой тратой производительности.
Vue3.0 Virtual DOM
Тактильное сочетание
- Структура узла не изменится вообще
- только один динамический узел
Изменение структуры узла v-if
- v-if external: только v-if является динамическим узлом
- Внутри v-if: только {{ message }} являются динамическими узлами
Изменение структуры узла v-for
- V-для внешнего: V-для только динамического узла (фрагмент)
- Внутри каждого цикла v-for: только {{ item.message }} являются динамическими узлами
Дерево блоков
- Разделить шаблон на вложенные блоки на основе директив динамического узла
- Структура узлов внутри каждого блока фиксирована
Обновить
TypeScript (опущен)
Дизайн API
Fuction-based API
const App = {
setup() {
// data
const count = value(0)
// computed
const plusOne = computed(() => count.value + 1)
// method
const increment = () => { count.value++ }
// watch
watch(() => count.value * 2, v => console.log(v))
// lifecycle
onMounted(() => console.log('mounted!'))
// 暴露给模板或渲染函数
return { count }
}
}
преимущество
- отсутствие конфликтов пространств имен
- Источники данных понятны
- Отсутствие дополнительного потребления производительности компонентов
Сравнить API классов
- Улучшенная поддержка вывода типа TypeScript
- Более гибкая возможность логического мультиплексирования
- Дружелюбный к деревьям
- Код легче сжимать
Более гибкая возможность повторного использования логики
Прослушивание положения мыши:
определение
function useMousePosition() {
const x = value(0)
const y = value(0)
const update = e => {
x.value = e.pageX
y.value = e.pageY
}
onMounted(() => {
window.addEventListener('mousemove', update)
})
onUnmounted(() => {
window.removeEventListener('mousemove', update)
})
return { x, y }
}
использовать
new Vue({
template: `
<div>
Mouse position: x {{ x }} / y {{ y }}
</div>
`,
setup() {
const { x, y } = useMousePosition()
return { x, y }
}
})