您的位置:首頁(yè) >熱訊 > 觀察 >

Vue3從入門(mén)到精通(一) 環(huán)球觀天下

Vue3簡(jiǎn)介

Vue3是Vue.js的最新版本,于2020年9月18日正式發(fā)布。Vue3相比Vue2有很多改進(jìn)和優(yōu)化,包括但不限于:


(資料圖)

更快的渲染速度:Vue3通過(guò)使用Proxy代理對(duì)象和優(yōu)化虛擬DOM算法等方式,提高了渲染性能。

更小的體積:Vue3的體積比Vue2更小,打包后的文件更小,加載速度更快。

更好的類(lèi)型支持:Vue3對(duì)TypeScript的支持更加友好,提供了更好的類(lèi)型支持。

更好的組合式API:Vue3提供了更好的組合式API,使得組件的復(fù)用和維護(hù)更加方便。

更好的Tree-shaking支持:Vue3對(duì)Tree-shaking的支持更加完善,可以更好地優(yōu)化打包后的代碼。

總之,Vue3是一個(gè)更加優(yōu)秀的版本,可以幫助開(kāi)發(fā)者更好地構(gòu)建高性能、易維護(hù)的Web應(yīng)用程序。

Vue API風(fēng)格

Vue API風(fēng)格主要有兩種:對(duì)象風(fēng)格和函數(shù)風(fēng)格。

對(duì)象風(fēng)格

對(duì)象風(fēng)格是Vue 2.x版本的API風(fēng)格,它將Vue實(shí)例作為一個(gè)對(duì)象,通過(guò)對(duì)象的屬性和方法來(lái)操作Vue實(shí)例。例如:

var vm = new Vue({  el: "#app",  data: {    message: "Hello Vue!"  },  methods: {    showMessage: function () {      alert(this.message)    }  }})?vm.message = "Hello World!"vm.showMessage()

在上面的代碼中,我們使用對(duì)象風(fēng)格的API來(lái)創(chuàng)建Vue實(shí)例,設(shè)置數(shù)據(jù)和方法,并通過(guò)vm對(duì)象來(lái)操作Vue實(shí)例。

函數(shù)風(fēng)格

函數(shù)風(fēng)格是Vue 3.x版本的API風(fēng)格,它將Vue實(shí)例作為一個(gè)函數(shù),通過(guò)函數(shù)的參數(shù)和返回值來(lái)操作Vue實(shí)例。例如:

import { createApp } from "vue"?const app = createApp({  data() {    return {      message: "Hello Vue!"    }  },  methods: {    showMessage() {      alert(this.message)    }  }})?const vm = app.mount("#app")?vm.message = "Hello World!"vm.showMessage()

在上面的代碼中,我們使用函數(shù)風(fēng)格的API來(lái)創(chuàng)建Vue實(shí)例,設(shè)置數(shù)據(jù)和方法,并通過(guò)app.mount()方法來(lái)掛載Vue實(shí)例,然后通過(guò)vm對(duì)象來(lái)操作Vue實(shí)例。

總的來(lái)說(shuō),函數(shù)風(fēng)格的API更加簡(jiǎn)潔和易于理解,而且更加符合現(xiàn)代JavaScript的編程風(fēng)格。因此,Vue 3.x版本的API采用了函數(shù)風(fēng)格。

Vue3開(kāi)發(fā)前的準(zhǔn)備

在開(kāi)始使用Vue3進(jìn)行開(kāi)發(fā)之前,需要進(jìn)行以下準(zhǔn)備工作:

安裝Node.js和npm

Vue3需要Node.js和npm的支持,因此需要先安裝它們。可以在Node.js官網(wǎng)下載對(duì)應(yīng)版本的安裝包進(jìn)行安裝。

安裝Vue CLI

Vue CLI是Vue.js官方提供的腳手架工具,可以幫助我們快速創(chuàng)建Vue項(xiàng)目。可以使用以下命令全局安裝Vue CLI:

npm install -g @vue/cli

選擇編輯器

選擇一個(gè)適合自己的編輯器進(jìn)行開(kāi)發(fā),推薦使用Visual Studio Code,它有很多Vue相關(guān)的插件和工具。

學(xué)習(xí)Vue基礎(chǔ)知識(shí)

在使用Vue3進(jìn)行開(kāi)發(fā)之前,需要先掌握Vue的基礎(chǔ)知識(shí),包括Vue的核心概念、Vue組件、Vue指令、Vue生命周期等。

學(xué)習(xí)TypeScript

Vue3使用TypeScript進(jìn)行開(kāi)發(fā),因此需要先學(xué)習(xí)TypeScript的基礎(chǔ)知識(shí),包括TypeScript的數(shù)據(jù)類(lèi)型、接口、類(lèi)、泛型等。

總的來(lái)說(shuō),學(xué)習(xí)Vue3需要一定的前置知識(shí),需要掌握Node.js、npm、Vue CLI、編輯器、Vue基礎(chǔ)知識(shí)和TypeScript等知識(shí)點(diǎn)。

vue3 項(xiàng)目目錄結(jié)構(gòu)

Vue3項(xiàng)目的目錄結(jié)構(gòu)與Vue2有些不同,主要是因?yàn)閂ue3使用了新的模塊化系統(tǒng)和TypeScript語(yǔ)言。

以下是一個(gè)Vue3項(xiàng)目的典型目錄結(jié)構(gòu):

├── public│   ├── index.html│   └── favicon.ico├── src│   ├── assets│   ├── components│   ├── router│   ├── store│   ├── utils│   ├── views│   ├── App.vue│   └── main.ts├── tests├── node_modules├── package.json├── tsconfig.json└── README.md

public:存放靜態(tài)資源文件,如HTML文件、圖片、圖標(biāo)等。

src:存放源代碼文件。

assets:存放靜態(tài)資源文件,如CSS、圖片、字體等。

components:存放Vue組件文件。

router:存放Vue Router路由文件。

store:存放Vuex狀態(tài)管理文件。

utils:存放工具函數(shù)文件。

views:存放頁(yè)面組件文件。

App.vue:根組件文件。

main.ts:入口文件,包括Vue實(shí)例的創(chuàng)建和掛載等。

tests:存放測(cè)試文件。

node_modules:存放項(xiàng)目依賴(lài)的第三方庫(kù)。

package.json:存放項(xiàng)目的配置信息和依賴(lài)庫(kù)信息。

tsconfig.json:存放TypeScript編譯器的配置信息。

README.md:項(xiàng)目說(shuō)明文件。

總的來(lái)說(shuō),Vue3項(xiàng)目的目錄結(jié)構(gòu)與Vue2有些不同,但是基本的結(jié)構(gòu)還是相似的,包括靜態(tài)資源文件、源代碼文件、測(cè)試文件、依賴(lài)庫(kù)信息等。

vue3 模板語(yǔ)法

Vue3的模板語(yǔ)法與Vue2的模板語(yǔ)法基本相同,但也有一些變化。以下是Vue3的模板語(yǔ)法:

插值表達(dá)式

Vue3的插值表達(dá)式使用{{}},例如:

{{ message }}

指令

Vue3的指令使用v-前綴,例如:

常用的指令包括:

v-if:條件渲染。

v-for:循環(huán)渲染。

v-bind:綁定屬性。

v-on:綁定事件。

v-model:雙向綁定。

計(jì)算屬性

Vue3的計(jì)算屬性使用computed關(guān)鍵字,例如:

?<script>export default {  data() {    return {      message: "Hello World"    }  },  computed: {    reversedMessage() {      return this.message.split("").reverse().join("")    }  }}</script>

監(jiān)聽(tīng)器

Vue3的監(jiān)聽(tīng)器使用watch關(guān)鍵字,例如:

?<script>export default {  data() {    return {      message: "Hello World"    }  },  watch: {    message(newValue, oldValue) {      console.log(newValue, oldValue)    }  }}</script>

生命周期

Vue3的生命周期與Vue2基本相同,但是使用了新的API。例如:

?<script>import { onMounted, onUpdated, onUnmounted } from "vue"?export default {  data() {    return {      message: "Hello World"    }  },  setup() {    onMounted(() => {      console.log("mounted")    })    onUpdated(() => {      console.log("updated")    })    onUnmounted(() => {      console.log("unmounted")    })  }}</script>

總的來(lái)說(shuō),Vue3的模板語(yǔ)法與Vue2基本相同,但是使用了新的API,包括computedwatch和生命周期等。

vue3 屬性綁定

在Vue3中,屬性綁定使用v-bind:或簡(jiǎn)寫(xiě)的:,例如:

?<script>export default {  data() {    return {      className: "red"    }  }}</script>

上面的代碼中,:class綁定了一個(gè)名為className的data屬性,這個(gè)屬性的值為"red",所以

元素會(huì)被添加一個(gè)class屬性,值為"red"

除了綁定data屬性,還可以綁定表達(dá)式、計(jì)算屬性、甚至是方法的返回值。例如:

?<script>export default {  data() {    return {      isActive: true    }  },  methods: {    getClass() {      return this.isActive ? "active" : "inactive"    }  }}</script>

上面的代碼中,:class綁定了一個(gè)三元表達(dá)式和一個(gè)方法的返回值,這兩個(gè)值都可以被作為class屬性的值。

需要注意的是,在Vue3中,綁定屬性時(shí),可以使用v-bind:或簡(jiǎn)寫(xiě)的:,但是在綁定事件時(shí),必須使用v-on:或簡(jiǎn)寫(xiě)的@。例如:

?<script>export default {  methods: {    handleClick() {      console.log("clicked")    }  }}</script>

上面的代碼中,@click綁定了一個(gè)handleClick方法,這個(gè)方法會(huì)在按鈕被點(diǎn)擊時(shí)被調(diào)用。

vue3 條件渲染

Vue3中的條件渲染和Vue2類(lèi)似,使用v-ifv-else指令來(lái)控制元素的顯示和隱藏。

示例代碼如下:

?<script>export default {  data() {    return {      show: true    }  }}</script>

上面的代碼中,根據(jù)show的值來(lái)決定顯示哪個(gè)

元素。

除了v-ifv-else,還有v-else-if可以用來(lái)實(shí)現(xiàn)多個(gè)條件的判斷。

示例代碼如下:

?<script>export default {  data() {    return {      type: "B"    }  }}</script>

上面的代碼中,根據(jù)type的值來(lái)決定顯示哪個(gè)

元素。

需要注意的是,v-if是惰性的,只有當(dāng)條件為真時(shí)才會(huì)渲染元素,否則不會(huì)渲染。而v-show則是直接控制元素的顯示和隱藏,不管條件是否為真,元素都會(huì)被渲染,只是樣式被設(shè)置為display: none

vue3 列表渲染

Vue3中的列表渲染和Vue2類(lèi)似,使用v-for指令來(lái)遍歷數(shù)組或?qū)ο螅⑸蓪?duì)應(yīng)的元素。

示例代碼如下:

?<script>export default {  data() {    return {      list: ["item1", "item2", "item3"]    }  }}</script>

