卷死了!再不学vue3就没有人要你了!速来围观vue3新特性

速来围观vue3新特性

一文全面了解vue3新特性

  • 一、😶vue3比vue2有什么优势?
  • 二、🧐Vue3升级了哪些重要的功能
    • 1、createApp
    • 2、emits(父子组件间的通信)
      • (1)通信方式
      • (2)举个例子🌰
    • 3、多事件处理
    • 4、Fragment
    • 5、移除.sync
      • (1)vue2
      • (2)vue3
    • 6、异步组件
    • 7、移除filter
    • 8、Teleport
    • 9、Suspense
  • 三、😜Options API 和 Composition API
    • 1、生命周期对比
    • 2、Composition API 和 Options API 对比
      • (1)Composition API带来了什么?
      • (2)Composition API和Options API如何选择?
      • (3)别误解Composition API
  • 四、🙃结束语

紧跟新技术的步伐,周一也开始学起了 vue3 。去年11月份的时候对 vue3 其实已经有所耳闻,但当时对 vue3 完全没有想学习的欲望。当时就觉得,够用就行,新技术那么多哪里学得动。然而现在……悔不当初😭,时代在推你进步,你却停滞不前,只会被时代淘汰。迫于内卷压力,再不学 vue3 真的感觉在跟时代划一道鸿沟。

所以,今年赶忙把 vue3 提上日程。原本 vue3 的学习计划是在三月份,但因为各种事情耽搁了到了现阶段才进行。

求求别再卷了……我学❗❗我学❗❗

在今天的这篇文章中,将带领大家全面了解 vue3 的新特性,vue3vue2 的一些区别, Composition APIOptions API 的区别。

下面开始进行本文的讲解🤪

一、😶vue3比vue2有什么优势?

vue3比vue2来说,性能上更好代码体积更小,并且有更好的ts支持

同时,更为突出的特点是,vue3有更好的代码组织能力,有更好的逻辑抽离能力,并且还有更多各式各样的新功能

其中尤为突出的就是大家平常耳熟能详的 Composition APIOptions API

那是不是 vue3 就一定比 vue2 好呢?或者是 Composition API 就一定比 Options API 好呢?

其实大家心里可能在此打下了一个问号⁉️

那接下来就带着这个问号,一起来了解 vue3 的新特性吧!

二、🧐Vue3升级了哪些重要的功能

1、createApp

vue2 不同的是, vue2 使用 new 的方式来初始化一个实例,而 vue3 则用 Vue.createApp初始化一个实例如下所示:

//vue2.x 实例化方式
const app = new Vue({ /*选项*/ })
//vue2.x 使用方式
Vue.use(/*...*/)
Vue.mixin(/*...*/)
Vue.component(/*...*/)
Vue.directive(/*...*/)//vue3 实例化方式
const app = Vue.createApp({ /*选项*/ })
//vue3 使用方式
app.use(/*...*/)
app.mixin(/*...*/)
app.component(/*...*/)
app.directive(/*...*/)

2、emits(父子组件间的通信)

(1)通信方式

传递形式通信方式
emits子组件向父组件传递数据
props父组件的数据需要通过props把数据传给子组件,props的取值可以是数组也可以是对象

(2)举个例子🌰

vue2的时候,我们可以用 $emitprops 来进行父子组件间的通信。而现在, vue3 使用 emitsprops 来实现父子组件间的通信

我们定义一个父组件, 名字叫 App.vue具体代码如下:

<template><HelloWorld msg="Hello Vue 3.0 + Vite" @onSayHello="sayHello"/>
</template><script>
import HelloWorld from './components/HelloWorld.vue'export default {name: 'App',components: {HelloWorld,},data() {return {msg: 'hello vue3'} },methods: {sayHello(info) {console.log('hello', info)}}
}
</script>

再定义一个子组件,名字叫 HelloWorld.vue具体代码如下:

<template><h1>{{ msg }}</h1>
</template><script>
export default {name: 'HelloWorld',props: {msg: String},data() {return {}},emits: ['onSayHello'],setup(props, { emit }) {emit('onSayHello', 'vue3')}
}
</script>

此时浏览器的显示效果如下:

emits

vue3 中,可以直接将 emit 参数传入 setup 生命周期里面,来达到父子组件的通信

