前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >细数那些Vue3中不兼容老版本的改动,避免踩坑

细数那些Vue3中不兼容老版本的改动,避免踩坑

作者头像
夜尽天明
发布2023-03-15 15:45:41
1.4K0
发布2023-03-15 15:45:41
举报
文章被收录于专栏:全栈修炼全栈修炼
作为技术人员,随时保持技术同步是很重要的事情。虽然Vue3已经发布很长时间了,现在开始保持更新也还不晚。新项目可以拿来练练手XD,老项目就不建议升级了。

🔥🔥建立项目

1. 使用 vite-app

代码语言:javascript
复制
npm init vite-app <project-name>

这里的vite-app是一个新项目,它的官方介绍是一个快速的WEB开发构建工具。这里我们试了一下,整个构建过程十分的快速。和以往的webpack build的方式不一样,它使用了原生ES模块加载。

2. 使用vue-cli

代码语言:javascript
复制
npm install -g @vue/cli # OR yarn global add @vue/cli
vue create <project-name>

🔥🔥v-model新语法糖

默认使用modelValue传递值。

代码语言:javascript
复制
<ChildComponent  v-model="pageTitle" />

<!-- would be shorthand for: -->

<ChildComponent  :modelValue="pageTitle" @update:modelValue="pageTitle = $event" />

也支持绑定不同的属性,有点像是v-modelsync的结合体。

代码语言:javascript
复制
<ChildComponent  v-model:title="pageTitle"  v-model:content="pageContent" />

<!-- would be shorthand for: -->

<ChildComponent  :title="pageTitle" @update:title="pageTitle = $event"  :content="pageContent" @update:content="pageContent = $event" />

🔥🔥全局API

1. 不再使用new Vue

问题

使用new Vue会共享一个全局配置。这对于测试来说不太友好,每个测试用例都需要一个沙盒环境,全局变量去残留一些副作用。

解决

开始使用application概念,创建一个App

2. 不再用Vue.prototype

代码语言:javascript
复制
// before - Vue 2
Vue.prototype.$http = () => {}` 

`// after - Vue 3
const app = Vue.createApp({})
app.config.globalProperties.$http = () => {}

3. 全局方法现在在app实例上

vue2.x

vue3

Vue.component

app.component

Vue.directive

app.directive

Vue.mixin

app.mixin

Vue.use

app.use

4. 现在需要手动挂载根元素

app.mount("#app")

5. Tree-shaking

In Vue 3, the global and internal APIs have been restructured with tree-shaking support in mind.

没有用到的方法(代码)最后不会被打包到最终的包中。这可以优化项目体积。 但是用法也需要进行改变:

代码语言:javascript
复制
import { nextTick } from 'vue'

nextTick(() => {
  // something DOM-related
})

不能再使用Vue.nextTick/this.$nextTick

🔥异步组件需要显示定义

代码语言:javascript
复制
import { defineAsyncComponent } from 'vue'

const asyncPage = defineAsyncComponent(() => import('./NextPage.vue'))

🔥$attrs 将包含class和style

vue2.x中,classstyle会被直接设置在组件的根元素上并且不会出现在$attrs中。 但是在vue3中,如果子组件只有一个根元素,则classstyle会被直接设置在该元素上。超过一个则不会设置。 如果组件中设置了inheritAttrs: false,则无论如何都不会自动设置根元素的classstyle

$listeners被移除

事件监听器也被包含还在了$attrs中。

现在属性透传更方便了!

🔥指令

指令和组件生命周期更契合,并使用统一的命名。

vue2.x

vue3

bind

beforeMount

inserted

mounted

-

beforeUpdate (新)

update (移除)

-

componentUpdated

updated

-

beforeUnmount (新)

unbind

unmounted

新特性fragments

允许组件有多个根元素!

template允许设置key

循环template再也不用往里面设置key了。

scopedSlots正式弃用

vue2.6中对slot进行了改版,但是仍然对scopedSlots兼容,vue3正式弃用掉scopedSlots

监听数组变化需要用deep属性啦

如果不加deep只能检测整个数组被替换。

$children 被移除

如果想访问子组件,使用$refs

事件API被移除

on,off,

🔥🔥Filter被移除!淦

不能再用|使用filter。Sad。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 全栈修炼 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🔥🔥建立项目
    • 1. 使用 vite-app
      • 2. 使用vue-cli
      • 🔥🔥v-model新语法糖
      • 🔥🔥全局API
        • 1. 不再使用new Vue
          • 问题
          • 解决
        • 2. 不再用Vue.prototype
          • 3. 全局方法现在在app实例上
            • 4. 现在需要手动挂载根元素
              • 5. Tree-shaking
              • 🔥异步组件需要显示定义
              • 🔥$attrs 将包含class和style
                • $listeners被移除
                • 🔥指令
                • 新特性fragments
                • template允许设置key
                • scopedSlots正式弃用
                • 监听数组变化需要用deep属性啦
                • $children 被移除
                • 事件API被移除
                • 🔥🔥Filter被移除!淦
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档