1.为何学习vue
Web1.0
- 后端MVC
- 前后端强耦合
- JSP, Smarty模板
Web2.0
- AJAX
- jQuery
- 主要解决跨浏览器兼容性问题
- 复杂的业务难以维护
- 频繁的操作DOM效率低,并且维护麻烦
MVVM
- View-Model层
- Angular
- Angular1
- 脏检查
- 每次用户交互都检查所有数据的变化,有则通知DOM更新
- 最早的数据驱动
- Angular2
- Vue
- Vue1
- Vue2
- 引入虚拟DOM
- 一个watch一个组件
- 同时diff是单位是以组件级别,而不是整个页面的树
- 加入了template,约束用户的编写,提高了简单业务的效率
- Vue3
- 基于template做了很多编译时的优化
- 使用Proxy提升了响应式的效率
- 主要是在编译时
- React
- 虚拟DOM
- 每次比较整棵虚拟DOM的树,找到差异才执行DOM更新
- JSON schema
- diff比较时间过长
- JSX
- Fiber
- 主要是在运行时
- Svelte
2.Vue3 新特征
Vue2 缺点
- 类型支持:Flow.js已经不再维护
- 代码耦合度太高,想单独使用Weex都需要copy完整一份源码改
- 响应性效率低,每个watch都要使用前,提前初始化
Vue3 - 7个新特点
- RFC 社区讨论机制
- 响应式系统
- 自定义渲染器
- 响应式与Vue解构
- 可以预其他react node 或者canvas实现集成
- 所有模块的TypeScript实现
- CompositionAPI
- 组合API
- 可以复用业务逻辑,并且解决OptionAPI跳屏问题
- 搭配setup写法
- 新的组件
- Fragment
- Teleport
- Suspense
- Vite构建调试工具
- 只根据首页所依赖的内容打包,不会全量打包
- 提升开发阶段的调试效率
3.Vue2 升级到 Vue3
前提
- 兼容性不好,不支持IE11
- 使用Vue2.7让大家提前熟悉CompositionAPI特性
迁移文档
多个 createApp -> 多个use
Vue-cli4
自动化工具升级Vue3
- 在Vue3项目中有
@vue/compact
- "@vue/compat": "^3.2.19"
- "@vue/compiler-sfc": "^3.2.19"
module.exports = {
chainWebpack: config => {
config.resolve.alias.set('vue', '@vue/compat')
......
}
}
npm install gogocode-cli -g
gogocode -s ./src -t gogocode-plugin-vue -o ./src-out
gogocode -s package.json -t gogocode-plugin-vue -o package_out.json
npm install
栗子 todolist
<script setup>
import { computed, ref } from 'vue'
let title = ref('')
let todoList = ref([
{
title: 'xxxxxx',
done: false,
},
])
const addTodo = () => {
if (!title.value.trim()) {
} else {
todoList.value.push({
title: title.value.trim(),
done: false,
})
title.value = ''
}
}
const deleteTodo = (index) => {
todoList.value.splice(index, 1)
}
const clear = () => {
todoList.value = todoList.value.filter((todoItem) => !todoItem.done)
}
let undoneCount = computed(() => {
return todoList.value.filter((todoItem) => !todoItem.done).length
})
let all = computed(() => todoList.value.length)
let allDone = computed({
get: function () {
return undoneCount.value === 0
},
set: function (value) {
todoList.value.forEach((todoItem) => (todoItem.done = value))
},
})
</script>
<template>
<input v-model="title" type="text" @keydown.enter="addTodo" />
<button v-if="undoneCount < all" @click="clear">清空完成选项</button>
<template v-if="todoList.length">
<li v-for="(todoItem, index) in todoList" :key="todoItem.title">
<input v-model="todoItem.done" type="checkbox" />
<span :class="{ done: todoList.done }">{{ todoItem.title }}</span>
<span @click="deleteTodo(index)"> x </span>
</li>
<div>全部完成<input v-model="allDone" type="checkbox" /></div>
<div>完成情况{{ all - undoneCount }} / {{ all }}</div>
</template>
<div v-else>暂无数据</div>
</template>
参考
玩转 Vue 3 (geekbang.org)