vue2 怎么用vite_Vue2和Vue3开发组件有什么区别

d03dddfab2f6679cc7a30d86781fac1c.png

我们一直都有关注和阅读很多关于Vue3的新特性和功能即将到来。但是我们没有一个具体的概念在开发中会有如何的改变和不一样的体验。还有一些童鞋已经开始又慌又抓狂了 -- “又要开始学新的写法了 (ノToT )ノ ~┻┻”。

所以这里我使用Vue2和Vue3开发一个简单的表格组件来展示一下Vue2和Vue3开发组件的区别。看完这篇文章后,你将会有一个概念Vue2和Vue3开发组件时的区别,并且为Vue3的开发之路做好准备。ღ(◔ڼ◔ღ)ミ

废话少说,让我们开始吧~  (๑ •̀ㅂ•́)و✧

@


创建一个 template

组件来说,大多代码在Vue2和Vue3都非常相似。Vue3支持碎片(Fragments),就是说在组件可以拥有多个根节点。

这种新特性可以减少很多组件之间的div包裹元素。在开发vue的时候,我们会发现每一个组件都会有个div元素包裹着。就会出现很多层多余的div元素。碎片(Fragments)解决了这个问题。对于有完美强迫症的童鞋“真的是太棒了”。我们这里的例子里就不展示了,用简单的单根节点的组件。

Vue2 表格template

<template>
<div class='form-element'>
<h2> {{ title }} h2>
<input type='text' v-model='username' placeholder='Username' />

<input type='password' v-model='password' placeholder='Password' />

<button @click='login'>
Submit
button>
<p>
Values: {{ username + ' ' + password }}
p>
div>
template>

在Vue3的唯一真正的不同在于数据获取。Vue3中的反应数据(Reactive Data)是包含在一个反应状态(Reactive State)变量中。— 所以我们需要访问这个反应状态来获取数据值。

<template>
<div class='form-element'>
<h2> {{ state.title }} h2>
<inputtype='text'v-model='state.username'placeholder='Username'
/>

<inputtype='password'v-model='state.password'placeholder='Password'
/>

<button @click='login'>
Submit
button>
<p>
Values: {{ state.username + ' ' + state.password }}
p>
div>
template>

建立数据 data

这里就是Vue2与Vue3 最大的区别 — Vue2使用选项类型API(Options API)对比Vue3合成型API(Composition API)

旧的选项型API在代码里分割了不同的属性(properties):data,computed属性,methods,等等。新的合成型API能让我们用方法(function)来分割,相比于旧的API使用属性来分组,这样代码会更加简便和整洁。

现在我们来对比一下Vue2写法和Vue3写法在代码里面的区别。

Vue2 - 这里把两个数据放入data属性中

export default {
props: {
title: String
},
data () {
return {
username: '',
password: ''
}
}
}

Vue3.0,我们就需要使用一个新的setup()方法,此方法在组件初始化构造的时候触发。

为了可以让开发者对反应型数据有更多的控制,我们可以直接使用到 Vue3 的反应API(reactivity API)

使用以下三步来建立反应性数据:

  1. 从vue引入reactive
  2. 使用reactive()方法来声明我们的数据为反应性数据
  3. 使用setup()方法来返回我们的反应性数据,从而我们的template可以获取这些反应性数据

上一波代码,让大家更容易理解是怎么实现的。

import { reactive } from 'vue'

export default {
props: {
title: String
},
setup () {
const state = reactive({
username: '',
password: ''
})

return { state }
}
}

这里构造的反应性数据就可以被template使用,可以通过state.usernamestate.password获得数据的值。


Vue2 对比 Vue3的 methods 编写

Vue2 的选项型API是把methods分割到独立的属性区域的。我们可以直接在这个属性里面添加方法来处理各种前端逻辑。

export default {
props: {
title: String
},
data () {
return {
username: '',
password: ''
}
},
methods: {
login () {
// 登陆方法
}
}
}

Vue3 的合成型API里面的setup()方法也是可以用来操控methods的。创建声明方法其实和声明数据状态是一样的。— 我们需要先声明一个方法然后在setup()方法中返回(return), 这样我们的组件内就可以调用这个方法了。

export default {
props: {
title: String
},
setup () {
const state = reactive({
username: '',
password: ''
})

const login = () => {
// 登陆方法
}
return {
login,
state
}
}
}

生命周期钩子 — Lifecyle Hooks

Vue2,我们可以直接在组件属性中调用Vue的生命周期的钩子。以下使用一个组件已挂载(mounted)生命周期触发钩子。

export default {
props: {
title: String
},
data () {
return {
username: '',
password: ''
}
},
mounted () {
console.log('组件已挂载')
},
methods: {
login () {
// login method
}
}
}

