欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

你或許不知道Vue的這些小技巧-創(chuàng)新互聯(lián)

前言
用Vue開發(fā)一個網頁并不難,但是也經常會遇到一些問題,其實大部分的問題都在文檔中有所提及,再不然我們通過谷歌也能成功搜索到問題的答案,為了幫助小伙伴們提前踩坑,在遇到問題的時候,心里大概有個譜知道該如何去解決問題。這篇文章是將自己知道的一些小技巧,結合查閱資料整理成的一篇文章,如果喜歡的話可以點波贊/關注,支持一下,希望大家看完本文可以有所收獲。

我們提供的服務有:網站設計制作、成都做網站、微信公眾號開發(fā)、網站優(yōu)化、網站認證、東洲ssl等。為成百上千企事業(yè)單位解決了網站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的東洲網站制作公司

前端進階積累、公眾號、GitHub

文章內容總結:
組件style的scoped
Vue 數組/對象更新 視圖不更新
vue filters 過濾器的使用
列表渲染相關
深度watch與watch立即觸發(fā)回調
這些情況下不要使用箭頭函數
路由懶加載寫法
路由的項目啟動頁和404頁面
Vue調試神器:vue-devtools
組件style的scoped:
問題:在組件中用js動態(tài)創(chuàng)建的dom,添加樣式不生效。

場景:

<template>
     <div class="test"></div>
</template>
<script>
    let a=document.querySelector('.test');
    let newDom=document.createElement("div"); // 創(chuàng)建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。

所以原因就很清楚了:因為動態(tài)添加的dom沒有scoped添加的標識,沒有跟testAdd的樣式匹配起來,導致樣式失效。

解決方式

推薦:去掉該組件的scoped
每個組件的css并不會很多,當設計到動態(tài)添加dom,并為dom添加樣式的時候,就可以去掉scoped,會比下面的方法方便很多。

可以動態(tài)添加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。

數組原生方法觸發(fā)視圖更新:
Vue可以監(jiān)測到數組變化的,數組原生方法:

splice()、 push()、pop()、shift()、unshift()、sort()、reverse()

復制代碼
意思是使用這些方法不用我們再進行額外的操作,視圖自動進行更新。

推薦使用splice方法會比較好自定義,因為slice可以在數組的任何位置進行刪除/添加操作,這部分可以看看我前幾天寫的一篇文章:【干貨】js 數組詳細操作方法及解析合集

替換數組/對象
比方說:你想遍歷這個數組/對象,對每個元素進行處理,然后觸發(fā)視圖更新。

// 文檔中的栗子: filter遍歷數組,返回一個新數組,用新數組替換舊數組
example1.items = example1.items.filter(function (item) {
return item.message.match(/Foo/)
})
復制代碼
舉一反三:可以先把這個數組/對象保存在一個變量中,然后對這個變量進行遍歷,等遍歷結束后再用變量替換對象/數組。

并不會重新渲染整個列表:

Vue 為了使得 DOM 元素得到大范圍的重用而實現了一些智能的、啟發(fā)式的方法,所以用一個含有相同元素的數組去替換原來的數組是非常高效的操作。

如果你還是很困惑,可以看看Vue文檔中關于這部分的解釋。

vue filters 過濾器的使用:
過濾器,通常用于后臺管理系統(tǒng),或者一些約定類型,過濾。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中包括過濾器串聯(lián)、過濾器傳參。

推薦看Vue過濾器文檔,你會更了解它的。

列表渲染相關
v-for循環(huán)綁定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模板要渲染,又沒有數據關聯(lián),我們可以:

<div v-for="n in 5">
    <span>這里會被渲染5次,渲染模板{{n}}</span>
 </div>

復制代碼
v-if盡量不要與v-for在同一節(jié)點使用:

v-for 的優(yōu)先級比 v-if 更高,如果它們處于同一節(jié)點的話,那么每一個循環(huán)都會運行一遍v-if。

如果你想根據循環(huán)中的每一項的數據來判斷是否渲染,那么你這樣做是對的:

<li v-for="todo in todos" v-if="todo.type===1">
  {{ todo }}
</li>

復制代碼
如果你想要根據某些條件跳過循環(huán),而又跟將要渲染的每一項數據沒有關系的話,你可以將v-if放在v-for的父節(jié)點:

// 根據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優(yōu)先級的關系,可以為你節(jié)省大量的性能。

深度watch與watch立即觸發(fā)回調
watch很多人都在用,但是這watch中的這兩個選項deep、immediate,或許不是很多人都知道,我猜。

選項:deep

在選項參數中指定 deep: true,可以監(jiān)聽對象中屬性的變化。

選項:immediate

在選項參數中指定 immediate: true, 將立即以表達式的當前值觸發(fā)回調,也就是立即觸發(fā)一次。

watch: {
    obj: {
      handler(val, oldVal) {
        console.log('屬性發(fā)生變化觸發(fā)這個回調',val, oldVal);
      },
      deep: true // 監(jiān)聽這個對象中的每一個屬性變化
    },
    step: { // 屬性
      //watch
      handler(val, oldVal) {
        console.log("默認立即觸發(fā)一次", val, oldVal);
      },
      immediate: true // 默認立即觸發(fā)一次
    },
  },

復制代碼
這兩個選項可以同時使用,另外:是的,又有一個demo。

還有下面這一點需要注意。

這些情況下不要使用箭頭函數:
不應該使用箭頭函數來定義一個生命周期方法
不應該使用箭頭函數來定義 method 函數
不應該使用箭頭函數來定義計算屬性函數
不應該對 data 屬性使用箭頭函數
不應該使用箭頭函數來定義 watcher 函數
示例:

// 上面watch的栗子:
handler:(val, oldVal)=> { // 可以執(zhí)行
 console.log("默認觸發(fā)一次", val, oldVal);

},
// method:
methods: {
plus: () => { // 可以執(zhí)行
// do something
}
}
// 生命周期:
created:()=>{ // 可以執(zhí)行
console.log('lala',this.obj)
},
復制代碼
是的,沒錯,這些都能執(zhí)行。

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內數據的變化?

那么這款尤大開發(fā)的調試神器:vue-devtools,你真的要了解一下了。

這波穩(wěn)賺不賠,真的能提高開發(fā)效率。

安裝方法:

搜索vue-devtools即可安裝。
安裝之后:

在chrome開發(fā)者工具中會看一個vue的一欄,如下對我們網頁應用內數據變化,組件層級等信息能夠有更準確快速的了解。

前幾個月也寫過一篇類似的:
Vue 實踐過程中的幾個問題

結語
本文的內容很多都在Vue文檔里面有過說明,推薦大家可以多看看Vue文檔,不止看教程篇,還有文檔的Api什么的,也都可以看。然后其實還有兩三點想寫的,因為預計篇幅都會比較長一點,所以準備留到以后的文章里面吧~

文章如有不正確的地方歡迎各位路過的大佬鞭策!希望大家看完可以有所收獲,喜歡的話,趕緊點波訂閱關注/喜歡。

看完的朋友可以點個喜歡/關注,您的支持是對我大的鼓勵。
前端進階積累、公眾號、GitHub、wx:OBkoro1、郵箱:obkoro1@foxmail.com

以上2018.6.3

參考資料:
Vue文檔

Vue Api文檔

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

本文題目:你或許不知道Vue的這些小技巧-創(chuàng)新互聯(lián)
文章位置:http://www.chinadenli.net/article44/disehe.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供外貿建站全網營銷推廣網頁設計公司靜態(tài)網站面包屑導航軟件開發(fā)

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化