Vue基礎(chǔ)語法知識(shí)梳理下篇
計(jì)算屬性
- 定義:要用的屬性不存在,要通過已有屬性計(jì)算得來
- 原理:底層借助了Objcet.defineProperty方法提供的getter和setter
get函數(shù)什么時(shí)候執(zhí)行?
(1).初次讀取時(shí)會(huì)執(zhí)行一次
(2).當(dāng)依賴的數(shù)據(jù)發(fā)生改變時(shí)會(huì)被再次調(diào)用
注:
- 計(jì)算屬性最終會(huì)出現(xiàn)在vm上,直接讀取使用即可
- 如果計(jì)算屬性要被修改,那必須寫set函數(shù)去響應(yīng)修改,且set中要引起計(jì)算時(shí)依賴的數(shù)據(jù)發(fā)生改變
計(jì)算屬性完整版寫法
<!-- 準(zhǔn)備好一個(gè)容器-->
<div id="root">
姓:<input type="text" v-model="firstName">
名:<input type="text" v-model="lastName">
全名:<span>{{fullName}}</span>
</div>
<script>
const vm = new Vue({
el:'#root',
data:{
firstName:'張',
lastName:'三',
}
computed:{
fullName:{
//get有什么作用?當(dāng)有人讀取fullName時(shí),get就會(huì)被調(diào)用,且返回值就作為fullName的值
//get什么時(shí)候調(diào)用?1.初次讀取fullName時(shí)。2.所依賴的數(shù)據(jù)發(fā)生變化時(shí)。
get(){
console.log('get被調(diào)用了')
return this.firstName + '-' + this.lastName
},
//set什么時(shí)候調(diào)用? 當(dāng)fullName被修改時(shí)。
// 可以主動(dòng)在控制臺(tái)修改fullName來查看情況
set(value){
console.log('set',value)
const arr = value.split('-')
this.firstName = arr[0]
this.lastName = arr[1]
}
}
}
})
</script>
鍵盤事件
鍵盤事件語法:@keydown,@keyup
Vue中常用的按鍵別名:
| 回車 | enter |
| 刪除 | delete (捕獲“刪除”和“退格”鍵) |
| 退出 | esc |
| 換行 | tab (特殊,必須配合keydown去使用) |
| 空格 | space |
| 上 | up |
| 下 | down |
| 左 | left |
| 右 | right |
Vue未提供別名的按鍵,可以使用按鍵原始的key值去綁定,但注意要轉(zhuǎn)為kebab-case(短橫線命名)
系統(tǒng)修飾鍵(用法特殊):ctrl、alt、shift、meta
- 配合keyup使用:按下修飾鍵的同時(shí),再按下其他鍵,隨后釋放其他鍵,事件才被觸發(fā)。
- 配合keydown使用:正常觸發(fā)事件。
也可以使用keyCode去指定具體的按鍵(不推薦)
Vue.config.keyCodes.自定義鍵名 = 鍵碼,可以去定制按鍵別名
監(jiān)視屬性
監(jiān)視屬性watch:
當(dāng)被監(jiān)視的屬性變化時(shí), 回調(diào)函數(shù)自動(dòng)調(diào)用
監(jiān)視的屬性必須存在,才能進(jìn)行監(jiān)視
監(jiān)視的兩種寫法:
(1).new Vue時(shí)傳入watch配置
(2).通過vm.$watch監(jiān)視
<!-- 準(zhǔn)備好一個(gè)容器-->
<div id="root">
<h2>今天天氣很{{ info }}</h2>
<button @click="changeWeather">切換天氣</button>
</div>
<script>
const vm = new Vue({
el:'#root',
data:{
isHot:true,
},
computed:{
info(){
return this.isHot ? '炎熱' : '涼爽'
}
},
methods: {
changeWeather(){
this.isHot = !this.isHot
}
},
watch:{
isHot:{
immediate: true, // 初始化時(shí)讓handler調(diào)用一下
// handler什么時(shí)候調(diào)用?當(dāng)isHot發(fā)生改變時(shí)。
handler(newValue, oldValue){
console.log('isHot被修改了',newValue,oldValue)
}
}
}
})
</script>深度監(jiān)視:
(1).Vue中的watch默認(rèn)不監(jiān)測對象內(nèi)部值的改變(一層)
(2).配置deep:true可以監(jiān)測對象內(nèi)部值改變(多層)
備注:
Vue自身可以監(jiān)測對象內(nèi)部值的改變,但Vue提供的watch默認(rèn)不可以
使用watch時(shí)根據(jù)數(shù)據(jù)的具體結(jié)構(gòu),決定是否采用深度監(jiān)視
<!-- 準(zhǔn)備好一個(gè)容器-->
<div id="root">
{{numbers.c.d.e}}
</div>
<script type="text/javascript">
Vue.config.productionTip = false
const vm = new Vue({
el:'#root',
data:{
numbers:{
c:{
d:{
e:100
}
}
}
},
watch:{
//監(jiān)視多級結(jié)構(gòu)中某個(gè)屬性的變化
/* 'numbers.a':{
handler(){
console.log('a被改變了')
}
} */
//監(jiān)視多級結(jié)構(gòu)中所有屬性的變化
numbers:{
deep:true,
handler(){
console.log('numbers改變了')
}
}
}
});
</script>
computed和watch之間的區(qū)別:
- computed能完成的功能,watch都可以完成
- watch能完成的功能,computed不一定能完成,例如:watch可以進(jìn)行異步操作
兩個(gè)重要的小原則:
1.所被Vue管理的函數(shù),最好寫成普通函數(shù),這樣this的指向才是vm 或 組件實(shí)例對象
2.所有不被Vue所管理的函數(shù)(定時(shí)器的回調(diào)函數(shù)、ajax的回調(diào)函數(shù)等、Promise的回調(diào)函數(shù)),最好寫成箭頭函數(shù),這樣this的指向才是vm 或 組件實(shí)例對象
綁定樣式
class樣式
寫法::class=“xxx” xxx可以是字符串、對象、數(shù)。
所以分為三種寫法,字符串寫法,數(shù)組寫法,對象寫法
(1)字符串寫法
字符串寫法適用于:類名不確定,要?jiǎng)討B(tài)獲取。
<style>
.normal{
background-color: skyblue;
}
</style>
<!-- 準(zhǔn)備好一個(gè)容器-->
<div id="root">
<!-- 綁定class樣式--字符串寫法,適用于:樣式的類名不確定,需要?jiǎng)討B(tài)指定 -->
<div class="basic" :class="mood" @click="changeMood">{{name}}</div>
</div>
<script>
const vm = new Vue({
el:'#root',
data:{
mood:'normal'
}
})
</script>
(2)數(shù)組寫法
數(shù)組寫法適用于:要綁定多個(gè)樣式,個(gè)數(shù)不確定,名字也不確定。
<style>
.atguigu1{
background-color: yellowgreen;
}
.atguigu2{
font-size: 30px;
text-shadow:2px 2px 10px red;
}
.atguigu3{
border-radius: 20px;
}
</style>
<!-- 準(zhǔn)備好一個(gè)容器-->
<div id="root">
<!-- 綁定class樣式--數(shù)組寫法,適用于:要綁定的樣式個(gè)數(shù)不確定、名字也不確定 -->
<div class="basic" :class="classArr">{{name}}</div>
</div>
<script>
const vm = new Vue({
el:'#root',
data:{
classArr: ['atguigu1','atguigu2','atguigu3']
}
})
</script>
(3)對象寫法
對象寫法適用于:要綁定多個(gè)樣式,個(gè)數(shù)確定,名字也確定,但不確定用不用。
<style>
.atguigu1{
background-color: yellowgreen;
}
.atguigu2{
font-size: 30px;
text-shadow:2px 2px 10px red;
}
</style>
<!-- 準(zhǔn)備好一個(gè)容器-->
<div id="root">
<!-- 綁定class樣式--對象寫法,適用于:要綁定的樣式個(gè)數(shù)確定、名字也確定,但要?jiǎng)討B(tài)決定用不用 -->
<div class="basic" :class="classObj">{{name}}</div>
</div>
<script>
const vm = new Vue({
el:'#root',
data:{
classObj:{
atguigu1:false,
atguigu2:false,
}
}
})
</script>
style樣式
有兩種寫法,對象寫法,數(shù)組寫法
(1)對象寫法
<!-- 準(zhǔn)備好一個(gè)容器-->
<div id="root">
<!-- 綁定style樣式--對象寫法 -->
<div class="basic" :style="styleObj">{{name}}</div>
</div>
<script>
const vm = new Vue({
el:'#root',
data:{
styleObj:{
fontSize: '40px',
color:'red',
}
}
})
</script>
(3)數(shù)組寫法
<!-- 準(zhǔn)備好一個(gè)容器-->
<script>
const vm = new Vue({
el:'#root',
data:{
styleArr:[
{fontSize: '40px',
color:'blue',
},{
backgroundColor:'gray'
}
]
}
})
</script>
條件渲染
v-if
(1).v-if=“表達(dá)式”
(2).v-else-if=“表達(dá)式”
(3).v-else=“表達(dá)式”
適用于:切換頻率較低的場景
特點(diǎn):不展示的DOM元素直接被移除
注意:v-if可以和:v-else-if、v-else一起使用,但要求結(jié)構(gòu)不能被“打斷”
v-show
- 寫法:v-show=“表達(dá)式”
- 適用于:切換頻率較高的場景
- 特點(diǎn):不展示的DOM元素未被移除,僅僅是使用樣式隱藏掉(display:none)
備注:使用v-if的時(shí),元素可能無法獲取到,而使用v-show一定可以獲取到
v-if 是實(shí)打?qū)嵉馗淖僤om元素,v-show 是隱藏或顯示dom元素
<!-- 準(zhǔn)備好一個(gè)容器-->
<div id="root">
<!-- 使用v-show做條件渲染 -->
<h2 v-show="false">歡迎來到{{name}}</h2>
<h2 v-show="1 === 1">歡迎來到{{name}}</h2>
</div>
列表渲染
v-for指令
- 用于展示列表數(shù)據(jù)
- 語法:v-for=“(item, index) in xxx” :key=“yyy”
- 可遍歷:數(shù)組、對象、字符串(用的很少)、指定次數(shù)(用的很少)
<div id="root">
<!-- 遍歷數(shù)組 -->
<h2>人員列表(遍歷數(shù)組)</h2>
<ul>
<li v-for="(p,index) of persons" :key="index">
{{p.name}}-{{p.age}}
</li>
</ul>
<!-- 遍歷對象 -->
<h2>汽車信息(遍歷對象)</h2>
<ul>
<li v-for="(value,k) of car" :key="k">
{{k}}-{{value}}
</li>
</ul>
<!-- 遍歷字符串 -->
<h2>測試遍歷字符串(用得少)</h2>
<ul>
<li v-for="(char,index) of str" :key="index">
{{char}}-{{index}}
</li>
</ul>
<!-- 遍歷指定次數(shù) -->
<h2>測試遍歷指定次數(shù)(用得少)</h2>
<ul>
<li v-for="(number,index) of 5" :key="index">
{{index}}-{{number}}
</li>
</ul>
</div>
<script>
const vm = new Vue({
el:'#root',
data: {
persons: [
{ id: '001', name: '張三', age: 18 },
{ id: '002', name: '李四', age: 19 },
{ id: '003', name: '王五', age: 20 }
],
car: {
name: '奧迪A8',
price: '70萬',
color: '黑色'
},
str: 'hello'
}
})
</script>
vue監(jiān)測data中的數(shù)據(jù)
<!-- 準(zhǔn)備好一個(gè)容器-->
<div id="root">
<h2>學(xué)校名稱:{{name}}</h2>
<h2>學(xué)校地址:{{address}}</h2>
</div>
<script type="text/javascript">
Vue.config.productionTip = false //阻止 vue 在啟動(dòng)時(shí)生成生產(chǎn)提示。
const vm = new Vue({
el:'#root',
data:{
name:'浙江師范大學(xué)',
address:'金華',
student:{
name:'tom',
age:{
rAge:40,
sAge:29,
},
friends:[
{name:'jerry',age:35}
]
}
}
})
</script>
Vue.set 的使用
Vue.set(target,propertyName/index,value) 或
vm.$set(target,propertyName/index,value)
用法:
向響應(yīng)式對象中添加一個(gè) property,并確保這個(gè)新 property 同樣是響應(yīng)式的,且觸發(fā)視圖更新。它必須用于向響
應(yīng)式對象上添加新 property,因?yàn)?Vue 無法探測普通的新增 property (比如 vm.myObject.newProperty = 'hi')
//代碼
<!-- 準(zhǔn)備好一個(gè)容器-->
<div id="root">
<h1>學(xué)生信息</h1>
<button @click="addSex">添加性別屬性,默認(rèn)值:男</button> <br/>
</div>
<script type="text/javascript">
Vue.config.productionTip = false //阻止 vue 在啟動(dòng)時(shí)生成生產(chǎn)提示。
const vm = new Vue({
el:'#root',
data:{
student:{
name:'tom',
age:18,
hobby:['抽煙','喝酒','燙頭'],
friends:[
{name:'jerry',age:35},
{name:'tony',age:36}
]
}
},
methods: {
addSex(){
// Vue.set(this.student,'sex','男')
this.$set(this.student,'sex','男')
}
}
})
</script>
所以我們通過 vm._data.student.hobby[0] = ‘aaa’ // 不起作用
vue 監(jiān)測在數(shù)組那沒有 getter 和 setter,所以監(jiān)測不到數(shù)據(jù)的更改,也不會(huì)引起頁面的更新
vue對數(shù)組的監(jiān)測是通過 包裝數(shù)組上常用的用于修改數(shù)組的方法來實(shí)現(xiàn)的。
收集表單數(shù)據(jù)
(1) 若:輸入框?yàn)槲谋究?,則v-model收集的是value值,用戶輸入的就是value值。
(2) 若:輸入框?yàn)閱芜x框,則v-model收集的是value值,且要給標(biāo)簽配置value值。
(3) 若:輸入框?yàn)閺?fù)選框,則
沒有配置input的value屬性,那么收集的就是checked(勾選 or 未勾選,是布爾值)
配置input的value屬性:
- v-model的初始值是非數(shù)組,那么收集的就是checked(勾選 or 未勾選,是布爾值)
- v-model的初始值是數(shù)組,那么收集的的就是value組成的數(shù)組
注: v-model的三個(gè)修飾符:
- lazy:失去焦點(diǎn)再收集數(shù)據(jù)
- number:輸入字符串轉(zhuǎn)為有效的數(shù)字
- trim:輸入首尾空格過濾
到此這篇關(guān)于Vue基礎(chǔ)語法知識(shí)梳理下篇的文章就介紹到這了,更多相關(guān)Vue語法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue3?<script?setup?lang=“ts“>?的基本使用
<script setup>?是在單文件組件 (SFC) 中使用?composition api?的編譯時(shí)語法糖,本文主要講解<script setup>?與?TypeScript?的基本使用,感興趣的朋友跟隨小編一起看看吧2022-12-12
Vue?動(dòng)態(tài)路由的實(shí)現(xiàn)詳情
這篇文章主要介紹了Vue?動(dòng)態(tài)路由的實(shí)現(xiàn),動(dòng)態(tài)路由是一個(gè)常用的功能,根據(jù)后臺(tái)返回的路由json表,前端動(dòng)態(tài)顯示可跳轉(zhuǎn)的路由項(xiàng),本文主要實(shí)現(xiàn)的是后臺(tái)傳遞路由,前端拿到并生成側(cè)邊欄的一個(gè)形勢,需要的朋友可以參考一下2022-06-06
Vue項(xiàng)目中Api的組織和返回?cái)?shù)據(jù)處理的操作
這篇文章主要介紹了Vue項(xiàng)目中Api的組織和返回?cái)?shù)據(jù)處理的操作,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11
Vue實(shí)現(xiàn)用戶登錄及token驗(yàn)證
這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)用戶登錄及token驗(yàn)證,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
vue三元運(yùn)算之多重條件判斷方式(多個(gè)枚舉值轉(zhuǎn)譯)
這篇文章主要介紹了vue三元運(yùn)算之多重條件判斷方式(多個(gè)枚舉值轉(zhuǎn)譯),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
vue2.0學(xué)習(xí)之a(chǎn)xios的封裝與vuex介紹
最近在研究Vuex2.0,搞了好幾天終于有點(diǎn)頭緒了。下面這篇文章主要給大家介紹了關(guān)于vue2.0學(xué)習(xí)之a(chǎn)xios的封裝與vuex的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05
關(guān)于在vue-cli中使用微信自動(dòng)登錄和分享的實(shí)例
本篇文章主要介紹了關(guān)于在vue-cli中使用微信自動(dòng)登錄和分享的實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
Antd中單個(gè)DatePicker限定時(shí)間輸入范圍操作
這篇文章主要介紹了Antd中單個(gè)DatePicker限定時(shí)間輸入范圍操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10