3、多事件处理

vue2 时,每一个点击只能定义一个事件;而在 vue3 时,打破原有的规则,每一个 @click 可以点击多个事件如下代码所示:

<!-- 在 methods 里定义 one two 两个函数 -->
<button @click="one($event), two($event)">submit
</button>

4、Fragment

fragment ,中文翻译过来就是碎片的意思。

vue2.x 时,是不允许有碎片存在的。所以我们每次在写程序时,最外层总要再给它包个 div 。但这个时候就会感觉特别麻烦,因为有时候想这个 divclass 名还得思考给命个什么名字好,感觉心里都已经没墨水了。

因此,在 vue3 时,就除去了这个规范,可以不用最外层再包个 div如下代码所示:

<!-- vue2.x 组件模板 -->
<template><div class="detail"><h3>{{ title }}</h3><div v-html="content"></div></div>
</template>
<!-- vue3 组件模板 -->
<template><h3>{{title}}</h3><div v-html="content"></div>
</template>

5、移除.sync

(1)vue2

vue2 时,我们会通过 v-bind:title.sync 来进行数据双向绑定具体代码如下:

<!-- vue2.x -->
<MyComponent v-bind:title.sync="title"></MyComponent>

(2)vue3

而在 vue3 时,直接放弃掉 .sync 而使用 v-model 的形式来对数据进行绑定。具体代码对下:

<!-- vue3.x -->
<MyComponent v-model:title="title"></MyComponent>

我们再用一个例子🌰来展示 vue3 是怎么对数据进行双向绑定的。具体代码如下:

我们先定义一个子组件,名字叫 UserInfo.vue具体代码如下:

<template><input :value="name" @input="$emit('update:name', $event.target.value)"/><input :value="age" @input="$emit('update:age', $event.target.value)"/>
</template><script>
export default {name: 'UserInfo',props: {name: String,age: String}
}
</script>

再来定义一个父组件,名字叫 index.vue具体代码如下:

<template><p>{{name}} {{age}}</p><user-infov-model:name="name"v-model:age="age"></user-info>
</template><script>
import { reactive, toRefs } from 'vue'
import UserInfo from './UserInfo.vue'export default {name: 'VModel',components: { UserInfo },setup() {const state = reactive({name: 'monday',age: '18'})return toRefs(state)}
}
</script>

此时浏览器的显示效果如下:
v-model
此时,我们可以得出结论:子组件通过控制 :value@input 来控制input的值,同时父组件通过 v-model:propertyName 来绑定子组件的值,这样一来,两者就实现了双向数据绑定

6、异步组件

vue2 时,引入异步组件的方法比较简单,直接使用import即可。代码如下:

new Vue({//…components:{'my-component': () => import('./my-async-component.vue')}
})

而在 vue3 时,引入异步组件需要使用 defineAsyncComponent 方法来进行引入。代码如下:

import { createApp, defineAsyncComponent } from 'vue'new Vue({//…components:{AsyncComponent: defineAsyncComponent(() =>import('./components/AsyncComponent.vue'))}
})

7、移除filter

vue2 时,有 filter 这个功能,但其实这个功能的使用频率还挺低的。所以,在 vue3 中,彻底去除了 filter 这个功能,不再可用。

<!-- 以下filter在vue3中不再可用!! -->
<!-- 在双花括号中 -->
{{ message | capitalize }}<!-- 在v-bind中使用 -->
<div v-bind:id="rawId | formatId"></div>

8、Teleport

Teleport ,中文翻译过来就是远距离传送。在 vue2 中,比如我们要定义点击某个按钮,去跳转一个模态框,这个时候一般需要去操作 DOM 元素,或者再定义一个新的组件。但是在 vue3 ,我们可以用 teleport 来解决。我们可以使用 teleport 来直接定义在当前组件中,之后通过v-if等方式来控制其显示与否。演示代码如下:

<!-- data 中设置modalOpen: false -->
<button @click="modalOpen = true">Open full scree modal!(With teleport!)
</button><teleport to="body"><div v-if="modalOpen" class="modal"><div>telePort 弹窗(父元素是body)<button @click="modalOpen = false">Colse</button></div></div>
</teleport>

9、Suspense

Suspense,是对vue2.x中的插槽做一个封装,这里不进行一一讲解。下面给出代码演示:

<Suspense><template><Test1/> <!--  是一个异步组件 --></template><!-- #fallback就是一个具名插槽。即Suspense组件内部,有两个slot,其中一个具名为 fallback --><template #fallback>Loading...</template>
</Suspense>

三、😜Options API 和 Composition API

1、生命周期对比

以下给出 Vue2Vue3 生命周期的对比。

Vue2生命周期(Options API)Vue3生命周期(Composition API)含义
beforeCreatesetup在实例初始化之后,数据观测(data observer) 和 event/watcher 事件配置之前被调用
createdsetup页面还没有渲染,但是vue的实例已经初始化结束。
beforeMountonBeforeMount在挂载开始之前被调用:相关的 render 函数首次被调用。
mountedonMounted页面已经渲染完毕。
beforeUpdateonBeforeUpdate数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。你可以在这个钩子中进一步地更改状态,这不会触发附加的重渲染过程。
updatedonUpdated由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。
beforeDestoryonBeforeUnmount实例销毁之前调用。在这一步,实例仍然完全可用。
destroyonUnmountedVue 实例销毁后调用。

2、Composition API 和 Options API 对比

(1)Composition API带来了什么?

Composition API 相较于 Options API 来说,拥有更好的代码组织能力,更好的逻辑复用能力,以及更好的类型推导。

这里引用大帅老师的几张动图来对 Composition APIOptions API 做一个对比。原文搓👉做了一夜动画,就为让大家更好的理解Vue3的Composition Api,再悄悄告诉各位小伙伴,大帅老师的文章融入大量的动画,通俗易懂,路过的小伙伴赶紧关注一波哦,学习路上不迷路🚦

废话不多说,赶紧来 Options APIComposition API 的区别。

Options API:

options API
options API

Composition API:

composition API
composition API

从上图中可以看到,对于 Options API 来说,它的逻辑是散落在各处的,懒懒散散的。假设我们现在有一个功能要实现,而这个功能的逻辑代码有2000-3000行,试想一下,如果我们用 Options API 来实现的话,假设这个功能在 methods 里面有定义了一个方法,然后呢又要滑动一两千行mounted 里面看挂载的内容,这真的是出奇的浪费时间呐!所以, vue3 提出了 composition API ,就来解决这个问题了。

composition API 把代码的逻辑抽离出来封装,并把封装的内容直接引用到生命周期里面,这样使用起来真的方便太多了。

我们举个简单的例子来看看 composition API 的使用方式。如下代码所示:

抽离某个逻辑放在同一个函数上:

function sum(){let a = ref(10);let b = computed(() => {return a.value * 2})const handleSum = () => {a.value = a.value + b}return {a,b,handleSum}
}

将sum函数逻辑放在组件中使用:

export default defineComponent({setup(){const { a, b, handleSum } = sum();return {a,b,handleSum}}
})

综上可以得出,对于一个项目来说,尤其是代码量越多,逻辑越复杂的, Composition API 的优势会更加明显。那对于一个项目来说,我们应该在这两者中如何抉择而选择更好的方案呢? 接着我们继续往下看。

(2)Composition API和Options API如何选择?

通过上面的分析我们可以知道, Composition API 虽然好用,但也不能乱用。因此,对于 Composition APIOptions API 的使用,主要有以下几点建议:

  • 两者不建议共用,不然很容易引起混乱;
  • 对于小型项目、或者业务逻辑比较简单的项目,建议使用 Options API
  • 对于中大型项目、或者逻辑比较复杂的项目,建议使用 Composition API ,相较于 Options API 来说, Composition API 对大型项目更好一些,逻辑的抽离,代码的复用,使得大型项目得以更好的维护。

(3)别误解Composition API

很多小伙伴在没学 vue3 之前,就依稀有听到 Composition API 的声音,这个时候就会使得很多人觉得,要想学会 Vue3 ,就得先学会 Composition API

其实……不是这样的。

Composition API 属于高阶技巧并不是学基础时必须要会的内容

正如上面所演示的内容, Composition API 的出现是为了解决复杂业务逻辑而设计,而不是为了学基础而设计的。

