We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
关于vue3的重构背景,尤大是这样说的:
vue3
「Vue 新版本的理念成型于 2018 年末,当时 Vue 2 的代码库已经有两岁半了。比起通用软件的生命周期来这好像也没那么久,但在这段时期,前端世界已经今昔非比了
在我们更新(和重写)Vue 的主要版本时,主要考虑两点因素:首先是新的 JavaScript 语言特性在主流浏览器中的受支持水平;其次是当前代码库中随时间推移而逐渐暴露出来的一些设计和架构问题」
简要就是:
从上图中,我们可以概览Vue3的新特性,如下:
Vue3
vue3相比vue2
vue2
重写了虚拟Dom实现
Dom
编译模板的优化
更高效的组件初始化
undate性能提高1.3~2倍
undate
SSR速度提高了2~3倍
SSR
通过webpack的tree-shaking功能,可以将无用模块“剪辑”,仅打包需要的
webpack
tree-shaking
能够tree-shaking,有两大好处:
对开发人员,能够对vue实现更多其他的功能,而不必担忧整体体积过大
vue
对使用者,打包出来的包体积变小了
vue可以开发出更多其他的功能,而不必担忧vue打包出来的整体体积过多
Options API
VUE3是基于typescipt编写的,可以享受到自动的类型定义提示
VUE3
typescipt
可以自定义渲染 API
响应式 Api 暴露出来
Api
轻松识别组件重新渲染原因
Vue 3 中需要关注的一些新功能包括:
在 Vue3.x 中,组件现在支持有多个根节点
Vue3.x
<!-- Layout.vue --> <template> <header>...</header> <main v-bind="$attrs">...</main> <footer>...</footer> </template>
Teleport 是一种能够将我们的模板移动到 DOM 中 Vue app 之外的其他位置的技术,就有点像哆啦A梦的“任意门”
Teleport
DOM
Vue app
在vue2中,像 modals,toast 等这样的元素,如果我们嵌套在 Vue 的某个组件内部,那么处理嵌套组件的定位、z-index 和样式就会变得很困难
modals
toast
Vue
z-index
通过Teleport,我们可以在组件的逻辑位置写模板代码,然后在 Vue 应用范围之外渲染它
<button @click="showToast" class="btn">打开 toast</button> <!-- to 属性就是目标位置 --> <teleport to="#teleport-target"> <div v-if="visible" class="toast-wrap"> <div class="toast-msg">我是一个 Toast 文案</div> </div> </teleport>
通过createRenderer,我们能够构建自定义渲染器,我们能够将 vue 的开发模型扩展到其他平台
createRenderer
我们可以将其生成在canvas画布上
canvas
关于createRenderer,我们了解下基本使用,就不展开讲述了
import { createRenderer } from '@vue/runtime-core' const { render, createApp } = createRenderer({ patchProp, insert, remove, createElement, // ... }) export { render, createApp } export * from '@vue/runtime-core'
composition Api,也就是组合式api,通过这种形式,我们能够更加容易维护我们的代码,将相同功能的变量进行一个集中式的管理
api
关于compositon api的使用,这里以下图展开
compositon api
简单使用:
export default { setup() { const count = ref(0) const double = computed(() => count.value * 2) function increment() { count.value++ } onMounted(() => console.log('component mounted!')) return { count, double, increment } } }
Vue API
API
tree-shakable
v-model
<template v-for>
v-for
key
v-if
v-bind="object"
ref
functional
(SFC)
defineAsyncComponent
$scopedSlots
$slots
class
v-enter
v-enter-from
v-leave
v-leave-from
watch
$watch
Vue 2.x
outerHTML
VUE3.x
innerHTML
destroyed
unmounted
beforeDestroy
beforeUnmount
[prop default
this
data
mixin
attribute
<template>
v-if/else-if/else
v-slot
Vue 3.x
keyCode
v-on
$on
$off
$once
filter
$destroy
The text was updated successfully, but these errors were encountered:
“其他小改变”中的前两条有误,应该是 destroyed 生命周期选项被重命名为 onUnmounted beforeDestroy 生命周期选项被重命名为 onBeforeUnmount
Sorry, something went wrong.
都没毛病,unmounted是options api的写法,onUnmounted 是composition api的写法
练习时长两年半的vue2
No branches or pull requests
一、Vue3介绍
关于
vue3
的重构背景,尤大是这样说的:「Vue 新版本的理念成型于 2018 年末,当时 Vue 2 的代码库已经有两岁半了。比起通用软件的生命周期来这好像也没那么久,但在这段时期,前端世界已经今昔非比了
在我们更新(和重写)Vue 的主要版本时,主要考虑两点因素:首先是新的 JavaScript 语言特性在主流浏览器中的受支持水平;其次是当前代码库中随时间推移而逐渐暴露出来的一些设计和架构问题」
简要就是:
哪些变化
从上图中,我们可以概览
Vue3
的新特性,如下:速度更快
vue3
相比vue2
重写了虚拟
Dom
实现编译模板的优化
更高效的组件初始化
undate
性能提高1.3~2倍SSR
速度提高了2~3倍体积更小
通过
webpack
的tree-shaking
功能,可以将无用模块“剪辑”,仅打包需要的能够
tree-shaking
,有两大好处:对开发人员,能够对
vue
实现更多其他的功能,而不必担忧整体体积过大对使用者,打包出来的包体积变小了
vue
可以开发出更多其他的功能,而不必担忧vue
打包出来的整体体积过多更易维护
compositon Api
Options API
一起使用Vue3
模块可以和其他框架搭配使用更好的Typescript支持
VUE3
是基于typescipt
编写的,可以享受到自动的类型定义提示编译器重写
更接近原生
可以自定义渲染 API
更易使用
响应式
Api
暴露出来轻松识别组件重新渲染原因
二、Vue3新增特性
Vue 3 中需要关注的一些新功能包括:
framents
在
Vue3.x
中,组件现在支持有多个根节点Teleport
Teleport
是一种能够将我们的模板移动到DOM
中Vue app
之外的其他位置的技术,就有点像哆啦A梦的“任意门”在
vue2
中,像modals
,toast
等这样的元素,如果我们嵌套在Vue
的某个组件内部,那么处理嵌套组件的定位、z-index
和样式就会变得很困难通过
Teleport
,我们可以在组件的逻辑位置写模板代码,然后在Vue
应用范围之外渲染它createRenderer
通过
createRenderer
,我们能够构建自定义渲染器,我们能够将vue
的开发模型扩展到其他平台我们可以将其生成在
canvas
画布上关于
createRenderer
,我们了解下基本使用,就不展开讲述了composition Api
composition Api,也就是组合式
api
,通过这种形式,我们能够更加容易维护我们的代码,将相同功能的变量进行一个集中式的管理关于
compositon api
的使用,这里以下图展开简单使用:
三、非兼容变更
Global API
Vue API
已更改为使用应用程序实例API
已经被重构为可tree-shakable
模板指令
v-model
用法已更改<template v-for>
和 非v-for
节点上key
用法已更改v-if
和v-for
优先级已更改v-bind="object"
现在排序敏感v-for
中的ref
不再注册ref
数组组件
functional
属性在单文件组件(SFC)
defineAsyncComponent
方法来创建渲染函数
API
改变$scopedSlots
property 已删除,所有插槽都通过$slots
作为函数暴露class
被重命名了:v-enter
->v-enter-from
v-leave
->v-leave-from
watch
选项和实例方法$watch
不再支持点分隔字符串路径,请改用计算函数作为参数Vue 2.x
中,应用根容器的outerHTML
将替换为根组件模板 (如果根组件没有模板/渲染选项,则最终编译为模板)。VUE3.x
现在使用应用程序容器的innerHTML
。其他小改变
destroyed
生命周期选项被重命名为unmounted
beforeDestroy
生命周期选项被重命名为beforeUnmount
[prop default
工厂函数不再有权访问this
是上下文data
应始终声明为函数mixin
的data
选项现在可简单地合并attribute
强制策略已更改class
被重命名$watch
不再支持以点分隔的字符串路径。请改用计算属性函数作为参数。<template>
没有特殊指令的标记 (v-if/else-if/else
、v-for
或v-slot
) 现在被视为普通元素,并将生成原生的<template>
元素,而不是渲染其内部内容。Vue 2.x
中,应用根容器的outerHTML
将替换为根组件模板 (如果根组件没有模板/渲染选项,则最终编译为模板)。Vue 3.x
现在使用应用容器的innerHTML
,这意味着容器本身不再被视为模板的一部分。移除 API
keyCode
支持作为v-on
的修饰符$on
,$off
和$once
实例方法filter
attribute
$destroy
实例方法。用户不应再手动管理单个Vue
组件的生命周期。参考文献
The text was updated successfully, but these errors were encountered: