Vue3.0新特性
中文文档
- Composition Api (最核心)
- v-model更改
- v-for的key节点上的使用情况更改
- v-if和v-for对同一元素的优先级更高
- ref内部v-for不再注册引用数组
- 功能组件只能使用普通函数创建
- 异步组件需要使用
defineAsyncComponent创建方法 - 所有插槽都通过
$slots - 在
destroyed生命周期的选项已更名为unmounted - 在
beforeDestroy生命周期的选项已更名为beforeUnmount
Vue3.0优缺点
优点:
- 将Vue内部的绝大部分api对外暴露,使Vue具备开发大型项目的能力,例如compile编译api等
- webpack的treeshaking(tree shaking 是 DCE 的一种方式,它可以在打包时忽略没有用到的代码。)支持度友好
- 使用Proxy进行响应式变量定义,性能提高1.2~2倍
- ssr快了2~3倍
- 可在Vue2.0中单独使用composition-api插件,或者直接用它开发插件
- 对typescript支持更加友好
- 面向未来:对于尤雨溪最近创新的vite开发服务器(舍弃webpack、底层为Koa框架的高性能开发服务器),直接使用的Vue3.0语法
缺点:
- vue3将不再支持IE11,Vue 在 2.X 版本仍然支持 IE11,如果你想使用类似 Vue 3 的新特性,可以等等 Vue 2.7 版本。这次的 RFC 宣布,将会对 2.7 版本做向后兼容,移植 3.x 的部分新功能,以保证两个版本之间相似的开发体验。
- 对于习惯了Vue2.0开发模式的开发者来说,增加了心智负担,对开发者代码组织能力有体验
同时也是能力提升的机会吧,特别喜欢Vue作者的而设计初心:让开发者随着框架一起成长
体验Vue3.0的四种姿势
现在来说,体验Vue3.0有四种姿势 传送门
- 通过CDN:
<script src="https://unpkg.com/vue@next"></script> - 通过 Codepen 的浏览器 playground
- 脚手架 Vite:
npm init vite-app hello-vue3 # OR yarn create vite-app hello-vue3
脚手架 vue-cli
npm install -g @vue/cli # OR yarn global add @vue/cli\ vue create hello-vue3\ # select vue 3 preset
全局API
新的全局api:createApp
调用createApp返回一个应用实例,这是Vue3.0的新概念:
打开src/main.js
import { createApp } from 'vue'
import App from './App.vue'
const app = createApp(App)
app.mount('#app')
setup
setup函数是一个新的组件选项。作为组件内使用Composition API的入口点
创建组件实例,然后初始化props,紧接着调用setup函数。它会在beforeCreate钩子之前调用。
setup返回一个对象。则对象的所有属性(它是响应式的数据)都可以直接在模板中使用。相当于vue2.0中data函数返回的对象。
App.vue
<script>
export default {
setup () {
return {}
}
}
</script>
响应式数据
- ref:可传入任意类型的值并返回一个响应式且可改变的ref对象。ref对象拥有一个指向内部值的单一属性
.value,改变值的时候必须使用其value属性 - reactive:接受一个普通对象然后返回该普通对象的响应式代理。等同于2.x的
Vue.obserable()
简写之:reactive负责复杂数据结构,ref可以把基本的数据结构包装成响应式
reactive
<template>
<div>
<h2>{{state.count}}</h2>
<button @click="add">计算</button>
</div>
</template>
<script>
import { reactive } from "vue";
export default {
setup(){
// 响应式变量声明 reactive负责复杂数据结构,
const state = reactive({
count: 1
});
function add() {
state.count++;
}
return { state, add};
}
};
</script>
复制代码
ref
<template>
<div>
<h2>{{state.count}}</h2>
<h3>{{num}}</h3>
<button @click="add">计算</button>
</div>
</template>
<script>
import { reactive, ref } from "vue";
export default {
setup(){
const state = reactive({
count: 1
});
const num = ref(0);
function add() {
state.count++;
num.value+=2
}
return { state, add, num };
}
};
</script>