所以说,对于小白学 vue3 时,需要先学会 vue3 的基础,再来学 Composition API ,这样的学习路线更为合理。

四、🙃结束语

vue3 确实解决了 vue2 的很多问题,上文所描述的也只是冰山一角。但并没有说 vue3 出了就是 vue3 最好, vue2 不用了。因为 vue3 确实解决了一些问题,但同时也带来了一些问题,所以说,两者更多的是一个相辅相成的结果。

关于vue3的超入门知识就讲到这里啦!希望对大家有帮助~

  • 关注公众号 星期一研究室 ,第一时间关注学习干货,更多有趣的专栏待你解锁~
  • 如果这篇文章对你有用,记得 一键三连 再走哦!
  • 我们下期见!🥂🥂🥂

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307971.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea报错Class not found (在target中没有生成对应的class文件)

一&#xff1a;问题描述 二:解决 既然他不自动生成&#xff0c;那么我们就手动导入&#xff1b; 点击后应用 然后再次运行我们的测试用例&#xff1b;如果不行 再取消勾选 然后再运行我们的测试用例

敲黑板!vue3重点!一文了解Composition API新特性:ref、toRef、toRefs

一文了解Composition API新特性&#xff1a;ref、toRef、toRefs一、&#x1f64e;如何理解ref、toRef和toRefs1、ref、toRef和toRefs是什么&#xff08;1&#xff09;ref1&#xff09;ref是什么2&#xff09;举个例子&#x1f330;&#xff08;2&#xff09;toRef是什么1&#…

C# 枚举转列表

C# 枚举转列表独立观察员 2020 年 9 月 1 日今天有朋友问我&#xff0c;ComboBox 怎么绑定一个 Enum&#xff0c;其实他的意思是枚举如何转换为列表。想想这确实是一个挺正常的需求&#xff0c;但我一时也只想到遍历&#xff0c;他觉得麻烦&#xff0c;于是我在网上帮忙查了一下…

leetcode242. 有效的字母异位词(两种方法map或数组)

一:题目 二:上码 1:方法一&#xff08;map解法&#xff09; class Solution { public:bool isAnagram(string s, string t) {/**思路:1.分析题意&#xff0c;这个是要判断t中的字符出现次数和s中字符出现的次数相同2.可以用map<char,int>来做*/map<char,int>m1,m…

活久见!月薪30k的小程序全栈开发到底有多难?

10年前&#xff0c;公司的标配是门户网站&#xff0c;造就了一批网站工作室。随着移动互联网大潮兴起&#xff0c;App又成了企业标配&#xff0c;IOS和Android开发赚的盆满钵满。然而App导致的手机内存告急&#xff0c;无止尽的信息推送&#xff0c;让微信小程序应运而生。然而…

卷不动也得继续学!紧跟vue3的步伐,再来get一波进阶新特性!

vue3进阶新特性一、&#x1f4d7;watch和watchEffect1、watch和watchEffect的区别2、举个例子&#xff08;1&#xff09;wtach监听&#xff08;2&#xff09;watchEffect监听二、&#x1f4d8;setup如何获取组件实例&#xff08;1&#xff09;为什么需要获取组件实例&#xff0…

leetcode349. 两个数组的交集(思路+详解)