上面的代碼中,使用v-for指令遍歷list數(shù)組,并生成對(duì)應(yīng)的

  • 元素。

    除了數(shù)組,也可以遍歷對(duì)象,例如:

    ?<script>export default {  data() {    return {      obj: {        key1: "value1",        key2: "value2",        key3: "value3"      }    }  }}</script>

    上面的代碼中,使用v-for指令遍歷obj對(duì)象,并生成對(duì)應(yīng)的

  • 元素。

    需要注意的是,每個(gè)v-for都需要指定一個(gè)唯一的key屬性,用來(lái)標(biāo)識(shí)每個(gè)元素的唯一性,以便在更新時(shí)能夠正確地識(shí)別每個(gè)元素。

    vue3 通過(guò)key管理狀態(tài)

    在Vue3中,通過(guò)key屬性可以管理組件或元素的狀態(tài)。當(dāng)一個(gè)組件或元素的key屬性發(fā)生變化時(shí),Vue會(huì)認(rèn)為它是一個(gè)不同的組件或元素,從而重新渲染它。

    示例代碼如下:

    ?<script>export default {  data() {    return {      show: true    }  },  methods: {    toggle() {      this.show = !this.show    }  }}</script>

    上面的代碼中,使用key屬性來(lái)管理

    元素的狀態(tài)。當(dāng)show變量的值發(fā)生變化時(shí),
    元素的key屬性也會(huì)發(fā)生變化,從而重新渲染
    元素。

    需要注意的是,key屬性的值必須是唯一的,不能重復(fù)。如果重復(fù)了,會(huì)導(dǎo)致Vue無(wú)法正確地識(shí)別每個(gè)組件或元素的狀態(tài),從而導(dǎo)致渲染錯(cuò)誤。

    vue3 事件處理

    在Vue3中,事件處理的方式與Vue2相似,可以使用@v-on指令來(lái)綁定事件。不同之處在于,Vue3中取消了.sync修飾符,同時(shí)提供了新的修飾符和事件API。

    綁定事件

    可以使用@v-on指令來(lái)綁定事件,語(yǔ)法與Vue2相同。示例如下:

    <script>export default {  methods: {    handleClick() {      console.log("Button clicked!")    }  }}</script>

    上面的代碼中,使用@click指令來(lái)綁定handleClick方法,當(dāng)按鈕被點(diǎn)擊時(shí),會(huì)觸發(fā)handleClick方法。

    事件修飾符

    Vue3中提供了新的事件修飾符,包括.stop.prevent.capture.self.once.passive。示例如下:

    <script>export default {  methods: {    handleClick() {      console.log("Div clicked!")    }  }}</script>

    上面的代碼中,使用.stop修飾符來(lái)阻止事件冒泡,當(dāng)div元素被點(diǎn)擊時(shí),不會(huì)觸發(fā)其父元素的點(diǎn)擊事件。

    動(dòng)態(tài)事件名

    在Vue3中,可以使用方括號(hào)來(lái)綁定動(dòng)態(tài)事件名。示例如下:

    ?<script>export default {  data() {    return {      eventName: "click"    }  },  methods: {    handleClick() {      console.log("Button clicked!")    }  }}</script>

    上面的代碼中,使用@[eventName]指令來(lái)綁定動(dòng)態(tài)事件名,事件名為eventName的值。

    自定義事件

    在Vue3中,可以使用createApp方法的provideinject選項(xiàng)來(lái)實(shí)現(xiàn)自定義事件的傳遞。示例如下:

    // App.vue?<script>import { provide } from "vue"import EventBus from "./EventBus"?export default {  setup() {    provide("eventBus", EventBus)  },  methods: {    handleClick() {      EventBus.emit("customEvent", "Hello, Vue3!")    }  }}</script>?// EventBus.jsimport mitt from "mitt"?const EventBus = mitt()?export default EventBus?// ChildComponent.vue?<script>import { inject } from "vue"?export default {  setup() {    const eventBus = inject("eventBus")    const message = ref("")?    eventBus.on("customEvent", (data) => {      message.value = data    })?    return {      message    }  }}</script>

    上面的代碼中,使用provide方法將事件總線(xiàn)對(duì)象EventBus注入到根組件中,然后在子組件中使用inject方法獲取事件總線(xiàn)對(duì)象,并通過(guò)on方法監(jiān)聽(tīng)自定義事件customEvent,當(dāng)事件觸發(fā)時(shí),更新message的值。

    vue3 事件傳參

    在Vue3中,事件傳參的方式和Vue2基本相同,可以使用$event來(lái)傳遞事件對(duì)象,也可以使用函數(shù)來(lái)傳遞自定義參數(shù)。

    示例代碼如下:

    ?<script>export default {  methods: {    handleClick(event, arg) {      console.log(event) // 輸出事件對(duì)象      console.log(arg) // 輸出自定義參數(shù)    }  }}</script>

    上面的代碼中,使用$event來(lái)傳遞事件對(duì)象,使用"參數(shù)"來(lái)傳遞自定義參數(shù)。

    另外,如果需要在事件處理函數(shù)中訪問(wèn)組件實(shí)例,可以使用箭頭函數(shù)來(lái)綁定作用域,例如:

    ?<script>export default {  methods: {    handleClick(arg) {      console.log(this) // 輸出組件實(shí)例      console.log(arg) // 輸出自定義參數(shù)    }  }}</script>

    上面的代碼中,使用箭頭函數(shù)來(lái)綁定作用域,從而在事件處理函數(shù)中訪問(wèn)組件實(shí)例。

    vue3 事件修飾符

    在Vue3中,事件修飾符的使用方式和Vue2基本相同,可以通過(guò)在事件名后面添加.修飾符的方式來(lái)使用事件修飾符。

    常用的事件修飾符包括:

    .stop:阻止事件冒泡

    .prevent:阻止事件默認(rèn)行為

    .capture:使用事件捕獲模式

    .self:只在事件目標(biāo)自身觸發(fā)時(shí)觸發(fā)事件

    .once:只觸發(fā)一次事件

    .passive:告訴瀏覽器該事件不會(huì)調(diào)用preventDefault()方法,可以?xún)?yōu)化頁(yè)面滾動(dòng)性能

    示例代碼如下:

    ?<script>export default {  methods: {    handleClick() {      console.log("點(diǎn)擊事件")    },    handleScroll() {      console.log("滾動(dòng)事件")    }  }}</script>

    上面的代碼中,使用不同的事件修飾符來(lái)控制事件的行為。例如,使用.stop修飾符來(lái)阻止事件冒泡,使用.prevent修飾符來(lái)阻止事件默認(rèn)行為,使用.capture修飾符來(lái)使用事件捕獲模式,使用.self修飾符來(lái)只在事件目標(biāo)自身觸發(fā)時(shí)觸發(fā)事件,使用.once修飾符來(lái)只觸發(fā)一次事件,使用.passive修飾符來(lái)告訴瀏覽器該事件不會(huì)調(diào)用preventDefault()方法,可以?xún)?yōu)化頁(yè)面滾動(dòng)性能。

    vue3 計(jì)算屬性

    在Vue3中,計(jì)算屬性的使用方式和Vue2基本相同,可以通過(guò)在組件的computed選項(xiàng)中定義計(jì)算屬性來(lái)計(jì)算和緩存值。

    示例代碼如下:

    ?<script>export default {  data() {    return {      price: 10,      count: 2    }  },  computed: {    quantity() {      return this.count    },    totalPrice() {      return this.price * this.count    }  }}</script>

    上面的代碼中,使用computed選項(xiàng)來(lái)定義計(jì)算屬性quantitytotalPrice,分別計(jì)算商品數(shù)量和商品總價(jià)。

    在模板中,可以像訪問(wèn)普通屬性一樣訪問(wèn)計(jì)算屬性,例如{{ quantity }}{{ totalPrice }}

    需要注意的是,在Vue3中,計(jì)算屬性的返回值可以是一個(gè)函數(shù),這樣可以實(shí)現(xiàn)動(dòng)態(tài)計(jì)算屬性。示例代碼如下:

    ?<script>export default {  data() {    return {      price: 10,      count: 2,      discount: 0.8    }  },  computed: {    quantity() {      return this.count    },    totalPrice() {      return () => this.price * this.count * this.discount    }  }}</script>

    上面的代碼中,計(jì)算屬性totalPrice返回一個(gè)函數(shù),這個(gè)函數(shù)會(huì)動(dòng)態(tài)計(jì)算商品總價(jià),考慮到折扣可能會(huì)變化,因此需要?jiǎng)討B(tài)計(jì)算商品總價(jià)。

    vue3 class綁定

    在Vue3中,可以使用v-bind:class指令來(lái)綁定一個(gè)對(duì)象或數(shù)組來(lái)動(dòng)態(tài)地設(shè)置一個(gè)元素的class屬性。

    下面是使用對(duì)象語(yǔ)法綁定class的示例代碼:

    ?<script>export default {  data() {    return {      isActive: true,      hasError: false    }  }}</script>

    上面的代碼中,使用:class指令來(lái)綁定一個(gè)對(duì)象,這個(gè)對(duì)象的屬性名是class名稱(chēng),屬性值是一個(gè)布爾值,表示是否應(yīng)用這個(gè)class。在這個(gè)示例中,如果isActivetrue,則會(huì)應(yīng)用active這個(gè)class,如果hasErrortrue,則會(huì)應(yīng)用text-danger這個(gè)class。

    下面是使用數(shù)組語(yǔ)法綁定class的示例代碼:

    ?<script>export default {  data() {    return {      isActive: true,      errorClass: "text-danger"    }  }}</script>

    上面的代碼中,使用:class指令來(lái)綁定一個(gè)數(shù)組,這個(gè)數(shù)組的元素可以是字符串或?qū)ο蟆H绻麛?shù)組元素是字符串,則表示應(yīng)用這個(gè)class;如果數(shù)組元素是對(duì)象,則表示應(yīng)用這個(gè)對(duì)象中的class。

    在這個(gè)示例中,如果isActivetrue,則會(huì)應(yīng)用active這個(gè)class,如果errorClasstext-danger,則會(huì)應(yīng)用text-danger這個(gè)class。

    需要注意的是,在Vue3中,可以使用動(dòng)態(tài)組件來(lái)動(dòng)態(tài)渲染不同的組件,這個(gè)功能可以使用元素和is特性來(lái)實(shí)現(xiàn)。示例代碼如下:

    ?<script>import ComponentA from "./ComponentA.vue"import ComponentB from "./ComponentB.vue"?export default {  components: {    ComponentA,    ComponentB  },  data() {    return {      currentComponent: "ComponentA"    }  }}</script>

    上面的代碼中,使用元素和is特性來(lái)動(dòng)態(tài)渲染不同的組件。在這個(gè)示例中,點(diǎn)擊ComponentA按鈕會(huì)渲染ComponentA組件,點(diǎn)擊ComponentB按鈕會(huì)渲染ComponentB組件。

    vue3 style 綁定

    在Vue3中,可以使用v-bind指令或簡(jiǎn)寫(xiě)的:來(lái)動(dòng)態(tài)綁定樣式。

    綁定單個(gè)樣式

    可以使用對(duì)象語(yǔ)法來(lái)綁定單個(gè)樣式,對(duì)象的屬性名為樣式名,屬性值為樣式值。示例如下:

    ?<script>export default {  data() {    return {      textColor: "red"    }  }}</script>

    上面的代碼中,使用:style指令來(lái)綁定color樣式,樣式的值為textColor的值。

    綁定多個(gè)樣式

    可以使用對(duì)象語(yǔ)法來(lái)綁定多個(gè)樣式,對(duì)象的屬性名為樣式名,屬性值為樣式值。示例如下:

    ?<script>export default {  data() {    return {      textColor: "red",      fontSize: 16    }  }}</script>

    上面的代碼中,使用:style指令來(lái)綁定colorfontSize兩個(gè)樣式,樣式的值分別為textColorfontSize的值。

    綁定樣式數(shù)組

    可以使用數(shù)組語(yǔ)法來(lái)綁定多個(gè)樣式,數(shù)組中的元素為樣式對(duì)象。示例如下:

    ?<script>export default {  data() {    return {      baseStyles: {        color: "red",        fontSize: "16px"      },      customStyles: {        fontWeight: "bold"      }    }  }}</script>

    上面的代碼中,使用:style指令來(lái)綁定baseStylescustomStyles兩個(gè)樣式對(duì)象,樣式的值為兩個(gè)對(duì)象的合并結(jié)果。

    綁定樣式對(duì)象

    可以使用計(jì)算屬性來(lái)動(dòng)態(tài)綁定樣式對(duì)象。示例如下:

    ?<script>export default {  data() {    return {      textColor: "red",      fontSize: 16    }  },  computed: {    computedStyles() {      return {        color: this.textColor,        fontSize: this.fontSize + "px"      }    }  }}</script>

    上面的代碼中,使用計(jì)算屬性computedStyles來(lái)動(dòng)態(tài)綁定樣式對(duì)象,樣式的值為計(jì)算屬性的返回值。

    關(guān)鍵詞:

    資訊

    圖賞