现在 Vue3 的合成型API里面的setup()方法可以包含了基本所有东西。生命周期的钩子就是其中之一!

但是在 Vue3 生周期钩子不是全局可调用的了,需要另外从vue中引入。和刚刚引入reactive一样,生命周期的挂载钩子叫onMounted

引入后我们就可以在setup()方法里面使用onMounted挂载的钩子了。

import { reactive, onMounted } from 'vue'

export default {
props: {
title: String
},
setup () {
// ..

onMounted(() => {
console.log('组件已挂载')
})

// ...
}
}

计算属性 - Computed Properties

我们一起试试添加一个计算属性来转换username成小写字母。

Vue2 中实现,我们只需要在组件内的选项属性中添加即可

export default {
// ..
computed: {
lowerCaseUsername () {
return this.username.toLowerCase()
}
}
}

Vue3 的设计模式给予开发者们按需引入需要使用的依赖包。这样一来就不需要多余的引用导致性能或者打包后太大的问题。Vue2就是有这个一直存在的问题。

所以在 Vue3 使用计算属性,我们先需要在组件内引入computed

使用方式就和反应性数据(reactive data)一样,在state中加入一个计算属性:

import { reactive, onMounted, computed } from 'vue'

export default {
props: {
title: String
},
setup () {
const state = reactive({
username: '',
password: '',
lowerCaseUsername: computed(() => state.username.toLowerCase())
})

// ...
}

接收 Props

接收组件props参数传递这一块为我们带来了Vue2和Vue3之间最大的区别。this在vue3中与vue2代表着完全不一样的东西。

Vue2this代表的是当前组件,不是某一个特定的属性。所以我们可以直接使用this访问prop属性值。就比如下面的例子在挂载完成后打印出当前传入组件的参数title

mounted () {
console.log('title: ' + this.title)
}

但是在 Vue3 中,this无法直接拿到props属性,emit events(触发事件)和组件内的其他属性。不过全新的setup()方法可以接收两个参数:

  1. props - 不可变的组件参数
  2. context - Vue3 暴露出来的属性(emit,slots,attrs)

所以在 Vue3 接收与使用props就会变成这样:

setup (props) {
// ...

onMounted(() => {
console.log('title: ' + props.title)
})

// ...
}

事件 - Emitting Events

Vue2 中自定义事件是非常直接的,但是在 Vue3 的话,我们会有更多的控制的自由度。

举例,现在我们想在点击提交按钮时触发一个login的事件。

Vue2 中我们会调用到this.$emit然后传入事件名和参数对象。

login () {
this.$emit('login', {
username: this.username,
password: this.password
})
}

但是在 Vue3中,我们刚刚说过this已经不是和vue2代表着这个组件了,所以我们需要不一样的自定义事件的方式。

那怎么办呀?! ლಠ益ಠ)ლ

不用慌,在setup()中的第二个参数content对象中就有emit,这个是和this.$emit是一样的。那么我们只要在setup()接收第二个参数中使用分解对象法取出emit就可以在setup方法中随意使用了。

然后我们在login方法中编写登陆事件:

setup (props, { emit }) {
// ...

const login = () => {
emit('login', {
username: state.username,
password: state.password
})
}

// ...
}

最终的vue2对比vue3代码

4fa47203b8c5344935ebcd9791620914.png

真的是太棒了,能看到这里的童鞋们,你们现在基本都看到vue2与vue3其实概念与理念都是一样的。只是有一些属性获取方式和声明和定义方式稍微变了。一直在鬼哭狼嚎的小小前端开发猿人们,你们可以松一口气了吧。

总结一下,我觉得 Vue3 给我们前端开发者带来了全新的开发体验,更好的使用弹性,可控度也得到了大大的提升。如果你是一个学过或者接触过 React 然后现在想使用Vue的话,应该特别兴奋,因为很多使用方式都和React非常相近了 ?!

全新的合成式API(Composition API)可以提升代码的解耦程度 —— 特别是大型的前端应用,效果会更加明显。还有就是按需引用的有了更细微的可控性,让项目的性能和打包大小有更好的控制。

最后我把完成的 Vue2Vue3 的组件代码发出来给大家:

Vue2

<div class='form-element'><h2> {{ title }} h2><input type='text' v-model='username' placeholder='Username' /><input type='password' v-model='password' placeholder='Password' /><button @click='login'>
Submitbutton><p>
Values: {{ username + ' ' + password }}p>div>template><script>export default {props: {title: String
},
data () {return {username: '',password: ''
}
},
mounted () {console.log('title: ' + this.title)
},computed: {
lowerCaseUsername () {return this.username.toLowerCase()
}
},methods: {
login () {this.$emit('login', {username: this.username,password: this.password
})
}
}
}script>

Vue3

<div class='form-element'><h2> {{ state.title }} h2><input type='text' v-model='state.username' placeholder='Username' /><input type='password' v-model='state.password' placeholder='Password' /><button @click='login'>
Submitbutton><p>
Values: {{ state.username + ' ' + state.password }}p>div>template><script>import { reactive, onMounted, computed } from 'vue'export default {props: {title: String
},
setup (props, { emit }) {const state = reactive({username: '',password: '',lowerCaseUsername: computed(() => state.username.toLowerCase())
})
onMounted(() => {console.log('title: ' + props.title)
})const login = () => {
emit('login', {username: state.username,password: state.password
})
}return {
login,
state
}
}
}script>

希望这篇文章能让大家体验到一个比较全面的Vue2与Vue3的开发区别。如果大家还有什么问题,可以在评论中提问哦!

开发愉快!~

近期Vue3开源组件库,今天“它们”来了

Vue 数据更新但页面没有更新的 7 种情况,你遇到过几种

237c3426305b06f67861a46b20eb7787.png若此文有用,何不素质三连❤️

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

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

相关文章

C语言中实现边沿函数算法及应用,这是抛弃PLC留下的痛!

很多从事PLC编程的朋友都知道&#xff0c;不管是什么品牌的PLC&#xff0c;都有上升沿和下降沿指令。❤那么什么情况下我们才会使用或必须使用边沿信号呢&#xff1f;边沿信号我们又如何获取呢&#xff1f;如图1&#xff0c;任何一个开关信号&#xff08;或数字信号&#xff09…

服务器系统装驱动精灵,云服务器安装驱动精灵

云服务器安装驱动精灵 内容精选换一换您可以选择在云服务器上安装一个或多个应用。如需在云服务器上安装其他应用&#xff0c;请参考如下操作进行添加。暂时仅允许支持VR应用的云服务器安装VR应用。暂时仅允许支持3D应用的云服务器安装3D应用。暂时仅允许支持VR应用的云服务器有…

注入器 过检测_连云港管道检测服务

连云港管道检测服务 管道稀释淤泥施工时应采用专业高压水车将两个检查井注入室内灌水&#xff0c;并使用挖泥机将检查井中的污泥与排污管混合&#xff0c;以稀释污泥为目的. 如果是手工作业应与机械作业配合以不断搅拌污泥&#xff0c;直到将其稀释到水中为止.管道吸污。 公司备…

lock.lock_HibernateCascadeType.LOCK陷阱

lock.lock介绍 引入了Hibernate 显式锁定支持以及Cascade Types之后 &#xff0c;就该分析CascadeType.LOCK行为了。 Hibernate锁定请求触发内部LockEvent 。 关联的DefaultLockEventListener可以将锁定请求级联到锁定实体子级。 由于CascadeType.ALL也包括CascadeType.LOCK …

浅谈面向对象思想下的 C 语言

