自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

vue開發(fā)必須知道的九大秘法

開發(fā)
近年來,vue越來越火,使用它的人也越來越多。vue基本用法很容易上手,但是還有很多優(yōu)化的寫法你就不一定知道了。本文列舉了一些vue常用的開發(fā)技巧。

[[345880]]

 require.context()
在實際開發(fā)中,絕大部分人都是以組件化的方式進(jìn)行開發(fā)。隨之而來就有了許多的組件需要引入。比如以下場景:

  1. import outExperInfo from "@/components/userInfo/outExperInfo"
  2. import baseUserInfo from "@/components/userInfo/baseUserInfo"
  3. import technicalExperInfo from "@/components/userInfo/technicalExperInfo"
  4. import skillExperInfo from "@/components/userInfo/skillExperInfo"
  5.  
  6. components:{ 
  7.     outExperInfo, 
  8.     baseUserInfo, 
  9.     technicalExperInfo, 
  10.     skillExperInfo 

這樣寫并沒有錯,但是仔細(xì)觀察發(fā)現(xiàn)寫了很多重復(fù)的代碼,這個時候利用require.context()可以寫成:

  1. const path = require('path'
  2. const files = require.context('@/components/userInfo'false, /\.vue$/) 
  3. const userComponents = {} 
  4. files.keys().forEach(key => { 
  5.  const name = path.basename(key'.vue'
  6.  userComponents[name] = files(key).default || files(key
  7. }) 
  8. components:userComponents 

這樣不管需要引入多少組件,都可以使用這一個方法。

路由的按需加載
隨著項目功能模塊的增加,引入的文件數(shù)量劇增。如果不做任何處理,那么首屏加載會相當(dāng)?shù)木徛?,這個時候,路由按需加載就閃亮登場了。

  1. webpack< 2.4 時 
  2.  path:'/'
  3.  name:'home'
  4.  components:resolve=>require(['@/components/home'],resolve) 
  5.   
  6. webpack> 2.4 時 
  7.  path:'/'
  8.  name:'home'
  9.  components:()=>import('@/components/home'

import()方法是由es6提出的,動態(tài)加載返回一個Promise對象,then方法的參數(shù)是加載到的模塊。類似于Node.js的require方法,主要import()方法是異步加載的。

動態(tài)組件
場景:如果項目中有tab切換的需求,那么就會涉及到組件動態(tài)加載,一般寫法如下:

  1. <component v-bind:is="currentTab"></component> 

這樣寫也沒有錯,但是如果這樣寫的話,每次切換的時候,當(dāng)前組件都會銷毀并且重新加載下一個組件。會消耗大量的性能,所以就起到了作用。

  1. <keep-alive> 
  2.  <component v-bind:is="currentTab"></component> 
  3. </keep-alive> 

有的小伙伴會說,這樣切換雖然不消耗性能了,但是切換效果沒有動畫效果了,別著急,這時可以利用內(nèi)置的。

  1. <transition> 
  2. <keep-alive> 
  3.  <component v-bind:is="currentTab"></component> 
  4. </keep-alive> 
  5. </transition> 

components和vue.component
前者是局部注冊組件,用法如下:

  1. export default
  2.  components:{home} 

后者是全局注冊組件,主要針對一些全局使用的組件,用法如下:

  1. Vue.component('home',home) 

Vue.nextTick
Vue.nextTick()方法在下次DOM更新循環(huán)結(jié)束之后執(zhí)行延遲回調(diào),因此可以頁面更新加載完畢之后再執(zhí)行回調(diào)函數(shù)。下面介紹幾個常用場景:

場景一

  1. <template> 
  2.     <div> 
  3.         <div ref = "ref"/> 
  4.     </div> 
  5. </template> 
  6. <script> 
  7. export default { 
  8.     created(){ 
  9.         console.log(this.$refs.ref) 
  10.         //undefined 
  11.     }) 
  12. </script> 

因為這個時候created階段dom并未完全渲染完成,所以獲取值為undefined,我們對其改造一下:

  1. <template> 
  2.     <div> 
  3.         <div ref = "ref"/> 
  4.     </div> 
  5. </template> 
  6. <script> 
  7. export default { 
  8.     created(){ 
  9.         Vue.nextTick(()=>{ 
  10.             console.log(this.$refs.ref) 
  11.         }) 
  12.         //<div></div> 
  13.          
  14.     }) 
  15. </script> 

這樣就可以獲取到dom了。

場景二

  1. <template> 
  2.     <div> 
  3.         <div v-if="visible" ref = "ref"/> 
  4.     </div> 
  5. </template> 
  6. <script> 
  7. export default { 
  8.     data() { 
  9.         return { 
  10.           visible: false 
  11.         }; 
  12.     }, 
  13.     showRef() { 
  14.         this.visible = true
  15.         console.log(this.$refs.ref); 
  16.         //undefined 
  17.     }, 
  18. </script> 

因為這個時候雖然visible的值為true,但是頁面dom并沒有更新完成,所以獲取值為undefined,我們對其改造一下:

  1. <template> 
  2.     <div> 
  3.         <div v-if="visible" ref = "ref"/> 
  4.     </div> 
  5. </template> 
  6. <script> 
  7. export default { 
  8.     data() { 
  9.         return { 
  10.           visible: false 
  11.         }; 
  12.     }, 
  13.     showRef() { 
  14.         this.visible = true
  15.         Vue.nextTick(()=>{ 
  16.             console.log(this.$refs.ref) 
  17.         }) 
  18.         //<div></div> 
  19.     }, 
  20. </script> 

這樣就可以獲取到dom了。

Vue.directive
場景:官方給我們提供了很多指令,但是我們?nèi)绻雽⑽淖肿兂芍付ǖ念伾x成指令使用,這個時候就需要用到Vue.directive,示例如下:

  1. // 全局定義 
  2. Vue.directive("change-color",function(el,binding,vnode){ 
  3.  el.style["color"]= binding.value; 
  4. }) 
  5.   
  6. // 使用 
  7. <template> 
  8.     <div v-change-color>{{message}} 
  9.     </div> 
  10. </template> 
  11. <script> 
  12.  export default
  13.      data(){ 
  14.       return
  15.       color:'green' 
  16.       } 
  17.      } 
  18.  } 
  19. </script> 

Vue.set()
當(dāng)在項目中直接設(shè)置數(shù)組的某一項的值,或者直接設(shè)置對象的某個屬性值,這個時候,你會發(fā)現(xiàn)頁面并沒有更新。這是因為Object.defineprototype()限制,監(jiān)聽不到變化,具體的可以查看我的另一篇文章:

vue對象數(shù)組數(shù)據(jù)變化,頁面不渲染

事件修飾符

  • .stop:阻止冒泡
  • .prevent:阻止默認(rèn)行為
  • .self:僅綁定元素自身觸發(fā)
  • .once: 2.1.4 新增,只觸發(fā)一次
  • passive: 2.3.0 新增,滾動事件的默認(rèn)行為 (即滾動行為) 將會立即觸發(fā),不能和.prevent 一起使用
  • .sync 修飾符

從 2.3.0 起vue重新引入了 .sync 修飾符,但是這次它只是作為一個編譯時的語法糖存在。它會被擴(kuò)展為一個自動更新父組件屬性的 v-on 監(jiān)聽器。示例代碼如下:

  1. <comp :foo.sync="bar"></comp> 

會被擴(kuò)展為:

  1. <comp :foo="bar" @update:foo="val => bar = val"></comp> 

當(dāng)子組件需要更新 foo 的值時,它需要顯式地觸發(fā)一個更新事件:

  1. this.$emit('update:foo', newValue) 

長列表性能優(yōu)化(數(shù)據(jù)凍結(jié))
眾所周知,vue會通過object.defineProperty對數(shù)據(jù)進(jìn)行劫持,進(jìn)而實現(xiàn)頁面實時相應(yīng)數(shù)據(jù)的變化,然而我們有些時候,需要的僅僅就是純粹的展示數(shù)據(jù),因為數(shù)據(jù)不會有任何改變,我們就不需要vue來劫持我們的數(shù)據(jù)。在數(shù)據(jù)量很大的情況下,這可以很明顯的減少加載時間。

那么如何實現(xiàn)禁止vue劫持我們的數(shù)據(jù)尼?可以通過object.freeze方法來凍結(jié)數(shù)據(jù),凍結(jié)之后數(shù)據(jù)也就不能再修改了。示例如下:

  1. let longList = [ 
  2.     {name:'monkeysoft'}, 
  3.     ... 
  4. this.longList = Object.freeze(longList) 

 

責(zé)任編輯:姜華 來源: 猴哥說前端
相關(guān)推薦

2017-10-17 15:18:58

綜合布線網(wǎng)絡(luò)

2018-04-08 10:08:43

開發(fā)人員工具

2023-12-21 14:43:30

Python字典

2010-04-12 14:58:56

Meego開發(fā)

2021-01-21 22:07:15

Web開發(fā)人工智能

2021-01-15 12:30:07

Vue技巧前端

2012-06-27 09:36:37

軟件開發(fā)軟件開發(fā)

2017-04-17 21:33:01

前端開發(fā)javascript嚴(yán)格模式

2015-04-15 10:50:06

綜合布線

2021-07-29 08:13:05

高并發(fā)秒殺商品秒殺系統(tǒng)

2014-09-01 09:53:50

Android框架

2017-09-25 16:22:04

App

2020-07-09 07:34:40

開發(fā)Web工具

2021-01-29 10:07:31

大數(shù)據(jù)大數(shù)據(jù)技術(shù)

2021-02-05 11:21:54

大數(shù)據(jù)大數(shù)據(jù)技術(shù)

2017-12-07 15:47:25

2020-02-28 14:05:00

Linuxshell命令

2020-12-29 09:50:23

大數(shù)據(jù)大數(shù)據(jù)技術(shù)

2012-09-29 09:22:24

.NETGC內(nèi)存分配

2012-09-29 10:29:56

.Net內(nèi)存分配繼承
點贊
收藏

51CTO技術(shù)棧公眾號