媒介
用Vue開闢一個網頁並不難,然則也經常會碰到一些題目,實在大部份的題目都在文檔中有所說起,再不然我們經由過程谷歌也能勝利搜刮到題目的答案,為了協助小夥伴們提早踩坑,在碰到題目的時刻,內心大概有個譜曉得該怎樣去處置懲罰題目。這篇文章是將本身曉得的一些小技能,連繫查閱材料整理成的一篇文章,假如喜好的話可以點波贊/關注,支撐一下,願望人人看完本文可以有所收成。
個人博客相識一下:
obkoro1.com
文章內容總結:
- 組件style的scoped
- Vue 數組/對象更新 視圖不更新
- vue filters 過濾器的運用
- 列表襯着相干
- 深度watch與watch馬上觸發還調
- 這些情況下不要運用箭頭函數
- 路由懶加載寫法
- 路由的項目啟動頁和404頁面
- Vue調試神器:vue-devtools
組件style的scoped:
題目:在組件頂用js動態建立的dom,增加款式不見效。
場景:
<template>
<div class="test"></div>
</template>
<script>
let a=document.querySelector('.test');
let newDom=document.createElement("div"); // 建立dom
newDom.setAttribute("class","testAdd" ); // 增加款式
a.appendChild(newDom); // 插進去dom
</script>
<style scoped>
.test{
background:blue;
height:100px;
width:100px;
}
.testAdd{
background:red;
height:100px;
width:100px;
}
</style>
效果:
// test見效 testAdd 不見效
<div data-v-1b971ada class="test"><div class="testAdd"></div></div>
.test[data-v-1b971ada]{ // 注重data-v-1b971ada
background:blue;
height:100px;
width:100px;
}
緣由:
當 <style>
標籤有 scoped 屬性時,它的 CSS 只作用於當前組件中的元素。
它會為組件中所有的標籤和class款式增加一個scoped
標識,就像上面效果中的data-v-1b971ada
。
所以緣由就很清晰了:因為動態增加的dom沒有scoped
增加的標識,沒有跟testAdd
的款式婚配起來,致使款式失效。
處置懲罰體式格局
- 引薦:去掉該組件的scoped
每一個組件的css並不會許多,當設想到動態增加dom,併為dom增加款式的時刻,就可以去掉scoped,會比下面的要領輕易許多。
- 可以動態增加style
// 上面的栗子可以如許增加款式
newDom.style.height=’100px’;
newDom.style.width=’100px’;
newDom.style.background=’red’;
Vue 數組/對象更新 視圖不更新
許多時刻,我們習慣於如許操縱數組和對象:
data() { // data數據
return {
arr: [1,2,3],
obj:{
a: 1,
b: 2
}
};
},
// 數據更新 數組視圖不更新
this.arr[0] = 'OBKoro1';
this.arr.length = 1;
console.log(arr);// ['OBKoro1'];
// 數據更新 對象視圖不更新
this.obj.c = 'OBKoro1';
delete this.obj.a;
console.log(obj); // {b:2,c:'OBKoro1'}
因為js的限定,Vue 不能檢測以上數組的更改,以及對象的增加/刪除,許多人會因為像上面如許操縱,湧現視圖沒有更新的題目。
處置懲罰體式格局:
- this.$set(你要轉變的數組/對象,你要轉變的位置/key,你要改成什麼value)
this.$set(this.arr, 0, “OBKoro1”); // 轉變數組
this.$set(this.obj, “c”, “OBKoro1”); // 轉變對象
假如照樣不懂的話,可以看看這個codependemo。
- 數組原生要領觸發視圖更新:
Vue可以監測到數組變化的,數組原生要領:
splice()、 push()、pop()、shift()、unshift()、sort()、reverse()
意義是運用這些要領不必我們再舉行分外的操縱,視圖自動舉行更新。
引薦運用splice
要領會比較好自定義,因為slice可以在數組的任何位置舉行刪除/增加操縱,這部份可以看看我頭幾天寫的一篇文章:【乾貨】js 數組細緻操縱要領及剖析合集
- 替代數組/對象
比方說:你想遍歷這個數組/對象,對每一個元素舉行處置懲罰,然後觸發視圖更新。
// 文檔中的栗子: filter遍曆數組,返回一個新數組,用新數組替代舊數組
example1.items = example1.items.filter(function (item) {
return item.message.match(/Foo/)
})
聞一知十:可以先把這個數組/對象保存在一個變量中,然後對這個變量舉行遍歷,等遍歷完畢后再用變量替代對象/數組。
並不會從新襯着全部列表:
Vue 為了使得 DOM 元素獲得最大局限的重用而完成了一些智能的、啟髮式的要領,所以用一個含有雷同元素的數組去替代本來的數組是異常高效的操縱。
假如你照樣很疑心,可以看看Vue文檔中關於這部份的詮釋。
vue filters 過濾器的運用:
過濾器,一般用於背景治理體系,也許一些商定範例,過濾。Vue過濾器用法是很簡單,然則許多朋儕可以都沒有用過,這裏輕微解說一下。
在html模板中的兩種用法:
<!-- 在雙花括號中 -->
{{ message | filterTest }}
<!-- 在 `v-bind` 中 -->
<div :id="message | filterTest"></div>
在組件script
中的用法:
export default {
data() {
return {
message:1
}
},
filters: {
filterTest(value) {
// value在這裡是message的值
if(value===1){
return '末了輸出這個值';
}
}
}
}
用法就是上面講的如許,可以本身在組件中試一試就曉得了,很簡單很好用的。
假如不想本身試,可以點這個demo內里修正代碼就可以了,demo中包含過濾器串連、過濾器傳參。
引薦看Vue過濾器文檔,你會更相識它的。
列表襯着相干
v-for輪迴綁定model:
input在v-for中可以像以下這麼舉行綁定,我敢賭錢許多人不曉得。
// 數據
data() {
return{
obj: {
ob: "OB",
koro1: "Koro1"
},
model: {
ob: "默許ob",
koro1: "默許koro1"
}
}
},
// html模板
<div v-for="(value,key) in obj">
<input type="text" v-model="model[key]">
</div>
// input就跟數據綁定在一起了,那兩個默許數據也會在input中顯現
為此,我做了個demo,你可以點進去嘗嘗。
一段取值的v-for
假如我們有一段反覆的html模板要襯着,又沒有數據關聯,我們可以:
<div v-for="n in 5">
<span>這裡會被襯着5次,襯着模板{{n}}</span>
</div>
v-if只管不要與v-for在統一節點運用:
v-for 的優先級比 v-if 更高,假如它們處於統一節點的話,那末每一個輪迴都邑運轉一遍v-if。
假如你想依據輪迴中的每一項的數據來推斷是不是襯着,那末你如許做是對的:
<li v-for="todo in todos" v-if="todo.type===1">
{{ todo }}
</li>
假如你想要依據某些前提跳過輪迴,而又跟將要襯着的每一項數據沒有關聯的話,你可以將v-if放在v-for的父節點:
// 依據elseData是不是為true 來推斷是不是襯着,跟每一個元素沒有關聯
<ul v-if="elseData">
<li v-for="todo in todos">
{{ todo }}
</li>
</ul>
// 數組是不是有數據 跟每一個元素沒有關聯
<ul v-if="todos.length">
<li v-for="todo in todos">
{{ todo }}
</li>
</ul>
<p v-else>No todos left!</p>
如上,正確運用v-for與v-if優先級的關聯,可以為你節約大批的機能。
深度watch與watch馬上觸發還調
watch許多人都在用,然則這watch中的這兩個選項deep
、immediate
,也許不是許多人都曉得,我猜。
選項:deep
在選項參數中指定 deep: true
,可以監聽對象中屬性的變化。
選項:immediate
在選項參數中指定 immediate: true, 將馬上以表達式的當前值觸發還調,也就是默許觸發一次。
watch: {
obj: {
handler(val, oldVal) {
console.log('屬性發生變化觸發這個回調',val, oldVal);
},
deep: true // 監聽這個對象中的每一個屬性變化
},
step: { // 屬性
//watch
handler(val, oldVal) {
console.log("默許觸發一次", val, oldVal);
},
immediate: true // 默許觸發一次
},
},
這兩個選項可以同時運用,別的:是的,又有一個demo。
另有下面這一點須要注重。
這些情況下不要運用箭頭函數:
- 不應該運用箭頭函數來定義一個生命周期要領
- 不應該運用箭頭函數來定義 method 函數
- 不應該運用箭頭函數來定義盤算屬性函數
- 不應該對 data 屬性運用箭頭函數
- 不應該運用箭頭函數來定義 watcher 函數
示例:
// 上面watch的栗子:
handler:(val, oldVal)=> { // 可以實行
console.log("默許觸發一次", val, oldVal);
},
// method:
methods: {
plus: () => { // 可以實行
// do something
}
}
// 生命周期:
created:()=>{ // 可以實行
console.log('lala',this.obj)
},
是的,沒錯,這些都能實行。
but:
箭頭函數綁定了父級作用域的上下文,this 將不會根據希冀指向 Vue 實例。
也就是說,你不能運用this來訪問你組件中的data數據以及method要領了。
this將會指向undefined。
路由懶加載寫法:
// 我所採納的要領,個人感覺比較簡約一些,少了一步引入賦值。
const router = new VueRouter({
routes: [
path: '/app',
component: () => import('./app'), // 引入組件
]
})
// Vue路由文檔的寫法:
const app = () => import('./app.vue') // 引入組件
const router = new VueRouter({
routes: [
{ path: '/app', component: app }
]
})
文檔的寫法在於題目在於:假如我們的路由比較多的話,是不是是要在路由上方引入賦值十幾行組件?
第一種跟第二種要領比擬就是把引入賦值的一步,直接寫在component
上面,本質上是一樣的。兩種體式格局都可以的,人人自由選擇哈。
路由的項目啟動頁和404頁面
實際上這也就是一個設置罷了:
export default new Router({
routes: [
{
path: '/', // 項目啟動頁
redirect:'/login' // 重定向到下方聲明的路由
},
{
path: '*', // 404 頁面
component: () => import('./notFind') // 也許運用component也可以的
},
]
})
比方你的域名為:www.baidu.com
項目啟動頁指的是: 當你進入www.baidu.com
,會自動跳轉到login登錄頁。
404頁面指的是: 當進入一個沒有 聲明/沒有婚配 的路由頁面時就會跳轉到404頁面。
比方進入www.baidu.com/testRouter
,就會自動跳轉到notFind
頁面。
當你沒有聲明一個404頁面,進入www.baidu.com/testRouter
,顯現的頁面是一片空白。
Vue調試神器:vue-devtools
每次調試的時刻,寫一堆console
是不是很煩?想要更快曉得組件/Vuex內數據的變化?
那末這款尤大開闢的調試神器:vue-devtools,你真的要相識一下了。
這波穩賺不賠,真的能進步開闢效力。
裝置要領:
- 谷歌市肆+科學上網,搜刮vue-devtools即可裝置。
- 不會科學上網?手動裝置
裝置今後:
在chrome開闢者東西中會看一個vue的一欄,以下對我們網頁運用內數據變化,組件層級等信息可以有更正確疾速的相識。
前幾個月也寫過一篇相似的:
結語
本文的內容許多都在Vue文檔內里有過申明,引薦人人可以多看看Vue文檔,不止看教程篇,另有文檔的Api什麼的,也都可以看。然後實在另有兩三點想寫的,因為估計篇幅都邑比較長一點,所以預備留到今後的文章內里吧~
文章若有不正確的處所迎接列位途經的大佬推動!願望人人看完可以有所收成,喜好的話,趕忙點波定閱關注/喜好。
看完的朋儕可以點個喜好/關注,您的支撐是對我最大的勉勵。
個人blog and 掘金個人主頁,如需轉載,請放上原文鏈接並簽名。碼字不容易,謝謝支撐!
假如喜好本文的話,迎接關注我的定閱號,漫漫手藝路,期待將來配合進修生長。
以上2018.6.3