Vue3速成

文章目錄

  • day 1
      • 1. 創建vue3工程
      • 3. 響應式數據
      • 4. 計算屬性
  • day 2
      • 5. watch 監視
      • 6. watchEffect
      • 7. 標簽的`ref`屬性
      • 8. 回顧TS中的接口_泛型_自定義類型

day 1

1. 創建vue3工程

相關代碼如下:

## 創建vue工程
npm create vue@lastest## 安裝node_modules
npm install // npm i

創建工程完畢之后,進入文件夾可以發現有如下文件,下圖是文件介紹:

入口文件介紹:

這里main.ts是與index.html建立聯系的;

通過.mount('#app')這樣 main.ts就與index.html建立起了聯系;

其中main.ts的代碼格式如下:

<template><div><h1>你好</h1></div>
</template><script setup lang="ts">// js或者ts
</script><style scoped>/* 樣式 */
</style>

App.vue的代碼格式如下:

<template><div class="app"><h1>你好</h1></div>
</template><script setup lang="ts">// js或者ts
</script><style scoped>/* 樣式 */.app {background-color: #ddd;box-shadow: 0 0 10px;border-radius: 10px;padding: 20px;}
</style>

網頁調試vue可以在chrome應用商店search vue.js devtools下載安裝就好;

你好

### 2. 選項式API和組合式API

感覺vue2和vue3的主要不同就在于vue文件中script部分;其中vue2是選項式OptionsAPI的,vue3是組合式Composition的;

選項式API相關代碼如下

注意,這里并沒有setup

<script lang="ts">export default {// 定義組件名字name: 'Person',// 定義數據data(){return {name: '張三',age: 18,tel: '138888888'}},//  定義方法methods:{changeName(){this.name = 'zhang-san'},changeAge(){this.age += 1},showTel(){alert(this.tel)}},}
</script>

組合式相關代碼如下

注意,這里的setup比beforecreate執行得還要早,setup的返回值也可以是渲染函數,data,method,setup可以同時存在,setup不可以讀取data中的數據,反之則可以,因為setup是執行得最早的;

<script lang="ts">export default {name: 'Person',setup(){// 數據let name = '張三' // 此時name,age,tel 不是響應式的    應該改為ref或者reactivelet age = 18    // 此時name,age,tel 不是響應式的  應該改為ref或者reactivelet tel = '138888888'   // 此時name,age,tel 不是響應式的  應該改為ref或者reactive// 方法function changeName(){name = 'zhang-san'}function changeAge(){age += 1}function showTel(){alert(tel)}// 把數據和方法交出去return {name, age, changeAge, changeName, showTel}}}
</script>

setup語法糖簡化后代碼如下:

<script lang="ts">export default {name: 'Person',}
</script><script setup lang="ts">// 數據let name = '張三' // 此時name,age,tel 不是響應式的    應該改為ref或者reactivelet age = 18    // 此時name,age,tel 不是響應式的  應該改為ref或者reactivelet tel = '138888888'   // 此時name,age,tel 不是響應式的  應該改為ref或者reactive// 方法function changeName(){name = 'zhang-san'}function changeAge(){age += 1}function showTel(){alert(tel)}// 此時不需要return 自動提交
</script>

3. 響應式數據

響應式數據創建有兩種方法,一種是ref,一種是reactive

ref定義基本類型的數據

使用的相關代碼如下:

<template><div class="app"><h2>姓名:{{ name }}</h2> // 利用大括號包起來的是不需要.value的<h2>年齡:{{ age }}</h2> // 利用大括號包起來的是不需要.value的<button @click="changeName">修改名字</button><button @click="changeAge">修改年齡</button><button @click="showTel">查看聯系方式</button></div>
</template><script setup lang="ts">import {ref} from 'vue'let name = ref('張三')let age = ref(18)   let tel = ref('138888888')// 在ref包裹住后,需要操作值都需要.valuefunction changeName(){name.value = 'zhang-san'}function changeAge(){age.value += 1}function showTel(){alert(tel.value)}

這里值用ref包裹起來之后,變量會變成一個RefImpl類的數據,這時要修改值直接對變量操作是無意義的,我們需要對.value進行操作;這里要注意的是,ref也可以定義對象類的響應式數據,實現原理是先用ref包裹,再用reactive包裹,即取值還是需要用value

reactive定義對象類型的數據

使用的相關代碼如下:

<template><div class="app"><h2>姓名:{{ student.name }}</h2><h2>年齡:{{ student.age }}</h2><button @click="changeName">修改名字</button><button @click="changeAge">修改年齡</button></div>
</template><script lang="ts">export default {name: 'Person',}
</script><script setup lang="ts">import {reactive} from 'vue'let student = reactive({name:'張三', age:18})function changeName(){student.name = 'zhang-san'}function changeAge(){student.age += 1}</script><style scoped>/* 樣式 */.app {background-color: #ddd;box-shadow: 0 0 10px;border-radius: 10px;padding: 20px;}button {margin: 10px;}
</style>

reactive包起來后,對象變成了一個Proxy的對象,原對象在Proxy里面的target中;這里的reactive是深層次的,只能定義對象類型的響應式數據;

refreactive的對比

這里要注意的是,重新分配reactive的對象時,使用Object.assign,但是如果是利用ref定義的對象類數據,我們是可以直接進行替換的;

對響應式數據進行解構,toReftoRefs

let person = reactive({name: '張三',age: 18
})let {name, age} = person
// let name = person.name
// let age = person.agelet {name, age} = toRefs(person) //把reactive對象里面的每一組對象轉化為ref
// let name = toRef(person, 'name')
// let age = toRef(person, 'age')

4. 計算屬性

v-bind 是 單向綁定,數據流向頁面;v-model 是 雙向綁定,頁面也可以流向數據;

計算屬性 computed 是只要響應式變量出現了變化,就隨之變化;

使用例子如下:

<template><div class="app">姓名:<input type="text" v-model="name"> <br>年齡:<input type="text" v-model="age"> <br>information: {{ information }}</div>
</template><script lang="ts">export default {name: 'Person',}
</script><script setup lang="ts">import {ref, computed} from 'vue'let name = ref('zhangsan')let age = ref(18)let information = computed(()=>{return name.value + age.value})</script><style scoped>/* 樣式 */.app {background-color: #ddd;box-shadow: 0 0 10px;border-radius: 10px;padding: 20px;}
</style>

computed是用來區別于方法的,使用computed得到的屬性是沒有緩存的,而且computed得到的屬性是不可修改的;如果需要修改,則需要使用以下方法:

<template><div class="app">姓名:<input type="text" v-model="name"> <br>年齡:<input type="text" v-model="age"> <br>information: {{ information }} <br><button @click="changeInformation">修改information為lisi</button></div>
</template><script lang="ts">export default {name: 'Person',}
</script><script setup lang="ts">import {ref, computed} from 'vue'let name = ref('zhangsan')let age = ref(18)let information = computed({get(){return name.value + '-' + age.value},set(val){const [s1, s2] = val.split('-')name.value = s1age.value = parseInt(s2)}})function changeInformation(){information.value = 'lisi-18'}</script><style scoped>/* 樣式 */.app {background-color: #ddd;box-shadow: 0 0 10px;border-radius: 10px;padding: 20px;}
</style>

day 2

5. watch 監視

情況1:監視ref定義的基本類型數據

停止監視只需要調用watch函數的返回值就可以;

<template><div><h5>情況1:監視【ref】定義的值是【基本類型】的數據</h5>sum : {{ sum }} <br><button @click="changeSum"> sum + 1</button> <br><hr></div>
</template><script lang="ts">export default {name: 'Person'}
</script><script setup lang="ts">import {ref, watch} from 'vue'let sum = ref(1)function changeSum(){sum.value += 1}// 這里的sum是不需要添加.value的,返回值就是停止監視的函數const stopwatch = watch(sum, (newVal, oldVal)=>{console.log('sum變化了', newVal, oldVal)// 如果sum的最新值大于等于10則停止監視if(newVal >= 10 ){stopwatch()}})
</script><style scoped>
</style>

情況2:監視ref定義的對象類型數據

這里要注意的是:若修改的是ref定義的對象中的屬性,newVal和oldVal都是新值,因為是同一個對象;若修改的是ref定義的整個對象,newVal是新值,oldVal是舊值,因為不是同一個對象;

<template><div><h5>情況2:監視【ref】定義的值是【對象類型】的數據</h5>姓名: {{ person.name }} <br>年齡: {{ person.age }} <br><button @click="changeName">修改名字</button><button @click="changeAge">修改年齡</button><button @click="changeFull">修改整個人</button></div>
</template><script lang="ts">export default {name: 'Person'}
</script><script setup lang="ts">import {ref, watch} from 'vue'let person = ref({name: '張三',age: 18})function changeName (){person.value.name = '李四'}function changeAge (){person.value.age = 19}function changeFull (){person.value = {name: '王五', age: 20}}// 監視【ref】定義的【對象類型數據】,監視的是對象的地址值,若想要監視// 對象的內部屬性的變化,需要手動開啟深度監視deep// 若修改的是ref定義的對象中的屬性,newVal和oldVal都是新值,因為是同一個對象// 若修改的是ref定義的整個對象,newVal是新值,oldVal是舊值,因為不是同一個對象// watch的第一個參數是:被監視的數據// watch的第二個參數是:監視的回調// watch的第三個參數是:配置對象(deep, immediate ... )watch(person, (newVal, oldVal)=>{console.log('person變化了', newVal, oldVal)}, {deep: true})
</script><style scoped>button {margin: 10px;}
</style>

情況3:監視reactive定義的對象類型數據

很簡單,只需要把ref定義的對象改為reactive定義的對象,然后在修改整個對象的時候使用Object.assign替換就可以;

<template><div><h5>情況3:監視【reactive】定義的值是【對象類型】的數據</h5>姓名: {{ person.name }} <br>年齡: {{ person.age }} <br><button @click="changeName">修改名字</button><button @click="changeAge">修改年齡</button><button @click="changeFull">修改人</button></div>
</template><script lang="ts">export default {name: 'Person'}
</script><script setup lang="ts">import {reactive, watch} from 'vue'let person = reactive({name: '張三',age: 18})function changeName (){person.name = '李四'}function changeAge (){person.age = 19}function changeFull (){// 并沒有修改地址值;Object.assign(person, {name: '王五', age: 20})}// 監視【reactive】定義的對象類型數據,默認是開啟深度監視的,而且深度是關不掉的watch(person, (newVal, oldVal)=>{console.log('person變化了', newVal, oldVal)})</script><style scoped>button {margin: 10px;}
</style>

情況4:監視ref或者reactive定義的對象類型中的某個屬性

<template><div><h5>情況4:監視【ref或reactive】定義的【對象類型】某個屬性</h5>姓名: {{ person.name }} <br>年齡: {{ person.age }} <br>車輛:{{ person.car.c1 }}, {{ person.car.c2 }} <br><button @click="changeName">修改名字</button><button @click="changeAge">修改年齡</button><button @click="changeC1">修改c1</button><button @click="changeC2">修改c2</button><button @click="changeCar">修改car</button></div>
</template><script lang="ts">export default {name: 'Person'}
</script><script setup lang="ts">import {reactive, watch} from 'vue'let person = reactive({name: '張三',age: 18,car:{c1: 'asd',c2: 'das'}})function changeName (){person.name = '李四'}function changeAge (){person.age = 19}function changeC1(){person.car.c1 = 'qqq'}function changeC2(){person.car.c2 = 'www'}function changeCar(){person.car = {c1:'yyy', c2:'jjj'}}// 監視響應式對象中的某個屬性,且該變量是基本類型的,要寫成函數式/* watch(()=>person.name, (newVal, oldVal)=>{console.log('person.name變化了', newVal, oldVal)}) */// 監視響應式對象中的某個屬性,且該屬性是對象類型的,可以直接寫,也能寫函數,推薦寫函數watch(()=>person.car, (newVal, oldVal)=>{console.log('person.car變化了', newVal, oldVal)}, {deep:true})</script><style scoped>button {margin: 10px;}
</style>

情況5:監視多個數據

<template><div><h5>情況4:監視【ref】定義的值是【對象類型】的數據</h5>姓名: {{ person.name }} <br>年齡: {{ person.age }} <br>車輛:{{ person.car.c1 }}, {{ person.car.c2 }} <br><button @click="changeName">修改名字</button><button @click="changeAge">修改年齡</button><button @click="changeC1">修改c1</button><button @click="changeC2">修改c2</button><button @click="changeCar">修改car</button></div>
</template><script lang="ts">export default {name: 'Person'}
</script><script setup lang="ts">import {reactive, watch} from 'vue'let person = reactive({name: '張三',age: 18,car:{c1: 'asd',c2: 'das'}})function changeName (){person.name = '李四'}function changeAge (){person.age = 19}function changeC1(){person.car.c1 = 'qqq'}function changeC2(){person.car.c2 = 'www'}function changeCar(){person.car = {c1:'yyy', c2:'jjj'}}// 此時newVal和oldVal是數組與前面的對應watch([()=>person.name, ()=>person.age], (newVal, oldVal)=>{console.log('變化了', newVal, oldVal)})</script><style scoped>button {margin: 10px;}
</style>

6. watchEffect

相較于watch,watchEffect不需要指定監視對象,而是響應式的追蹤對象;

<template><div><h5>情況4:監視【ref】定義的值是【對象類型】的數據</h5>姓名: {{ person.name }} <br>年齡: {{ person.age }} <br>車輛:{{ person.car.c1 }}, {{ person.car.c2 }} <br><button @click="changeName">修改名字</button><button @click="changeAge">修改年齡</button><button @click="changeC1">修改c1</button><button @click="changeC2">修改c2</button><button @click="changeCar">修改car</button></div>
</template><script lang="ts">export default {name: 'Person'}
</script><script setup lang="ts">import {reactive, watch, watchEffect} from 'vue'let person = reactive({name: '張三',age: 18,car:{c1: 'asd',c2: 'das'}})function changeName (){person.name = '李四'}function changeAge (){person.age += 1}function changeC1(){person.car.c1 = 'qqq'}function changeC2(){person.car.c2 = 'www'}function changeCar(){person.car = {c1:'yyy', c2:'jjj'}}// 此時newVal和oldVal是數組與前面的對應/* watch([()=>person.name, ()=>person.age], (newVal, oldVal)=>{let [newname, newage] = newValif( newage > 23 ){console.log('發送請求')}}) */// 如果采用watchEffect,全自動的watch;watchEffect(()=>{if( person.age > 23 ){console.log('發送請求')}})</script><style scoped>button {margin: 10px;}
</style>

7. 標簽的ref屬性

利用refdocument.getElementById('')的區別在于,前者是局部的,不會受到整體的干擾;

<template><h2> 北京 </h2><h2 ref="title"> 師范 </h2><h2> 大學 </h2><button @click="output"> 點擊一下輸出樣式 </button>
</template><script lang="ts">export default {name: 'Person'}
</script><script setup lang="ts">import {ref, defineExpose} from 'vue'// 這里變量名和template中的ref中的變量名對應上了let title = ref()function output(){console.log(title.value)}// 在這里可以使調用該模塊的模塊得到該模塊的內容defineExpose({title})
</script><style scoped>/* 這里的scoped是局部樣式,防止和子文件樣式出現重復而全部修改無腦加上就好 */
</style>

8. 回顧TS中的接口_泛型_自定義類型

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713859.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713859.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713859.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JSON 文件里的 “$schema” 是干什么用的?

最近我在做一些前端項目&#xff0c;我發現有的配置文件&#xff0c;比如 .prettierrc.json 或者 tsconfig.json 里面都會看到一個 $schema 字段&#xff0c;有點好奇&#xff0c;就查了一下。 什么是 JSON Schema JSON Schema是一種基于JSON (JavaScript Object Notation) 的…

【Leetcode】2369. 檢查數組是否存在有效劃分

文章目錄 題目思路代碼結果 題目 題目鏈接 給你一個下標從 0 開始的整數數組 nums &#xff0c;你必須將數組劃分為一個或多個 連續 子數組。 如果獲得的這些子數組中每個都能滿足下述條件 之一 &#xff0c;則可以稱其為數組的一種 有效 劃分&#xff1a; 子數組 恰 由 2 個…

MATLAB算法實戰應用案例精講-【圖像處理】三維重建(最終篇)

目錄 前言 相機定標和三維重建 針孔相機模型和變形 三維成像 一、機器視覺系統組成

大數據智能化-長視頻領域

隨著數字化時代的到來&#xff0c;長視頻領域的發展迎來了新的機遇和挑戰。在這一背景下&#xff0c;大數據智能化技術的應用成為長視頻行業提升用戶體驗、優化運營管理的重要手段之一。本文將從優愛騰3大長視頻背景需求出發&#xff0c;分析靜態資源CDN、視頻文件存儲與分發、…

網絡安全、信息安全、計算機安全,有何區別?

這三個概念都存在&#xff0c;一般人可能會混為一談。 究竟它們之間是什么關系&#xff1f;并列&#xff1f;交叉&#xff1f; 可能從廣義上來說它們都可以用來表示安全security這樣一個籠統的概念。 但如果從狹義上理解&#xff0c;它們應該是有區別的&#xff0c;區別在哪呢&…

力扣hot100題解(python版36-40題)

36、二叉樹的中序遍歷 給定一個二叉樹的根節點 root &#xff0c;返回 它的 *中序 遍歷* 。 示例 1&#xff1a; 輸入&#xff1a;root [1,null,2,3] 輸出&#xff1a;[1,3,2]示例 2&#xff1a; 輸入&#xff1a;root [] 輸出&#xff1a;[]示例 3&#xff1a; 輸入&am…

tcping實用小工具

Tcping實用小工具命令詳解 一、tcping介紹 tcping&#xff1a;tcping命令基于tcp協議監控&#xff0c;可以從較低級別的協議獲得簡單的&#xff0c;可能不可靠的數據報服務。 原則上&#xff0c;TCP應該能夠在從容硬線連接到分組交換或電路交換網絡的各種通信系統之上操作。 …

【機器學習基礎】層次聚類-BIRCH聚類

&#x1f680;個人主頁&#xff1a;為夢而生~ 關注我一起學習吧&#xff01; &#x1f4a1;專欄&#xff1a;機器學習 歡迎訂閱&#xff01;相對完整的機器學習基礎教學&#xff01; ?特別提醒&#xff1a;針對機器學習&#xff0c;特別開始專欄&#xff1a;機器學習python實戰…

企業微信私有部署:實現高效溝通與信息安全

隨著移動互聯網的快速發展&#xff0c;企業微信作為一種高效、便捷的通訊工具&#xff0c;已經成為了眾多企業的首選。然而&#xff0c;對于一些對信息安全有特殊要求的大型企業而言&#xff0c;使用公有版企業微信并不能滿足其安全需求。因此&#xff0c;企業微信私有部署應運…

matplotlib.animation 3d姿態動畫

目錄 演示效果&#xff1a; 演示代碼&#xff1a; 保存為gif 演示效果&#xff1a; 演示代碼&#xff1a; import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib.animation import FuncAnimation# 定義人體關鍵點…

【c++入門】純粹的五位偶數

說明 純粹偶數指的是一個數的各個位都是偶數的數&#xff0c;比如&#xff1a;24686&#xff1b;請編程求出10000~n中&#xff0c;所有的五位的純粹偶數有多少個&#xff1f; 輸入數據 一個整數n&#xff08;n為一個5位的整數&#xff09; 輸出數據 一個整數&#xff0c;代…

網絡防御第6次作業

防病毒網關 按照傳播方式分類 病毒 病毒是一種基于硬件和操作系統的程序&#xff0c;具有感染和破壞能力&#xff0c;這與病毒程序的結構有關。病毒攻擊的宿主程序是病毒的棲身地&#xff0c;它是病毒傳播的目的地&#xff0c;又是下一次感染的出發點。計算機病毒感染的一般過…

Java基礎 - Stream 流:Stream API的中間操作

在上一篇博客中&#xff0c;我介紹了構建 Stream 流的多種方式&#xff0c;以及 Stream 流的特點和優勢。如果你還沒有閱讀&#xff0c;你可以點擊這里查看。 Java基礎 - Stream 流&#xff1a;構建流的多種方式 在這篇博客中&#xff0c;我將探索 Stream API 的中間操作&…

動態規劃(算法競賽、藍橋杯)--分組背包DP

1、B站視頻鏈接&#xff1a;E16 背包DP 分組背包_嗶哩嗶哩_bilibili #include <bits/stdc.h> using namespace std; const int N110; int v[N][N],w[N][N],s[N]; // v[i,j]:第i組第j個物品的體積 s[i]:第i組物品的個數 int f[N][N]; // f[i,j]:前i組物品&#xff0c;能放…

學習JavaEE的日子 Day21 枚舉

Day21 1.枚舉的引入 需求&#xff1a;編寫季節類&#xff08;Season&#xff09;&#xff0c;該類只有四個對象&#xff08;spring&#xff0c;summer&#xff0c;autumn&#xff0c;winter&#xff09; 概念&#xff1a;枚舉&#xff08;enum&#xff09;全稱為 enumeration&…

基帶信號處理設計原理圖:2-基于6U VPX的雙TMS320C6678+Xilinx FPGA K7 XC7K420T的圖像信號處理板

基于6U VPX的雙TMS320C6678Xilinx FPGA K7 XC7K420T的圖像信號處理板 綜合圖像處理硬件平臺包括圖像信號處理板2塊&#xff0c;視頻處理板1塊&#xff0c;主控板1塊&#xff0c;電源板1塊&#xff0c;VPX背板1塊。 一、板卡概述 圖像信號處理板包括2片TI 多核DSP處理…

Linux進程管理:(二)進程調度原語

文章說明&#xff1a; Linux內核版本&#xff1a;5.0 架構&#xff1a;ARM64 參考資料及圖片來源&#xff1a;《奔跑吧Linux內核》 Linux 5.0內核源碼注釋倉庫地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 進程調度的概念比較簡單&#xff0c…

Java學習筆記NO.17

T1&#xff1a;合并兩個排序好的整數數組 import java.util.Arrays;public class MergeSortedArrays {public static int[] mergeArrays(int[] arr1, int[] arr2) {int[] result new int[arr1.length arr2.length];int i 0, j 0, k 0;while (i < arr1.length &&am…

一個簡單的iOS天氣應用程序源碼

創建一個簡單的iOS天氣應用程序涉及到多個步驟&#xff0c;包括設置項目、編寫代碼和使用外部API。由于篇幅限制&#xff0c;我將提供一個基礎的示例&#xff0c;這個例子會展示如何創建一個簡單的UI&#xff0c;獲取用戶的當前位置&#xff0c;并從OpenWeatherMap API獲取天氣…

QPS 提升 10 倍!滴滴借助 StarRocks 物化視圖實現低成本精確去重

作者&#xff1a;滴滴 OLAP 開發工程師 劉雨飛 小編導讀&#xff1a; 滴滴于 2022 年引入了 StarRocks。經過一年多的努力&#xff0c;StarRocks 逐漸替代了原有技術棧&#xff0c;成為滴滴內部主要的 OLAP 引擎。截至 2023 年 12 月&#xff0c;滴滴已經成功建立了超過 40 個 …