一:题目 二:上码 class Solution { public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {/**思路:本题我们采用的哈希表数据结构是unordered_set,没有用数组因为我们不确定给出的数组中数值的范围如果 强上会出现空间的大量…

高效掌握新技能的「树型思维」

大家好&#xff0c;我是Z哥。不知道你有没有过这样的困惑&#xff0c;想学习某项新技能&#xff0c;但是很容失败。比如&#xff0c;出于职业发展的考虑&#xff0c;想学习一门新的编程语言&#xff0c;或者想了解一个新的技术框架&#xff1b;又或者看了某些综艺节目后想玩一玩…

vue2的响应式原理学“废”了吗?继续观摩vue3响应式原理Proxy

一文了解Vue3的响应式原理一、&#x1f7e9;回顾Object.defineProperty二、&#x1f7e8;Proxy基本使用三、&#x1f7e6;学习Proxy语法&#xff1a;Reflect四、&#x1f7e7;Vue3如何用Proxy实现响应式1、实现响应式2、Proxy总结&#xff08;1&#xff09;深度监听&#xff0c…

一名“企业定制化人才”的自诉:“我不愿意,但却无可奈何”

这是头哥侃码的第214篇原创几个月前&#xff0c;我曾在大智慧时期的一位同事跟我聊微信&#xff0c;说自己所在的公司这两年业务一直不温不火&#xff0c;而且从19年底就逐渐缩减技术人员。今年上半年又因为疫情的关系&#xff0c;公司干脆直接砍掉了剩余的三个技术部门&#x…

一文了解分而治之和动态规则算法在前端中的应用

一文了解分而治之和动态规则算法一、分而治之1、分而治之是什么&#xff1f;2、应用场景3、场景剖析&#xff1a;归并排序和快速排序二、动态规则1、动态规则是什么&#xff1f;2、应用场景3、场景剖析&#xff1a;斐波那契数列4、动态规则VS分而治之三、分而治之算法常见应用1…

leetcode1. 两数之和(两种方法)

一:题目 二:上码 1:方法一 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> v;for(int i 0; i < nums.size() - 1; i) {for(int j i1; j < nums.size(); j) {if(nums[i] nums[j] target) {v.push_…

排坑 | Exceptionless 5.x 无法正常发送邮件

【问题解决】| 作者 / Edison Zhou这是恰童鞋骚年的第282篇原创内容你有碰到过通过docker部署Exceptionless无法发送邮件的问题吗&#xff1f;此解决办法适用于Exceptionless 5.x版本&#xff08;如果你不想升级6.x的话&#xff09;。1问题起因去年这个时候&#xff0c;得知Exc…

一文了解贪心算法和回溯算法在前端中的应用

一文了解贪心算法和回溯算法在前端中的应用一、贪心算法1、贪心算法是什么&#xff1f;2、应用场景3、场景剖析&#xff1a;零钱兑换二、回溯算法1、回溯算法是什么&#xff1f;2、什么问题适合选用回溯算法解决&#xff1f;2、应用场景3、场景剖析&#xff1a;全排列三、贪心算…

leetcode454. 四数相加 II(思路+详解)

一:题目 二:上码 class Solution { public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {/**思路:1.我们用map容器的key值存进去前两个数的和并记录其个数,然后在后面两个数…

ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用

一文了解集合和字典在前端中的应用一、&#x1f4dd;集合1、集合是什么&#xff1f;2、前端与集合&#xff1a;使用ES6中的Set3、用Set模拟并集、交集和差集&#xff08;1&#xff09;模拟并集运算&#xff08;2&#xff09;模拟交集运算&#xff08;3&#xff09;模拟差集运算…

leetcode383. 赎金信(两种做法)

一&#xff1a;题目 二:上码 1:第一种方法 class Solution { public:bool canConstruct(string ransomNote, string magazine) {unordered_map<char,int>m,m1;for(int j 0; j < magazine.size(); j) {m[magazine[j]];}for(int i 0; i < ransomNote.size(); i) …

使用BeetleX在Linux下部署.NET多站点服务

在windows下常用IIS来部署.NET的多站点服务&#xff0c;但在Linux下就没这么方便了&#xff1b;虽然可以使用一些代理服务器如nginx&#xff0c;jexus等来反代或部署应用&#xff0c;但nginx对.NET应用的托管就相对没这么方便了&#xff0c;jexus的确是个不错的服务应用;在这里…

模块化妙用!用vue3实现一个鼠标追踪器和异步加载组件

用vue3实现一个鼠标追踪器和异步加载组件一、&#x1f5b1;️鼠标追踪器1、功能实现2、给静态页面绑定功能二、⚙️异步加载组件1、功能实现2、给静态页面绑定功能3、用泛型改造异步组件功能三、&#x1f4da;结束语周一最近学完 vue3 新特性&#xff0c;就想着用 vue3 来捣鼓…

leetcode15. 三数之和(三指针)

一:题目 二:思路 1.这里的去重是指的是我们在遍历元素的时候&#xff0c;遇到相同的挨着的相同的元素的时候要跳过 2.对元素进行排序&#xff0c;为了后面的比较 3.我们用的是三个指针&#xff0c;第一个指针i指向第一个元素&#xff0c;第二个指针left指向第二个元素,第三个指…