Vue3基礎使用

目錄

一、創建Vue3工程

(一)、cli

(二)、vite

二、常用Composition API

(一)、setup函數

(二)、ref函數

(三)、reactive函數

(四)、setup注意事項

(五)、計算屬性

(六)、watch

(七)、watchEffect函數

(八)、生命周期

1、以配置項的形式使用生命周期鉤子

2、組合式api(在setup中使用)

(九)、自定義hook

(十)、toRef、toRefs

三、其他Composition API

(一)、shallowReactive、shallowRef

(二)、readonly 與 shallowReadonly

(三)、toRaw 與 markRaw

(四)、自定義ref(customRef)

(五)、provide、inject

(六)、響應式數據的判斷

五、新的組件

(一)、Fragment

(二)、Teleport

(三)、Suspense

六、Vue3的其他改變

(一)、全局API的轉移

(二)、data

(三)、過度類名更改

(四)、keyCode

(五)、移除v-on.native

(六)、移除過濾器


一、創建Vue3工程

(一)、cli

創建一個項目 | Vue CLI🛠? Vue.js 開發的標準工具icon-default.png?t=N7T8https://cli.vuejs.org/zh/guide/creating-a-project.html#vue-create

##查看@vue/c1i版本,確保@vue/c1i版本在4.5.8以上
vue --version
#安裝或者升級你的@vue/cli
npm install -g @vue/cli##創建
vue create 項目名
##啟動
cd 項目名
npm run serve

(二)、vite

快速上手 | Vue.jsVue.js - 漸進式的 JavaScript 框架icon-default.png?t=N7T8https://v3.cn.vuejs.org/guide/installation.html#viteVite中文網下一代前端開發與構建工具icon-default.png?t=N7T8https://vitejs.cn

##創建工程
npm init vite-app 項目名
#進入工程目錄
cd 項目名
##安裝依賴
npm i
##運行
npm run dev

二、常用Composition API

(一)、setup函數

簡單演示,下面的寫法不對,丟失了響應式。?

<template><h2>我的名字是{{ name }},年齡是{{ age }}</h2>
</template><script>
export default {name: "HelloWorld",setup() {let name = "jack";let age = 18;function sayHello() {console.log("hello");}return {name,age,sayHello,};},
};
</script>

(二)、ref函數

// 示例,執行changeInfo函數修改信息,響應式數據
import {ref} from 'vue'
export default {name: 'App',setup(){let name = ref('LHD')let age = ref(19)let job = ref({type:'前端工程師',salary:'15k'})function changeInfo(){name.value = 'DHL',age.value = '20',job.value.type = '搬磚工程師',job.value.salary = '10k'}return{name,age,job,changeInfo}}
}

(三)、reactive函數

// 先引入reactive
import {reactive} from 'vue'
// 2的示例,setup函數中改成這樣
let person = reactive({name:'LHD',age:'19',job:{type:'工程師',salary:'20k'},hobby:['Study','Video Game']
})
function changeInfo(){person.name = 'DHL',person.age = '20',person.job.type = '搬磚工程師',person.job.salary = '10k',person.hobby[1] = 'fly'
}
return{person,changeInfo
}

(四)、setup注意事項

(五)、計算屬性

(六)、watch

//情況一:監視ref定義的響應式數據
watch(sum,(newValue,oldValue)=>{console.log('sum變化了',newValue,oldValue)
},{immediate:true})//情況二:監視多個ref定義的響應式數據
watch([sum,msg],(newValue,oldValue)=>{console.log('sum或msg變化了',newValue,oldValue)
}) /* 情況三:監視reactive定義的響應式數據若watch監視的是reactive定義的響應式數據,則無法正確獲得oldValue!!若watch監視的是reactive定義的響應式數據,則強制開啟了深度監視 
*/
watch(person,(newValue,oldValue)=>{console.log('person變化了',newValue,oldValue)
},{immediate:true,deep:false}) //此處的deep配置不再奏效//情況四:監視reactive定義的響應式數據中的某個屬性
watch(()=>person.job,(newValue,oldValue)=>{console.log('person的job變化了',newValue,oldValue)
},{immediate:true,deep:true}) //情況五:監視reactive定義的響應式數據中的某些屬性
watch([()=>person.job,()=>person.name],(newValue,oldValue)=>{console.log('person的job變化了',newValue,oldValue)
},{immediate:true,deep:true})//特殊情況
watch(()=>person.job,(newValue,oldValue)=>{console.log('person的job變化了',newValue,oldValue)
},{deep:true}) //此處由于監視的是reactive素定義的對象中的某個屬性,所以deep配置有效

(七)、watchEffect函數

//watchEffect所指定的回調中用到的數據只要發生變化,則直接重新執行回調。
watchEffect(()=>{const x1 = sum.valueconst x2 = person.ageconsole.log('watchEffect配置的回調執行了')
})

(八)、生命周期

1、以配置項的形式使用生命周期鉤子

與setup平級

2、組合式api(在setup中使用)

(九)、自定義hook

src/hooks/usePoint.js

///得到鼠標點的apiimport { reactive, onMounted, onBeforeUnmount } from "vue";export default function usePoint(){//響應式數據let point = reactive({x: 0,y: 0});//方法const savePoint = event => {console.log(event.pageX, event.pageY);point.x = event.pageX;point.y = event.pageY;};//生命周期onMounted(() => {window.addEventListener('click', savePoint)});onBeforeUnmount(() => {//在卸載之前取消事件的監聽window.removeEventListener('click', savePoint);});return point;
}

?src/components/Demo.vue

<template><h1>當前求和為:{{ sum }}</h1><button @click="sum++">點我加一</button><hr/><h2>當前點擊時鼠標的坐標為x:{{ point.x }}, y:{{ point.y }}</h2>
</template><script>
import {ref} from 'vue';
import usePoint from "../hooks/usePoint";
export default {name: 'Demo',setup(){let sum = ref(0);//復用自定義hooksconst point = usePoint();//返回一個對象return {sum,point}},
}
</script><style>
</style>

(十)、toRef、toRefs

<template><h4>{{ person }}</h4><h2>姓名:{{ name }}</h2><h2>年齡:{{ age }}</h2><h2>薪資:{{ salary }}K</h2><button @click="name = name + '~'">修改姓名</button><button @click="age++">增長年齡</button><button @click="salary++">增長薪資</button>
</template><script>
import { ref, reactive, toRef, toRefs} from 'vue';
export default {name: 'Demo',setup(){let person = reactive({name: '張三',age: 18,job:{j1:{salary: 20}}});//ref類型的值在模板里使用是不需要.value來取的const name1 = person.name //注意輸出字符串,并不是響應式的數據console.log('@@@@@', name1);const name2 = toRef(person,name); //RefImpl 這里的name2與person.name是完全一模一樣的(你改這里的name2與你改person.name是一碼事),且數據還是響應式的console.log('####', name2);const x = toRefs(person);console.log(x);//返回一個對象(toRef是引用 name就是person.name且為響應式)//toRef處理一個,而toRefs處理一群//大白話:toRef(s)就是方便我們把響應式數據(ref,reactive)展開丟出去,方便在模版中應用return {person,// name: toRef(person, "name"),// age: toRef(person, "age"),// salary: toRef(person.job.j1, "salary")...toRefs(person),salary: toRef(person.job.j1, 'salary')  //toRef可以與toRefs連用,更加方便};//注意千萬不能這樣寫//一旦這樣寫就與元數據分離了,改name不會引起person.name的變化(因為ref把name值包裝成了一個refImpl對象)// return {//   person,//   name: ref(person.name),//   age: ref(person.age),//   salary: ref(person.job.j1.salary)// };}
}
</script><style>
</style>

三、其他Composition API

(一)、shallowReactive、shallowRef

(二)、readonly 與 shallowReadonly

(三)、toRaw 與 markRaw

<template><h2>當前求和為:{{ sum }}</h2><button @click="sum++">sum+1</button><hr/><h2>姓名:{{ name }}</h2><h2>年齡:{{ age }}</h2><h2>薪資:{{ job.j1.salary }}K</h2><h3 v-show="person.car">座駕信息:{{ person.car }}</h3><button @click="name = name + '~'">修改姓名</button><button @click="age++">增長年齡</button><button @click="job.j1.salary++">增長薪資</button><button @click="showRawPerson">輸出最原始的person</button><button @click="addCar">給人添加一臺車</button><button @click="person.car && (person.car.name +='!') ">換車名</button><button @click="changePrice">換價格</button>
</template><script>
import {markRaw, reactive, ref, toRaw, toRefs} from 'vue';export default {name: 'Demo',setup(){let sum = ref(0);let person = reactive({name: '張三',age: 18,job:{j1:{salary: 20}}});//ref reactive(響應式)const showRawPerson = () => {const  p = toRaw(person);// console.log(person); //proxy代理對象 Proxy {....}p.age++; //注意此時頁面不會再發生變化了,普普通通的對象不是響應式console.log(p); //原始對象數據  {....}// const sum  = toRaw(sum);// console.log(sum); //undefined //這條路走不通,toRaw只處理reactive對象}const addCar = () => {person.car = markRaw({name: 'benz',price: 40}); //在響應式的對象身上添加任何屬性都是響應式的,經過markRaw一包裝就變成最原始的數據就不會再做響應}const changePrice = () => {person.car?.price && person.car.price++;console.log(person?.car?.price);}return {sum,person,...toRefs(person),showRawPerson,addCar,changePrice};}
}
</script><style>
</style>

(四)、自定義ref(customRef)

需求

<template><input type="text" v-model="keyword"><h3>{{keyword}}</h3>
</template><script>import {ref,customRef} from 'vue'export default {name:'Demo',setup(){// let keyword = ref('hello') //使用Vue準備好的內置ref//自定義一個myReffunction myRef(value,delay){let timer//通過customRef去實現自定義return customRef((track,trigger)=>{return{get(){track() //告訴Vue這個value值是需要被“追蹤”的return value},set(newValue){clearTimeout(timer)timer = setTimeout(()=>{value = newValuetrigger() //告訴Vue去更新界面},delay)}}})}let keyword = myRef('hello',500) //使用程序員自定義的refreturn {keyword}}}
</script>

(五)、provide、inject

(六)、響應式數據的判斷

  1. isRef: 檢查一個值是否為一個 ref 對象
  2. isReactive: 檢查一個對象是否是由 reactive 創建的響應式代理
  3. isReadonly: 檢查一個對象是否是由 readonly 創建的只讀代理
  4. isProxy: 檢查一個對象是否是由 reactive 或者 readonly 方法創建的代理

五、新的組件

(一)、Fragment

  • 在Vue2中: 組件必須有一個根標簽
  • 在Vue3中: 組件可以沒有根標簽, 內部會將多個標簽包含在一個Fragment虛擬元素中
  • 好處: 減少標簽層級, 減小內存占用

(二)、Teleport

什么是Teleport?——?Teleport?是一種能夠將我們的組件html結構移動到指定位置的技術。

(三)、Suspense

六、Vue3的其他改變

(一)、全局API的轉移

Vue 2.x 有許多全局 API 和配置。

  • 例如:注冊全局組件、注冊全局指令等

//注冊全局組件
Vue.component('MyButton', {data: () => ({count: 0}),template: '<button @click="count++">Clicked {{ count }} times.</button>'
})//注冊全局指令
Vue.directive('focus', {inserted: el => el.focus()
}

Vue3.0中對這些API做出了調整:

  • 將全局的API,即:Vue.xxx調整到應用實例(app)上

(二)、data

data選項應始終被聲明為一個函數。

(三)、過度類名更改

Vue2.x寫法

.v-enter,
.v-leave-to {opacity: 0;
}
.v-leave,
.v-enter-to {opacity: 1;
}

Vue3.x寫法

.v-enter-from,
.v-leave-to {opacity: 0;
}.v-leave-from,
.v-enter-to {opacity: 1;
}

(四)、keyCode

移除?keyCode作為 v-on 的修飾符,同時也不再支持config.keyCodes

(五)、移除v-on.native

移除?v-on.native修飾符

父組件中綁定事件

<my-componentv-on:close="handleComponentEvent"v-on:click="handleNativeClickEvent"
/>

子組件中聲明自定義事件

<script>export default {emits: ['close']}
</script>

(六)、移除過濾器

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

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

相關文章

kafka-簡單代碼實現生產者消費者

生產者代碼&#xff1a; package com.kafka.test;import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.common.seriali…

【機器學習-10】 | Scikit-Learn工具包進階指南:Scikit-Learn工具包之支持向量機模塊研究

&#x1f3a9; 歡迎來到技術探索的奇幻世界&#x1f468;?&#x1f4bb; &#x1f4dc; 個人主頁&#xff1a;一倫明悅-CSDN博客 ?&#x1f3fb; 作者簡介&#xff1a; C軟件開發、Python機器學習愛好者 &#x1f5e3;? 互動與支持&#xff1a;&#x1f4ac;評論 &…

高考填報志愿攻略,5個步驟選專業和院校

在高考完畢出成績的時候&#xff0c;很多人會陷入迷茫中&#xff0c;好像努力了這么多年&#xff0c;卻不知道怎么規劃好未來。怎么填報志愿合適&#xff1f;在填報志愿方面有幾個內容需要弄清楚&#xff0c;按部就班就能找到方向&#xff0c;一起來了解一下正確的步驟吧。 第…

入局AI手機 蘋果公布Apple Intelligence

日前&#xff0c;蘋果WWDC 2024如期召開。在這持續1個小時44分鐘的開發者大會上&#xff0c;蘋果在前一個小時里更新了iOS、iPadOS、MacOS等操作系統&#xff0c;而且還首次更新了visionOS。余下的時間全部留給了蘋果的“AI大禮包”——Apple Intelligence&#xff08;蘋果智能…

請說明Thread類中run和start的區別,從方法的區別,及運行結果的區別分別說明

方法本身的區別 start() 方法&#xff1a; run()方法是Thread類的一個普通方法&#xff0c;它包含了線程要執行的代碼。當你直接調用一個線程的run()方法&#xff08;如myThread.run()&#xff09;&#xff0c;你實際上是在當前線程&#xff08;通常是主線程&#xff09;中執行…

PointCloudLib-濾波模塊(Filtering)-使用參數化模型投影點

在本教程中,我們將學習如何將點投影到參數化模型上 (例如,平面、球體等)。參數模型通過一組 系數 – 在平面的情況下,通過其方程:ax + by + cz + d = 0。 代碼 #include <iostream> #include <pcl/point_cloud.h> // for PointCloud #include <pcl/point…

mysql是什么

mysql是什么 是DBMS軟件系統&#xff0c;并不是一個數據庫&#xff0c;管理數據庫 DBMS相當于用戶和數據庫之間的橋梁&#xff0c;有超過300種不同的dbms系統 mysql是關系型數據庫&#xff0c;關系型數據庫存儲模型很想excel&#xff0c;用行和列組織數據 sql是一門編程語言…

關于ip地址的網頁無法訪問navigator的gpu、媒體、藍牙等設備的解決方法

在使用threejs的WebGPURenderer渲染器時&#xff0c;發現localhost以及127.0.0.1才能訪問到navigator.gpu&#xff0c;直接使用ip會變成undefined,原因是為了用戶的隱私安全&#xff0c;只能在安全的上下文中使用&#xff0c;非安全的上下文就會是undefined&#xff0c;安全上下…

谷歌云(GCP)4門1453元最熱門證書限時免費考

谷歌云(GCP)最新活動&#xff0c;完成免費官方課程&#xff0c;送4門最熱門考試免費考試券1張(每張價值200刀/1453元)&#xff0c;這4門也包括最近大熱的AI/ML考試&#xff0c;非常值得學習和參加&#xff0c;活動7/17截止 谷歌云是全球最火的三大云計算廠商(前兩名AWS, Azure…

MySQL索引優化解決方案--索引失效(3)

索引失效情況 最佳左前綴法則&#xff1a;如果索引了多列&#xff0c;要遵循最左前綴法則&#xff0c;指的是查詢從索引的最左前列開始并且不跳過索引中的列。不在索引列上做任何計算、函數操作&#xff0c;會導致索引失效而轉向全表掃描存儲引擎不能使用索引中范圍條件右邊的…

【Linux】進程信號_1

文章目錄 八、進程信號1.信號 未完待續 八、進程信號 1.信號 信號和信號量之間沒有任何關系。信號是Linux系統提供的讓用戶/進程給其他進程發送異步信息的一種方式。 常見信號&#xff1a; 當信號產生時&#xff0c;可選的處理方式有三種&#xff1a;①忽略此信號。②執行該…

小程序注冊

【 一 】小程序注冊 微信公眾平臺 https://mp.weixin.qq.com/ https://mp.weixin.qq.com/注冊 郵箱激活 小程序賬戶注冊 微信小程序配置 微信小程序開發流程 添加項目成員 【 二 】云服務 lass 基礎設施服務&#xff08;組裝機&#xff09; 你買了一大堆的電腦配件&#x…

AI早班車2024.6.25

全球AI新聞速遞 1.高通&#xff1a;開放 AI 模型&#xff0c;幫助開發者打造驍龍 X Elite 平臺智能應用。 2.OpenAI&#xff1a;收購數據庫分析公司Rockset。 3.大眾海外版車型支持 ChatGPT。 4.樂聚夸父人形機器人&#xff0c;搭載華為云盤古具身智能大模型。 5.微軟正努力…

Day45

Day45 jQuery動畫 顯示和隱藏 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><script src"js/jquery-1.8.2.js" type"text/javascript" charset"utf-8"></script&…

Linux系統移動光標類命令

天行健&#xff0c;君子以自強不息&#xff1b;地勢坤&#xff0c;君子以厚德載物。 每個人都有惰性&#xff0c;但不斷學習是好好生活的根本&#xff0c;共勉&#xff01; 文章均為學習整理筆記&#xff0c;分享記錄為主&#xff0c;如有錯誤請指正&#xff0c;共同學習進步。…

iHRM人力資源管理系統測試用例集

1、初始化項目環境 1&#xff09;初始化用例集 2&#xff09;初始化環境&#xff1a;測試環境&#xff0c;生產環境&#xff08;不同環境對應不同的url&#xff0c;在進行用例集測試之前一定要指定環境&#xff09; 3&#xff09;單接口模塊 從Excel表格的測試用例文檔中提…

云南省森林管理新篇章:可視化大屏引領綠色智慧革命

在云南省這片綠意盎然的土地上&#xff0c;森林不僅是自然的寶藏&#xff0c;更是生態的守護者。 想象一下&#xff0c;站在巨大的屏幕前&#xff0c;云南省的森林分布、生長狀況、病蟲害情況等信息一目了然&#xff0c;仿佛擁有了一雙能夠洞察森林奧秘的“智慧眼”。這正是森林…

輸入/輸出文字

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在海龜繪圖中&#xff0c;也可以輸入或者輸出文字&#xff0c;下面分別進行介紹。 1 輸出文字 輸出文字可以使用write()方法來實現&#xff0c;語…

使用Python實現手勢替代鼠標操作并生成.exe可執行文件

使用Python實現手勢替代鼠標操作并生成.exe可執行文件 在現代計算機交互中&#xff0c;手勢識別作為一種自然的人機交互方式&#xff0c;逐漸受到人們的關注。本文將介紹如何使用Python實現手勢替代鼠標操作&#xff0c;并生成一個可執行的.exe文件&#xff0c;使得這項技術更…