如何使用OO思维方式面向对象(object Oriented&#xff0c;简称&#xff1a;OO)在于用“找对象”的方式去规划和描述问题。一、怎样“找对象” &#xff08;思维过程&#xff09;“对象”是具有共性的一个群体。以 L298N 控制马达的官方推荐方法为例&#xff0c;控制的共性在于&…

我的世界服务器里怎么无限随机传送,我的世界随机传送插件使用教程 权限指令分享...

导读&#xff1a;在我的世界中玩家可以利用随机传送插件来进行传送人物质与设定点&#xff0c;那么随意传送插件该如何使用呢、下面小编我就来教教各位&#xff0c;我的世界随意传送插件使用教程。什么是RandomLocationRandomLocation让你传送到预设区域的随机位置。可以通过命…

热敏电阻温度特性曲线_NTC热敏电阻如何选型

什么是NTCNTC 热敏电阻是负温度系数的电阻&#xff0c;其特性是电阻值随着温度的升高而呈下降趋势。这个与PTC或者PT100等正温度系数的热敏电阻相反。NTC 热敏电阻NTC的阻值-温度对应曲线如下图所示(100K为例&#xff0c;B值3950)。NTC 热敏电阻R-T曲线下面介绍选型原则。2.根据…

如何使用C语言的面向对象?

我们都知道&#xff0c;C 才是面向对象的语言&#xff0c;但是C语言是否能使用面向对象的功能?(1)继承性typedef struct _parent{int data_parent;}Parent;typedef struct _Child{struct _parent parent;int data_child;}Child;在设计C语言继承性的时候&#xff0c;我们需要做…

t3软件怎么生成报表_临沂用友畅捷通T3财务通软件财税一体化

用友T3财税通针对财税一体化的发展趋势&#xff0c;在用友通上海财税专版的基础上&#xff0c;经过完善和提高。同时加入了税务核算功能、所得税汇算功能。 财税通财务软件的财税同步处理&#xff0c;可将事后税务处理的汇总涉税数据工作化整为零&#xff0c;分解到日常凭证填制…

每日干货丨C语言知识总结----循环结构

介绍循环结构可以看成是一个条件判断语句和一个向回 转向语句 的组合。另外&#xff0c;循环结构的三个要素&#xff1a;循环变量、 循环体 和循环终止条件. &#xff0c;循环结构在 程序框图 中是利用判断框来表示&#xff0c;判断框内写上条件&#xff0c;两个出口分别对应着…

apache hadoop_使用Apache Hadoop计算PageRanks

apache hadoop目前&#xff0c;我正在接受Coursera的培训“ 挖掘海量数据集 ”。 我对MapReduce和Apache Hadoop感兴趣已有一段时间了&#xff0c;通过本课程&#xff0c;我希望对何时以及如何MapReduce可以帮助解决一些现实世界中的业务问题有更多的了解&#xff08;我在这里介…

730阵列卡支持多大硬盘_凯捷月销破2万,配6座头等舱空间,到底有多舒服?试驾了才知道...

能够在还未上市的前一个月&#xff0c;就以预售的方式卖出超过2万台&#xff0c;上汽通用五菱在乘用车市场之中的号召力可见一斑。过去我们都将五菱视为商务领域的铭牌&#xff0c;包括宏光、荣光、之光等等家族&#xff0c;都在各自细分市场占据着最顶端位置。如今&#xff0c…

C语言循环嵌套

在C语言中&#xff0c;if-else、while、do-while、for 都可以相互嵌套。所谓嵌套&#xff08;Nest&#xff09;&#xff0c;就是一条语句里面还有另一条语句&#xff0c;例如 for 里面还有 for&#xff0c;while 里面还有 while&#xff0c;或者 for 里面有 while&#xff0c;w…

rem 前端字体_web前端入门到实战:一次搞懂CSS字体单位:px、em、rem和%

对于绘图和印刷而言&#xff0c;“单位”相当重要&#xff0c;然而在网页排版里&#xff0c;单位也是同样具有重要性&#xff0c;在CSS3普及以来&#xff0c;更支持了一些方便好用的单位&#xff08;px、em、rem…等&#xff09;&#xff0c;这篇文章将整理这些常用的CSS单位&a…

jvmti_JVMTI标记如何影响GC暂停

jvmti这篇文章分析了为什么Plumbr Agents在某些情况下以及如何延长GC暂停的时间。 对基本问题进行故障诊断揭示了有关在GC暂停期间如何处理JVMTI标记的有趣见解。 发现问题 我们的一位客户抱怨说&#xff0c;附加了Plumbr代理后&#xff0c;应用程序的响应速度明显降低。 通过…

C语言-使用goto语句从循环中跳出

实例代码// //实现功能&#xff1a;使用goto语句从循环中跳出 //#include "stdio.h"#define EXIT 0void show_Menu(){printf("菜单选项:\t");printf("1&#xff1a;显示\t");printf("2&#xff1a;添加\t");printf("3&#xff1a…

装饰器模式java_Java 8的装饰器模式

装饰器模式java在最近的一篇文章中&#xff0c;我描述了装饰器模式如何挽救了我的一天。 我给出了一个小代码段&#xff0c;其中包含创建装饰器的最简单方法&#xff0c;但承诺Java 8会有更好的方法。 这里是&#xff1a; 用Java 8装饰 HyperlinkListener listener this::ch…

C语言-反转字符串

实例代码// //实现功能&#xff1a;输入一个字符串&#xff0c;然后将该字符串反向输出 //#include "stdio.h" #include "string.h"#define N 50void convert_str(char str[N]);void convert_str(char str[N]){int j;char temp;for (int i 0; i < strl…

信捷步进指令的使用_步进电机驱动器的模式

步进电动机和步进电动机驱动器构成步进电机驱动系统。步进电动机驱动系统的性能&#xff0c;不但取决于步进电动机自身的性能&#xff0c;也取决于步进电动机驱动器的优劣。对步进电动机驱动器的研究几乎是与步进电动机的研究同步进行的。步进电机驱动器有三种基本的步进电机驱…

C语言灵魂篇|指针作为函数返回值

C语言允许函数的返回值是一个指针&#xff08;地址&#xff09;&#xff0c;我们将这样的函数称为指针函数。下面的例子定义了一个函数 strlong()&#xff0c;用来返回两个字符串中较长的一个&#xff1a;#include #includechar *strlong(char *str1, char *str2){ if(strlen(s…