「荐读」Vue3 有这些不向下兼容的改变

news/2024/7/10 3:05:52 标签: vue, js, css, html, javascript
htmledit_views">
html" title=js>js_content">

作者:格砸

链接:https://padaker.com/blog/post/5fc73352cb81362ed96f2fb9

作为技术人员,随时保持技术同步是很重要的事情。虽然Vue3已经发布很长时间了,现在开始保持更新也还不晚。新项目可以拿来练练手XD,老项目就不建议升级了。本篇文章整理自官方文档-BreakingChanges部分

????????建立项目

1. 使用 vite-app

npm init vite-app <project-name>

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

2. 使用html" title=vue>vue-cli

npm install -g @html" title=vue>vue/cli # OR yarn global add @html" title=vue>vue/cli
html" title=vue>vue create <project-name>

????????v-model新语法糖

默认使用modelValue传递值。

<ChildComponent v-model="pageTitle" />
<!-- would be shorthand for: -->
<ChildComponent
  :modelValue="pageTitle"
  @update:modelValue="pageTitle = $event"
/>

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

<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

// before - Vue 2
Vue.prototype.$http = () => {}

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

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

html" title=vue>vue2.xhtml" title=vue>vue3
Vue.componentapp.component
Vue.directiveapp.directive
Vue.mixinapp.mixin
Vue.useapp.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.

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

import { nextTick } from  html" title=vue>vue 
nextTick(() => {
  // something DOM-related
})

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

????异步组件需要显示定义

import { defineAsyncComponent } from  html" title=vue>vue 
const asyncPage = defineAsyncComponent(() => import( ./NextPage.html" title=vue>vue ))

????$attrs 将包含class和style

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

$listeners被移除

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

现在属性透传更方便了!

????指令

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

html" title=vue>vue2.xhtml" title=vue>vue3
bindbeforeMount
insertedmounted
-beforeUpdate (新)
update (移除)-
componentUpdatedupdated
-beforeUnmount (新)
unbindunmounted

新特性fragments

允许组件有多个根元素!

template允许设置key

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

scopedSlots正式弃用

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

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

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

$children 被移除

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

事件API被移除

$on,$off,$once不再使用。2.x的EventBus方法不能再使用。

????????Filter被移除!淦

不能再用|使用filter。Sad。

参考

  • 本篇文章整理自官方文档:https://v3.html" title=vue>vuehtml" title=js>js.org/guide/migration/introduction.html


http://www.niftyadmin.cn/n/1251783.html

相关文章

vue-resource调用promise取数据方式整理

用了好久的vue-resource&#xff0c;好像每一次使用的时候&#xff0c;都要去看一下上一次是怎么写的&#xff0c;具体的语法过不了多久又忘记了&#xff0c;甚至不知道其中的原理&#xff0c;只知道一些简单的使用&#xff0c;一会儿用ES6的语法&#xff0c;一会儿又用传统的语…

最火的 Vue 前端框架,你用对了么?

无论是 BAT 等大厂&#xff0c;还是小型初创公司&#xff0c;Vue 都有着广泛的应用&#xff0c;而 Vue 在前端开发中的火爆程度&#xff0c;毋庸置疑远超 React 和 Angular &#xff0c;其相关技术原理也是面试的必考知识点。因为基于 HTML 的模板语法&#xff0c;响应式的更新…

mysql中分层查询_在mysql中连接任意数量的字符串行(分层查询)

完全没有经过测试&#xff0c;打出了我的头顶...DECLARE FOLDER VARCHAR(200)DECLARE TOPID AS INTDECLARE MYID As intCREATE TABLE #tmp([id] INT,[path] VARCHAR(50))DECLARE tempCursor CURSOR FOR SELECT id FROM albums ORDER BY idOPEN tempCursorFETCH NEXT FROM tempC…

自学js第十二天:DOM概念和基础操作

Web API 总结1&#xff1a; dom文档树的作用,就是把网页全部内容转为一个个js节点对象去操作 , 因此dom的文档树的内部组成就是有许多叶子node节点对象.分别有七种类型的叶子包含网页全部内容都有对应的node节点类型对象 , 又因为DOM下的 这些node所有对象都 实现implements 了…

java蓝牙开发_Android蓝牙开发全面总结

基本概念安卓平台提供对蓝牙的通讯栈的支持&#xff0c;允许设别和其他的设备进行无线传输数据。应用程序层通过安卓API来调用蓝牙的相关功能&#xff0c;这些API使程序无线连接到蓝牙设备&#xff0c;并拥有P2P或者多端无线连接的特性。蓝牙的功能&#xff1a;1、扫描其他蓝牙…

java mongodb $in_MongoDB Java:使用QueryBuilder $in运算符在Mongo中查找对象不返回任何内容...

我有一个名为MongoRule的JUnit规则public class MongoRule extends ExternalResource {private static final Logger LOGGER LoggerFactory.getLogger(MongoRule.class);private final MongoService mongoService;public MongoRule() throws UnknownHostException {mongoServi…

自学js第十三天:JS的基础事件

;王道阮一峰写的DOM的事件: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qi3mw41o-1620307183602)(C:\Users\tuyue\AppData\Local\Temp\1617207708116.png)] EventTarget 接口 事件的本质是程序各个组成部分之间的一种’通信’方式&#xff0c;也…

java 坐标数组_怎么把坐标值保存到一维数组里

题目不是很完整。我理解是比如说把n个(二维)坐标值&#xff0c;保存到长为n的一维数组里&#xff0c;数组里每个元素对应一个坐标&#xff1f;取巧的方法&#xff0c;因为你没说一维数组是什么类型的&#xff0c;比如你定义一个Coordinate类&#xff0c;里面存储坐标值&#xf…