vue2升级到 Vue3的异同(入门须知)
vue2升级到Vue3的异同构建项目不一样, 具体查看 构建项目main.js 的不一样vue2 中的mian.js 里面导入的是vue 实例,vue 3中的main.js 如下的结构:注意: 由于vue3.0 使用的是 import {createApp} from ‘vue’ 而不是像vue2.0的import Vuefrom ‘vue’。因此之前使用的ui框架以及第三方包可能会因为不支持vu
vue2升级到Vue3的异同
- 构建项目不一样, 具体查看 构建项目
- main.js 的不一样
vue2 中的mian.js 里面导入的是vue 实例,
vue 3中的main.js 如下的结构:
注意: 由于vue3.0 使用的是 import {createApp} from ‘vue’ 而不是像vue2.0的import Vue
from ‘vue’。因此之前使用的ui框架以及第三方包可能会因为不支持vue3.0而报错。
标题this 问题
在vue2中使用this打印的结果是当前组件实例对象, 但是在Vue3中的this指向的 代理 proxy,
构建工具的区别
vue3的性能主要提升在哪些方面
1.静态提升
下面的静态节点会被提升
- 元素节点
- 没有绑定动态内容
// vue2 的静态节点
render(){
createVNode("h1", null, "Hello World")
// ...
}
// vue3 的静态节点
const hoisted = createVNode("h1", null, "Hello World")
function render(){
// 直接使用 hoisted 即可
}
静态属性会被提升
<div class="user">
{{user.name}}
</div>
const hoisted = { class: "user" }
function render(){
createVNode("div", hoisted, user.name)
// ...
}
2.预字符串处理话
<div class="menu-bar-container">
<div class="logo">
<h1>logo</h1>
</div>
<ul class="nav">
<li><a href="">menu</a></li>
<li><a href="">menu</a></li>
<li><a href="">menu</a></li>
<li><a href="">menu</a></li>
<li><a href="">menu</a></li>
</ul>
<div class="user">
<span>{{ user.name }}</span>
</div>
</div>
编译结果
import { createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from "vue"
const _withScopeId = n => (_pushScopeId("scope-id"),n=n(),_popScopeId(),n)
const _hoisted_1 = { class: "menu-bar-container" }
const _hoisted_2 = /*#__PURE__*/_createStaticVNode("<div class=\"logo\" scope-id><h1 scope-id>logo</h1></div><ul class=\"nav\" scope-id><li scope-id><a href=\"\" scope-id>menu</a></li><li scope-id><a href=\"\" scope-id>menu</a></li><li scope-id><a href=\"\" scope-id>menu</a></li><li scope-id><a href=\"\" scope-id>menu</a></li><li scope-id><a href=\"\" scope-id>menu</a></li></ul>", 2)
const _hoisted_4 = { class: "user" }
export function render(_ctx, _cache, $props, $setup, $data, $options) {
return (_openBlock(), _createElementBlock("div", _hoisted_1, [
_hoisted_2,
_createElementVNode("div", _hoisted_4, [
_createElementVNode("span", null, _toDisplayString(_ctx.user.name), 1 /* TEXT */)
])
]))
}
// Check the console for the AST
当编译器遇到大量连续(目前的限制是连续10个静态节点)的静态内容,会直接将其编译为一个普通字符串节点
const _hoisted_2 = /*#__PURE__*/_createStaticVNode("<div class=\"logo\" scope-id><h1 scope-id>logo</h1></div><ul class=\"nav\" scope-id><li scope-id><a href=\"\" scope-id>menu</a></li><li scope-id><a href=\"\" scope-id>menu</a></li><li scope-id><a href=\"\" scope-id>menu</a></li><li scope-id><a href=\"\" scope-id>menu</a></li><li scope-id><a href=\"\" scope-id>menu</a></li></ul>", 2)
3.缓存事件处理
<button @click="count++">plus</button>
// vue2
render(ctx){
return createVNode("button", {
onClick: function($event){
ctx.count++;
}
})
}
// vue3
render(ctx, _cache){
return createVNode("button", {
onClick: cache[0] || (cache[0] = ($event) => (ctx.count++))
})
}
4.block tree
vue2在对比新旧树的时候,并不知道哪些节点是静态的,哪些是动态的,因此只能一层一层比较,这就浪费了大部分时间在比对静态节点上
vue3对比新旧节点,会标记静态节点和动态的节点,对比的时候就不需要采用树的广度和深度算法去进行递归的对比,只要对比动态的节点即可
<form>
<div>
<label>账号:</label>
<input v-model="user.loginId" />
</div>
<div>
<label>密码:</label>
<input v-model="user.loginPwd" />
</div>
</form>
5.patch flag
vue2在对比每一个节点时,并不知道这个节点哪些相关信息会发生变化,因此只能将所有信息依次比对
vue3 会采用记录的形式,把节点的动态内容给记录下来,然后在对节点发生变化的节点进行对比更新
<div class="user" data-id="1" title="user name">
{{user.name}}
</div>
响应式原理的异同
api方面
VUE2对于js数据处理的是, options Api
Vue3使用的是 composition Api 也可以使用options Api
更多推荐
所有评论(0)