十分鐘,帶你瞭解 Vue3 的新寫法

来源:https://www.cnblogs.com/houxianzhou/p/18174444
-Advertisement-
Play Games

本文的目的,是為了讓已經有 Vue2 開發經驗的 人 ,快速掌握 Vue3 的寫法。 因此, 本篇假定你已經掌握 Vue 的核心內容 ,只為你介紹編寫 Vue3 代碼,需要瞭解的內容。 一、Vue3 里 script 的三種寫法 首先,Vue3 新增了一個叫做組合式 api 的東西,英文名叫 Com ...


本文的目的,是為了讓已經有 Vue2 開發經驗的  ,快速掌握 Vue3 的寫法。

因此, 本篇假定你已經掌握 Vue 的核心內容 ,只為你介紹編寫 Vue3 代碼,需要瞭解的內容。

一、Vue3 里 script 的三種寫法

首先,Vue3 新增了一個叫做組合式 api 的東西,英文名叫 Composition API。因此 Vue3 的 script 現在支持三種寫法,

1、最基本的 Vue2 寫法

<template>
  <div>{{ count }}</div>
  <button @click="onClick">
    增加 1
  </button>
</template>

<script>
export default {
  data() {
    return {
      count: 1,
    };
  },
  methods: {
    onClick() {
      this.count += 1;
    },
  },
}
</script>

2、setup() 屬性

<template>
  <div>{{ count }}</div>
  <button @click="onClick">
    增加 1
  </button>
</template>

<script>
import { ref } from 'vue';
export default {

  // 註意這部分
  setup() {
    let count = ref(1);
    const onClick = () => {
      count.value += 1;
    };
    return {
      count,
      onClick,
    };
  },
  
}
</script>

3、<script setup>

<template>
  <div>{{ count }}</div>
  <button @click="onClick">
    增加 1
  </button>
</template>

<script setup>
import { ref } from 'vue';

const count = ref(1);
const onClick = () => {
  count.value += 1;
};
</script>

正如你看到的那樣,無論是代碼行數,還是代碼的精簡度,<script setup> 的方式是最簡單的形式。

如果你對 Vue 很熟悉,那麼,我推薦你使用 <script setup> 的方式。

這種寫法,讓 Vue3 成了我最喜歡的前端框架。

如果你還是前端新人,那麼,我推薦你先學習第一種寫法。

因為第一種寫法的學習負擔更小,先學第一種方式,掌握最基本的 Vue 用法,然後再根據我這篇文章,快速掌握 Vue3 里最需要關心的內容。

第一種寫法,跟過去 Vue2 的寫法是一樣的,所以我們不過多介紹。

第二種寫法,所有的對象和方法都需要 return 才能使用,太啰嗦。除了舊項目,可以用這種方式體驗 Vue3 的新特性以外,我個人不建議瞭解這種方式。反正我自己暫時不打算精進這部分。

所以,接下來,我們主要介紹的,也就是 <script setup> ,這種寫法里需要瞭解的內容。

註意: <script setup> 本質上是第二種寫法的語法糖,掌握了這種寫法,其實第二種寫法也基本上就會了。(又多了一個不學第二種寫法的理由)。

二、如何使用 <script setup> 編寫組件

學習 Vue3 並不代表你需要新學習一個技術,Vue3 的底層開發思想,跟 Vue2 是沒有差別的。

V3 和 V2 的區別就像是,你用不同的語言或者方言說同一句話。

所以我們需要關心的,就是 Vue2 里的內容,怎麼用 Vue3 的方式寫出來。

1、data——唯一需要註意的地方

整個 data 這一部分的內容,你只需要記住下麵這一點。

以前在 data 中創建的屬性,現在全都用 ref() 聲明。

 template 中直接用,在 script 中記得加 .value 

在開頭,我就已經寫了一個簡單的例子,我們直接拿過來做對比。

1)寫法對比

 // Vue2 的寫法

<template>
  <div>{{ count }}</div>
  <button @click="onClick">
    增加 1
  </button>
</template>

<script>
export default {
  data() {
    return {
      count: 1,
    };
  },
  methods: {
    onClick() {
      this.count += 1;
    },
  },
}
</script>
 // Vue3 的寫法

<template>
  <div>{{ count }}</div>
  <button @click="onClick">
    增加 1
  </button>
</template>

<script setup>
import { ref } from 'vue';

 // 用這種方式聲明
const count = ref(1);

const onClick = () => {
   // 使用的時候記得 .value
  count.value += 1;
};
</script>

2)註意事項——組合式 api 的心智負擔

a、ref 和 reactive

Vue3 里,還提供了一個叫做 reactive 的 api

但是我的建議是,你不需要關心它。絕大多數場景下,ref 都夠用了。

b、什麼時候用 ref() 包裹,什麼時候不用。

要不要用ref,就看你的這個變數的值改變了以後,頁面要不要跟著變。

當然,你可以完全不需要關心這一點,跟過去寫 data 一樣就行。

只不過這樣做,你在使用的時候,需要一直 .value

c、不要解構使用

在使用時,不要像下麵這樣去寫,會丟失響應性。

也就是會出現更新了值,但是頁面沒有更新的情況

// Vue3 的寫法
<template>
  <div>{{ count }}</div>
  <button @click="onClick">
    增加 1
  </button>
</template>

<script setup>
import { ref } from 'vue';

const count = ref(1);
const onClick = () => {
  // 不要這樣寫!!
  const { value } = count;
  value += 1;
};
</script>

註意: 學習 Vue3 就需要考慮像這樣的內容,徒增了學習成本。實際上這些心智負擔,在學習的過程中,是可以完全不需要考慮的。

這也是為什麼我推薦新人先學習 Vue2 的寫法。

2、methods

聲明事件方法,我們只需要在 script 標簽里,創建一個方法對象即可。

剩下的在 Vue2 里是怎麼寫的,Vue3 是同樣的寫法。

// Vue2 的寫法
<template>
  <div @click="onClick">
    這是一個div
  </div>
</template>

<script>
export default {
  methods: {
    onClick() {
      console.log('clicked')
    },
  },
}
</script>
// Vue3 的寫法
<template>
  <div @click="onClick">
    這是一個div
  </div>
</template>

<script setup>

// 註意這部分
const onClick = () => {
  console.log('clicked')
}

</script>

3、props

聲明 props 我們可以用 defineProps(),具體寫法,我們看代碼。

1)寫法對比

// Vue2 的寫法
<template>
  <div>{{ foo }}</div>
</template>

<script>
export default {
  props: {
    foo: String,
  },
  created() {
    console.log(this.foo);
  },
}
</script>
// Vue3 的寫法
<template>
  <div>{{ foo }}</div>
</template>

<script setup>

// 註意這裡
const props = defineProps({
  foo: String
})

// 在 script 標簽里使用
console.log(props.foo)
</script>

2)註意事項——組合式 api 的心智負擔

使用 props 時,同樣註意不要使用解構的方式。

<script setup>
const props = defineProps({
  foo: String
})

 // 不要這樣寫
const { foo } = props;
console.log(foo)
</script>

4、emits 事件

與 props 相同,聲明 emits 我們可以用 defineEmits(),具體寫法,我們看代碼。

// Vue2 的寫法
<template>
  <div @click="onClick">
    這是一個div
  </div>
</template>

<script>
export default {

  emits: ['click'], // 註意這裡
  methods: {
    onClick() {
      this.$emit('click'); // 註意這裡
    },
  },
 
}
</script>
// Vue3 的寫法
<template>
  <div @click="onClick">
    這是一個div
  </div>
</template>

<script setup>

// 註意這裡
const emit = defineEmits(['click']);

const onClick = () => {
  emit('click') // 註意這裡
}

</script>

5、computed

直接上寫法對比。

// Vue2 的寫法
<template>
  <div>
    <span>{{ value }}</span>
    <span>{{ reversedValue }}</span>
  </div>
</template>

<script>
export default {
  data() {
    return {
      value: 'this is a value',
    };
  },
  computed: {
    reversedValue() {
      return value
        .split('').reverse().join('');
    },
  },
}
</script>
// Vue3 的寫法
<template>
  <div>
    <span>{{ value }}</span>
    <span>{{ reversedValue }}</span>
  </div>
</template>

<script setup>
import {ref, computed} from 'vue'
const value = ref('this is a value')

// 註意這裡
const reversedValue = computed(() => {
  // 使用 ref 需要 .value
  return value.value
    .split('').reverse().join('');
})

</script>

6、watch

這一部分,我們需要註意一下了,Vue3 中,watch 有兩種寫法。一種是直接使用 watch,還有一種是使用 watchEffect

兩種寫法的區別是:

  • watch 需要你明確指定依賴的變數,才能做到監聽效果。

  • 而 watchEffect 會根據你使用的變數,自動的實現監聽效果。

1)直接使用 watch

// Vue2 的寫法
<template>
  <div>{{ count }}</div>
  <div>{{ anotherCount }}</div>
  <button @click="onClick">
    增加 1
  </button>
</template>

<script>
export default {
  data() {
    return {  
      count: 1,
      anotherCount: 0,
    };
  },
  methods: {
    onClick() {
      this.count += 1;
    },
  },
  watch: {
    count(newValue) {
      this.anotherCount = newValue - 1;
    },
  },
}
</script>
// Vue3 的寫法
<template>
  <div>{{ count }}</div>
  <div>{{ anotherCount }}</div>
  <button @click="onClick">
    增加 1
  </button>
</template>

<script setup>
import { ref, watch } from 'vue';

const count = ref(1);
const onClick = () => {
  count.value += 1;
};

const anotherCount = ref(0);

// 註意這裡
// 需要在這裡,
// 明確指定依賴的是 count 這個變數
watch(count, (newValue) => {
  anotherCount.value = newValue - 1;
})

</script>

2)使用 watchEffect

// Vue2 的寫法
<template>
  <div>{{ count }}</div>
  <div>{{ anotherCount }}</div>
  <button @click="onClick">
    增加 1
  </button>
</template>

<script>
export default {
  data() {
    return {  
      count: 1,
      anotherCount: 0,
    };
  },
  methods: {
    onClick() {
      this.count += 1;
    },
  },
  watch: {
    count(newValue) {
      this.anotherCount = newValue - 1;
    },
  },
}
</script>
// Vue3 的寫法
<template>
  <div>{{ count }}</div>
  <div>{{ anotherCount }}</div>
  <button @click="onClick">
    增加 1
  </button>
</template>

<script setup>
import { ref, watchEffect } from 'vue';

const count = ref(1);
const onClick = () => {
  count.value += 1;
};

const anotherCount = ref(0);

// 註意這裡
watchEffect(() => {
  // 會自動根據 count.value 的變化,
  // 觸發下麵的操作
  anotherCount.value = count.value - 1;
})

</script>

7、生命周期

Vue3 里,除了將兩個 destroy 相關的鉤子,改成了 unmount,剩下的需要註意的,就是在 <script setup> 中,不能使用 beforeCreate 和 created 兩個鉤子。

如果你熟悉相關的生命周期,只需要記得在 setup 里,用 on 開頭,加上大寫首字母就行。

// 選項式 api 寫法
<template>
  <div></div>
</template>

<script>
export default {
  beforeCreate() {},
  created() {},
  
  beforeMount() {},
  mounted() {},
  
  beforeUpdate() {},
  updated() {},
  
  // Vue2 里叫 beforeDestroy
  beforeUnmount() {},
  // Vue2 里叫 destroyed
  unmounted() {},
  
  // 其他鉤子不常用,所以不列了。
}
</script>
// 組合式 api 寫法
<template>
  <div></div>
</template>


<script setup>
import {
  onBeforeMount,
  onMounted,

  onBeforeUpdate,
  onUpdated,

  onBeforeUnmount,
  onUnmounted,
} from 'vue'

onBeforeMount(() => {})
onMounted(() => {})

onBeforeUpdate(() => {})
onUpdated(() => {})

onBeforeUnmount(() => {})
onUnmounted(() => {})
</script>

三、結語

好了,對於快速上手 Vue3 來說,以上內容基本已經足夠了。

這篇文章本身不能做到幫你理解所有 Vue3 的內容,但是能幫你快速掌握 Vue3 的寫法。

如果想做到對 Vue3 的整個內容心裡有數,還需要你自己多看看 Vue3 的官方文檔

本文來自博客園,作者:喆星高照,轉載請註明原文鏈接:https://www.cnblogs.com/houxianzhou/p/18174444


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • title: 進程間通信 cover: https://img2.imgtp.com/2024/04/30/9GnvXoDg.png tags: - 通信 - linux categories: linux系統編程 引言 進程間通信(interprocess communication,簡稱 IPC ...
  • 目錄網路配置服務管理防火牆配置文件下載wget和curl網路連接信息netstat和ss Linux 網路管理涉及一系列任務,包括配置網路介面、設置IP地址、管理網路服務和防火牆等。 網路配置 網卡命名 根據網路介面定義設備: ethX 傳統的乙太網介面命名方式,其中 X 通常是數字,如 eth0 ...
  • 大數據面試SQL每日一題系列:最高峰同時線上主播人數。位元組,快手等大廠高頻面試題 之後會不定期更新每日一題sql系列。 SQL面試題每日一題系列內容均來自於網路以及實際使用情況收集,如有雷同,純屬巧合。 1.題目 問題1:如下為某直播平臺各主播的開播及關播時間數據明細,現在需要計算該平臺最高峰期同時 ...
  • 一、下載mysql安裝包 官網:https://dev.mysql.com/downloads/mysql/ 預設會跳轉到最新版本的下載頁面,也可以在舊版本集中選擇需要安裝的版本。 MSI Installer是安裝程式,ZIP Archive是壓縮包形式。 二、安裝mysql MSI安裝程式會有圖形 ...
  • 摘要:作為Valkey社區的Technical Steering Committee member,華為雲將持續參與社區建設。 一、背景 今年3月21日,Redis Labs宣佈從Redis 7.4版本開始,將原先比較寬鬆的BSD源碼使用協議修改為RSAv2和SSPLv1協議,意味著 Redis在O ...
  • 本文介紹基於Microsoft SQL Server軟體,實現資料庫表中多種數據查詢方法的具體操作。 目錄1 指定列或全部列查詢——查詢S表學生記錄2 指定列或全部列查詢——查詢學生姓名與出生年份3 按條件查詢及模糊查詢——查詢成績不及格學生學號4 按條件查詢及模糊查詢——查詢20-23歲間學生姓名 ...
  • 在Kafka中,Broker、Topic、Partition和Replication是四個核心概念,它們各自扮演了不同的角色並共同協作以確保數據的可靠性、可擴展性和高性能。以下是關於這四個概念的詳細解釋: Broker(代理) * Broker是Kafka集群中的一個節點,負責存儲和轉發消息。Kaf ...
  • 一、是什麼 當對一個文檔進行佈局(layout)的時候,瀏覽器的渲染引擎會根據標準之一的 CSS 基礎框盒模型(CSS basic box model),將所有元素表示為一個個矩形的盒子(box) 一個盒子由四個部分組成:content、padding、border、margin content,即 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...