千家信息网

vue3与vue2的区别是什么

发表于:2024-11-12 作者:千家信息网编辑
千家信息网最后更新 2024年11月12日,这篇"vue3与vue2的区别是什么"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"v
千家信息网最后更新 2024年11月12日vue3与vue2的区别是什么

这篇"vue3与vue2的区别是什么"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"vue3与vue2的区别是什么"文章吧。

1.生命周期的变化:3.x(上) 2.x(下)


不难看出,vue3.0与vue2.0之间生命周期函数在销毁的时候有变化:

beforeDestroy --> beforeUnmountdestroyed --> unmounted
其他的区别主要在于书写使用的语言上的差别在ts中使用 class 类组件书写可以 参考 vue-class-component 或者 vue-property-decorator书写的风格和vue2.0的选项式区别不大。如果使用js书写代码 则应当使用组合式。

具体变化带来的问题,会在下面的组合式写法中讲解。

2.定义全局变量的方法变化

// 之前(Vue 2.x)Vue.prototype.$http = () => {}Vue.prototype.url= 'http://123'// 之后(Vue 3.x)const app = createApp({})app.config.globalProperties.$http = () => {}app.config.globalProperties.url= 'http://123'

3.创建vue实例变化

//=======vue3.x//使用createApp函数来实例化vue,//该函数接收一个根组件选项对象作为第一个参数//使用第二个参数,我们可以将根 prop 传递给应用程序import { createApp } from 'vue'import App from './App.vue'import router from './router'import store from './store'createApp(App,{ userName: "blackLieo" }).use(store).use(router).mount('#app')  //由于 createApp 方法返回应用实例本身,因此可以在其后链式调用其它方法,这些方法可以在以下部分中找到。//=======vue2.ximport Vue from 'vue'import App from './App.vue'import router from './router'import store from './store' Vue({  router,  store,  render: h => h(App)}).$mount('#app')

4.插槽使用变化

//================vue2.0使用插槽基本上直接使用slot进行操作//其中vue2.0经历了两次更迭,2.6.0版本slot升级为v-slot

// 具名 作用域插槽 //默认插槽

//父组件调用该组件 // 作用域插槽 //==============vue3.0使用插槽//在vue3.0中,插槽使用v-slot 简写用#

//作用域插槽 //一个组件里面具有多个插槽时,一定要带上名称,否则可能会导致作用域错乱

5.自定义指令

在 Vue 2 中实现一个自定义指令:

// 注册一个全局自定义指令 `v-focus`Vue.directive('focus', {  // 当被绑定的元素插入到 DOM 中时……  inserted: function (el) {    // 聚焦元素    el.focus()  }})

在 Vue 2 中, 自定义指令通过以下几个可选钩子创建:

  • bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。

  • inserted:被绑定元素插入父节点时调用(仅保证父节点存在,但不一定已被插入文档中)。

  • update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。

  • componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。

  • unbind:只调用一次,指令与元素解绑时调用。

在 Vue 3 中对自定义指令的 API 进行了更加语义化的修改, 就如组件生命周期变更一样, 都是为了更好的语义化, 变更如下:

所以在 Vue3 中, 可以这样来自定义指令:

const { createApp } from "vue"const app = createApp({})app.directive('focus', {    mounted(el) {        el.focus()    }})

然后可以在模板中任何元素上使用新的 v-focus指令, 如下:

6.v-model 升级

Vue 3 中 v-model 发生了很大的变化:

变更:在自定义组件上使用v-model时, 属性以及事件的默认名称变了变更:v-bind的.sync修饰符在 Vue 3 中又被去掉了, 合并到了v-model里新增:同一组件可以同时设置多个 v-model新增:开发者可以自定义 v-model修饰符

我们来详细了解一下,并对比一下vue2与vue3 在组件上使用 v-model,
例如:
vue2 的输入框的双向绑定,其实就相当于传递了value属性, 并触发了input事件:

这时v-model只能绑定在组件的value属性上,那如果我们要给自己的组件用一个别的属性,并且我们不想通过触发input来更新值。

但是在实际开发中,有些场景我们可能需要对一个 prop 进行 "双向绑定", 这里以最常见的 dialog 为例子:dialog 挺合适属性双向绑定的,外部可以控制组件的visible显示或者隐藏,组件内部关闭可以控制 visible属性隐藏,同时 visible 属性同步传输到外部。组件内部, 当我们关闭dialog时, 在子组件中以 update:PropName 模式触发事件。

事件为

this.$emit('update:visible', false)

然后在父组件中可以监听这个事件进行数据更新:

在vue2的开发中,我们实际会发现一个新的东西sync,所以也可以使用v-bind.sync来简化实现:

上面说了 Vue2 中v-model实现以及组件属性的双向绑定,那么在 Vue 3 中应该怎样实现的呢?
在 Vue3 中, 在自定义组件上使用v-model, 相当于传递一个modelValue 属性, 同时触发一个update:modelValue事件:

如果要绑定属性名, 只需要给v-model传递一个参数就行, 同时可以绑定多个v-model

这个写法完全没有.sync什么事儿了, Vue 3 中抛弃了.sync写法, 统一使用v-model。

7.异步组件的使用

Vue3 中 使用 defineAsyncComponent 定义异步组件,配置选项 component 替换为 loader ,Loader 函数本身不再接收 resolve 和 reject 参数,且必须返回一个 Promise,用法如下: