vue3學(xué)習(xí)指導(dǎo)教程(附帶獲取屏幕可視區(qū)域?qū)捀?
一、從vue2到vue3
vue3.0 向下兼容 vue2.x 版本,優(yōu)化了主要核心雙向綁定原理和體積大小,并且更加友好的兼容 ts 語(yǔ)法。vue3是基于ES6新增的proxy代理實(shí)現(xiàn)的。
1.1 vue3的特點(diǎn) 新增了組合式api更接近原生js更加解耦(收到react啟發(fā))按需加載1.2 與vue2的區(qū)別
相同點(diǎn):生命周期基本一致、與vue2的模板語(yǔ)法基本一致、與vue2的選項(xiàng)基本一致data methods computed watch等。
不同點(diǎn):?jiǎn)?dòng)方式不同、全局方法掛載不一樣、vue3可以擁有多個(gè)根節(jié)點(diǎn)、生命周期卸載不同、vue3新增部分 setup()在組件掛載前運(yùn)行。
二、vue3的安裝使用
win+R,輸入cmd打開(kāi)命令窗口,按照以下步驟進(jìn)行安裝。
2.1 安裝腳手架
npm i @vue/cli -g
2.2 創(chuàng)建項(xiàng)目
vue create mv3 //mv3為項(xiàng)目名稱
2.3 手動(dòng)安裝

2.4 進(jìn)入并運(yùn)行項(xiàng)目服務(wù)器
cd /mv3 npm run serve
三、vue3生命周期
Vue3中繼續(xù)使用Vue2中的生命周期鉤子,但有有2個(gè)鉤子發(fā)生了改變 - beforeDestroy改名為beforeUnmount(卸載前) - destroyed改名為unmounted(卸載) 與vue2不同的是,vue3中是有了el模板之后才會(huì)去初始化,而vue2中是先created之后再去找模板。
Vue3生命周期示意圖如下:


四、vue3核心
4.1 setup組件
在vue2中,生命周期暴露在vue實(shí)例的選項(xiàng)上,使用時(shí)直接調(diào)用;vue3中使用生命周期鉤子,需要先導(dǎo)入項(xiàng)目,才能夠使用。
import {onMounted} from 'vue'4.2 ref創(chuàng)建響應(yīng)式數(shù)據(jù)
在 vue 3中,可以通過(guò)一個(gè)新的 ref 函數(shù)使任何響應(yīng)式變量在任何地方起作用 ;ref() 函數(shù)可以根據(jù)給定的值來(lái)創(chuàng)建一個(gè)響應(yīng)式的數(shù)據(jù)對(duì)象,返回值是一個(gè)對(duì)象,且只包含一個(gè) .value 屬性。在 setup() 函數(shù)內(nèi),由 ref() 創(chuàng)建的響應(yīng)式數(shù)據(jù)返回的是對(duì)象,所以需要用 .value 來(lái)訪問(wèn)。
使用ref可以創(chuàng)建一個(gè)包含響應(yīng)式數(shù)據(jù)的引用對(duì)象(reference對(duì)象,簡(jiǎn)稱ref對(duì)象),可以是基本類型、也可以是對(duì)象。
import { ref } from 'vue' //使用前先導(dǎo)入
const counter = ref(0)
console.log(counter) // { value: 0 }
console.log(counter.value) // 0
counter.value++
console.log(counter.value) // 14.3 reactive創(chuàng)建響應(yīng)式引用類型方法
定義一個(gè)對(duì)象類型的響應(yīng)式數(shù)據(jù),內(nèi)部基于ES6的Proxy實(shí)現(xiàn),通過(guò)代理對(duì)象操作源對(duì)象內(nèi)部數(shù)據(jù)進(jìn)行操作;返回一個(gè)對(duì)象的響應(yīng)式代理。
import {reactive} from 'vue'
// 定義一個(gè)引用類型的響應(yīng)式數(shù)據(jù)list 默認(rèn)是
const list = reactive(["vue","react","angular"])4.4 computed & methods
計(jì)算屬性關(guān)鍵詞: computed。
var twiceNum = computed(()=>num.value*2)
computed vs methods
可以使用 methods 來(lái)替代 computed,效果上兩個(gè)都是一樣的,但是 computed 是基于它的依賴緩存,只有相關(guān)依賴發(fā)生改變時(shí)才會(huì)重新取值。而使用 methods ,在重新渲染的時(shí)候,函數(shù)總會(huì)重新調(diào)用執(zhí)行。
methods: {
reversedMessage2: function () {
return this.message.split('').reverse().join('')
}
}4.5 watch監(jiān)聽(tīng)
watch(參數(shù)1,參數(shù)2) 默認(rèn)是懶偵聽(tīng)的,即僅在偵聽(tīng)源發(fā)生變化時(shí)才執(zhí)行回調(diào)函數(shù)。參數(shù)1是偵聽(tīng)源,參數(shù)2是回調(diào)函數(shù)。
案例:創(chuàng)建一個(gè)stepper組件(src/components/StepperCom.vue),在HomeView中引入(src/views/HomeView.vue)
src/components/StepperCom.vue
<template>
<span>
<button @click="count--">-</button>
<input type="text" style="width:90px;" v-model="count">
<button @click="count++">+</button>
</span>
</template>
<script setup>
//defineProps定義props
import {defineProps,ref,watch,defineEmits,watchEffect,defineExpose} from 'vue'
//定義props傳入?yún)?shù)
const props=defineProps({
//類型為數(shù)字或者字符串,默認(rèn)值為1
value:{type:[Number,String],default:1}
})
//定義一個(gè)響應(yīng)式對(duì)象初始值為props.value
const count=ref(props.value);
//定義事件發(fā)送器
var emits=defineEmits(["input"]);
//監(jiān)聽(tīng)count的變化
watch(count,()=>{
//發(fā)送一個(gè)inout事件 事件值為count的value
emits("input",count.value);
})
//只要watchEffect中出現(xiàn)了數(shù)據(jù),數(shù)據(jù)發(fā)生變化都會(huì)被執(zhí)行
watchEffect(()=>{
count.value=props.value;
})
//defineExpose規(guī)定了組件哪些值可以被引用獲取
defineExpose({count})
</script>src/views/HomeView.vue
<template>
<div>
<h1>setup</h1>
<button @click="num++">{{num}}</button>
<stepper-com :value="10" @input="num=$event"></stepper-com>
</div>
</template>
<script setup>
//使用setup可以簡(jiǎn)寫(xiě)(不用導(dǎo)出,組件不用注冊(cè))
import StepperCom from '@/components/StepperCom.vue'
import {ref} from 'vue'
const num=ref(5)
</script>五、案例(獲取可視區(qū)域?qū)捀邤?shù)據(jù))
src/utils/utils.js
import {ref,onMounted,onBeforeUnmount} from 'vue'
export function useWinSize(){
const size=ref({width:1920,height:1080});
//窗口變化時(shí)更新size
function onResize(){
size.value={
//用窗口的最新寬高更新width和heigth
width:window.innerWidth,
height:window.innerHeight
}
}
//組件掛載完畢更新size
onMounted(()=>{
window.addEventListener("resize",onResize);
})
//組件要卸載的時(shí)候移除事件監(jiān)聽(tīng)
onBeforeUnmount(() => {
window.removeEventListener("resize",onResize);
})
return size;
}src/views/HomeView.vue
<template>
<div>
<h1>可視區(qū)域?qū)挾扰c高度</h1>
<p>{{size}}</p>
</div>
</template>
<script setup>
//導(dǎo)入useWinSize方法
import {useWinSize} from '@/utils/utils.js'
//方法執(zhí)行,返回一個(gè)對(duì)象size
const size=useWinSize();
</script>總結(jié)
到此這篇關(guān)于vue3學(xué)習(xí)的文章就介紹到這了,更多相關(guān)vue3獲取屏幕可視區(qū)域?qū)捀邇?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue 實(shí)現(xiàn)剪裁圖片并上傳服務(wù)器功能
這篇文章主要介紹了vue 實(shí)現(xiàn)剪裁圖片并上傳服務(wù)器功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-03-03
vue項(xiàng)目之頁(yè)面class不生效問(wèn)題及解決
這篇文章主要介紹了vue項(xiàng)目之頁(yè)面class不生效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
解決Vue axios post請(qǐng)求,后臺(tái)獲取不到數(shù)據(jù)的問(wèn)題方法
今天小編就為大家分享一篇解決Vue axios post請(qǐng)求,后臺(tái)獲取不到數(shù)據(jù)的問(wèn)題方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
vue框架和react框架的區(qū)別以及各自的應(yīng)用場(chǎng)景使用
這篇文章主要介紹了vue框架和react框架的區(qū)別以及各自的應(yīng)用場(chǎng)景使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
Vue3實(shí)現(xiàn)動(dòng)態(tài)面包屑的代碼示例
這篇文章主要給大家介紹一下Vue3動(dòng)態(tài)面包屑是如何實(shí)現(xiàn)的,實(shí)現(xiàn)思路又是什么,以及發(fā)給大家介紹一下面包屑的功能,文章通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07
在vue項(xiàng)目中配置你自己的啟動(dòng)命令和打包命令方式
這篇文章主要介紹了在vue項(xiàng)目中配置你自己的啟動(dòng)命令和打包命令方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04

