vue3.0的变化与2.0的区别【一】
生命周期的变化
vue3.x的生命周期
vue2.x
对比之下可以看出来vue3.0和vue2.0之间生命周期函数在销毁的时候有区别
beforeUnmount -->beforeDestroy
unmounted-->destroyed
定义全局变量的方法变化
vue2.x
Vue.prototype.$axios = () => {}
vue3.x
const app = createApp({})
app.config.globalProperties.$axios = () => {}
创建vue实例化
vue2.x
import Vue from 'vue' import App from './App.vue' import router from './router' Vue({ router, render: h => h(App) }).$mount('#app')
vue3.x
//使用createApp函数来实例化vue//该函数接收一个根组件选项对象作为第一个参数
//使用第二个参数,我们可以将根 prop 传递给应用程序
import { createApp } from 'vue' import App from './App.vue' import router from './router'
var app = createApp(App)
app.use(router)
app.mount('#app') //由于 createApp 方法返回应用实例本身,因此可以在其后链式调用其它方法。
插槽使用变化
vue2.x
vue 在 2.6.0 中,具名插槽和作用域插槽引入了一个新的统一的语法 :v-slot 指令。 它取代了 slot 和 slot-scope 这两个目前已被废弃但未被移除且仍有用的特性。 但是将会在vue 3 中,这两个指令将会被废弃
子组件
父组件
Home
{{item.text.msg}}
for="u in item.user" :key='u'>{{u.name}}
具名插槽
匿名插槽
vue3.x
//在vue3.0中,插槽使用v-slot 简写用#default> // 可以写为v-slot:default //一个组件里面具有多个插槽时,一定要带上名称,否则可能会导致作用域错乱默认插槽//作用域插槽 // 可以写为v-slot:test="newData"{{ newData.aa }}
{{ newData.bb }}
自定义指令
vue2.x
// 注册一个全局自定义指令 `v-focus` Vue.directive('focus', { // 当被绑定的元素插入到 DOM 中时…… inserted: function (el) { // 聚焦元素 el.focus() } })
在 Vue 2 中, 自定义指令通过以下几个可选钩子创建:
bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
inserted:被绑定元素插入父节点时调用(仅保证父节点存在,但不一定已被插入文档中)。
update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。
componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
unbind:只调用一次,指令与元素解绑时调用。
vue3.x
const { createApp } from "vue" const app = createApp({}) app.directive('focus', { mounted(el) { el.focus() } })
双向数据绑定
vue2.x
VUe2.0通过Object.definePropety来劫持对象属性的getter和setter操作,当数据发生变化时通知
vue3.x
vue3.0通过Proxy来劫持数据,当数据发生变化时发出通知
proxy相较于object.defineProperty的优势
- defineProperty只能监听某个属性,不能对全对象监听
- Proxy可以监听数组的变化,不用再去单独的对数组做特异性操作
- 可以检测到数组内部数据的变化
异步组件的使用
vue2定义异步组件
vue3中使用defineAsyncComponent 定义异步组件
Composition API
使用Composition API 解决我们在完成功能时,在 data、methods、computed 以及 mounted 中反复的跳转,他将零散分布的 逻辑组合在一起维护,并可以将单独的逻辑再分为单独的文件
-
setup
- setup是Vue3.x的新增选项,是组件内使用Composition API的入口
输出结果:
总结:setup
执行时机是在 beforeCreate
之前执行
setup参数
setup接收两个参数(props和context),props是响应式的,当传入新的props时,会及时更新。由于是响应式的,所以不可以使用ES6解构,解构会消除它的响应式
setup(props) { const { userName } = props; console.log(userName ); const state = reactive({ num: 0 }); return { state, }; },
reactive、ref、toRefs
在 vue2.x 中, 定义数据都是在data
中。Vue3.x可以使用reactive和ref来进行数据定义
reactive用于处理对象的双向绑定
ref处理js基础数据类型或者处理对象的双向绑定
计数:{{ num }}s
人年龄:{{ person.age }}
人姓名:{{ person.name }}
狗类别:{{ dog.type }}
狗名称:{{ dog.name }}
狗年龄:{{ dog.age }}
通过绑定dog.name,dog.type写的比较繁琐,就需要解构数据,但是又不能又ES6解构,因为会会消除props响应式。既想要解构后的数据又不使用解构,解决办法就是使用toRefs。
toRefs作用就是将一个reactive对象转化为属性全部为ref对象的普遍对象
计数:{{ num }}s
人年龄:{{ person.age }}
人姓名:{{ person.name }}
狗类别:{{ type }}
狗名称:{{ name }}
狗年龄:{{ age }}
- 生命周期钩子
vue3.x
import { defineComponent, onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted, onErrorCaptured, onRenderTracked, onRenderTriggered, } from "vue"; export default defineComponent({ setup() { console.log("setup"); onBeforeMount(() => { console.log("onBeforeMount"); }); onMounted(() => { console.log("onMounted"); }); onBeforeUpdate(() => { console.log("onBeforeUpdate"); }); onUpdated(() => { console.log("onUpdated"); }); onBeforeUnmount(() => { console.log("onBeforeUnmount"); }); onUnmounted(() => { console.log("onUnmounted"); }) }, });
vue2.x