Vue CLI——自定義插件昏翰、自定義指令

一、key

v-for綁定key值刘急,為什么不建議使用index作為key值?
如果只是展示列表數(shù)據(jù)棚菊,key值可以是索引;如果列表中的數(shù)據(jù)會(huì)經(jīng)常發(fā)生變化叔汁,特別是列表數(shù)據(jù)的位置會(huì)發(fā)生變化统求,這時(shí)候key一定要設(shè)置為對(duì)象身上的唯一屬性检碗,比如:學(xué)號(hào)、工號(hào)球订、身份證號(hào)后裸、手機(jī)號(hào)等等。目的是:當(dāng)列表更新時(shí)冒滩,會(huì)大大提高列表重新渲染的性能損耗微驶。
因?yàn)関ue在渲染數(shù)據(jù)時(shí),先將數(shù)據(jù)生成一份虛擬DOM开睡,再將虛擬DOM生成對(duì)應(yīng)的真實(shí)DOM掛載到頁面中因苹。當(dāng)vue中的數(shù)據(jù)修改后,會(huì)重新生成一份虛擬DOM篇恒,并跟之前的虛擬DOM進(jìn)行匹配扶檐,如果兩份虛擬DOM中的key和key對(duì)應(yīng)的值完全相同,不會(huì)重新生成對(duì)應(yīng)的真實(shí)DOM胁艰;只有key和key對(duì)應(yīng)的值不同的虛擬DOM款筑,才會(huì)生成新的真實(shí)DOM并掛載的頁面中。

<div class="home">
  <button @click="add">添加</button>
  <ul>
    <!-- 如果key是索引腾么,當(dāng)位置發(fā)生變化時(shí)奈梳,所有數(shù)據(jù)都會(huì)重新渲染 -->
    <!-- <li v-for="(item, index) in list" :key="index">{{ item }}</li> -->
    <!-- 如果id是索引,當(dāng)位置發(fā)生變化時(shí)解虱,只會(huì)渲染更新的數(shù)據(jù) -->
    <li v-for="item in list" :key="item.id">{{ item }}</li>
  </ul>
</div>
data() {
  return {
    list: [
      {
        id: 1001,
        name: "張學(xué)友",
        age: 21,
        sex: "男",
      },
      {
        id: 1002,
        name: "郭富城",
        age: 22,
        sex: "男",
      },
      {
        id: 1003,
        name: "黎明",
        age: 24,
        sex: "男",
      },
      {
        id: 1004,
        name: "周潤發(fā)",
        age: 26,
        sex: "男",
      },
    ],
  };
},
methods: {
  // 添加員工的方法
  add() {
    let em = {
      id: Date.now(),
      name: "蔡依林",
      age: 22,
      sex: "女",
    };
    this.list.unshift(em);
  },
}

二攘须、$nextTick()

$nextTick():需要傳一個(gè)回調(diào)函數(shù)。將回調(diào)函數(shù)里面的代碼延遲到DOM渲染完畢后執(zhí)行殴泰。在修改數(shù)據(jù)之后立即使用它于宙,然后等待 DOM 更新。

<input type="text" v-model="carName" />
<button @click="addCar">添加汽車</button>
<ul ref="list">
  <li v-for="item in list" :key="item.id">
    <input type="text" :value="item.name" />
  </li>
</ul>
data() {
  return {
    // 汽車名稱
    carName: "",
    // 汽車數(shù)組
    list: [
      {
        id: 1001,
        name: "寶馬",
      },
      {
        id: 1002,
        name: "瑪莎拉蒂",
      },
    ]
  };
},
methods: {
  addCar() {
    let car = {
      id: Date.now(),
      name: this.carName,
    };
    this.list.push(car);
    this.carName = "";
    // $nextTick方法悍汛,需要傳一個(gè)回調(diào)函數(shù)捞魁。回調(diào)函數(shù)里面的代碼在DOM更新完成后執(zhí)行离咐。
    this.$nextTick(() => {
      //  讓最后一個(gè)li元素里面的input元素獲取焦點(diǎn)
      //  focus()方法用于為元素設(shè)置焦點(diǎn)署驻。
      this.$refs.list.lastChild.lastChild.focus();
    });
  }
}
$nextTick方法的使用

三、$forceUpdate()

$forceUpdate():進(jìn)行強(qiáng)制更新健霹。調(diào)用這個(gè)方法會(huì)更新視圖和數(shù)據(jù),觸發(fā)updated生命周期瓶蚂。

<button @click="person.name = '張三'">修改姓名</button>
<button @click="addSex">添加性別</button>
<div>{{ person }}</div>
data() {
  return {
    person: {
      name: "張學(xué)友",
      age: 20,
    }
  };
},
methods: {
  addSex() {
    // 添加響應(yīng)式屬性
    // this.$set(this.person,"sex","男")

    //   直接添加的屬性糖埋,不具備響應(yīng)式
    this.person.sex = "男";
    //  通過$forceUpdate()方法,迫使vue實(shí)例重新渲染
    this.$forceUpdate();
  }
}
數(shù)據(jù)更新前
數(shù)據(jù)更新后

四窃这、自定義指令

自定義指令就是一個(gè)方法瞳别,方法的第一個(gè)參數(shù)傳遞的是指令所在的DOM元素,方法的第二個(gè)參數(shù)是給指令綁定的數(shù)據(jù)。

1祟敛、局部指令

(1)定義指令

data() {
    return {
        car:'<h2>保時(shí)捷卡宴真好看</h2>'
    }
},
// 定義局部指令疤坝,所有的指令背后都是在操作DOM,我們將這種功能稱之為:造輪子馆铁。
directives:{
    // 注冊(cè)一個(gè)局部自定義指令 'v-red'跑揉,設(shè)置字體顏色為紅色
    red:function(el){
        el.style.color="red"
    },
    // 注冊(cè)一個(gè)局部自定義指令 'v-myhtml',渲染html標(biāo)簽數(shù)據(jù)
    myhtml(el,bind){
        el.innerHTML = bind.value
    }
}

(2)使用指令

<div v-red>好好學(xué)習(xí)</div>
<div v-myhtml="car"></div>

2埠巨、全局指令

(1)定義指令

// 定義全局自定義指令
import Vue from 'vue'
Vue.directive('mycolor',function(el,bind){
    el.style.color = bind.value
})

(2)main.js文件中導(dǎo)入指令

// 導(dǎo)入全局自定義指令
import './directives'

(3)使用指令

<divv-color="'red'">好好學(xué)習(xí)Vue</div>

五历谍、自定義插件

1、定義插件

定義一個(gè)插件辣垒,插件就是將給Vue添加的全局成員望侈,歸類到一起去,這樣做利于后期維護(hù)勋桶。
插件本質(zhì)上就是一個(gè)對(duì)象脱衙,該對(duì)象中必須包含一個(gè)install方法,方法的第一個(gè)參數(shù)是Vue例驹,第二個(gè)參數(shù)是配置對(duì)象捐韩。install()方法,會(huì)在use的時(shí)候執(zhí)行眠饮。Vue.use(插件)奥帘,這里的Vue會(huì)作為install方法的第一個(gè)參數(shù)。

// 插件本質(zhì)上就是一個(gè)對(duì)象
export default {
    // 該對(duì)象中必須包含一個(gè)install()方法
    install:function(Vue,options){
        // 可以直接給Vue添加成員
        Vue.sayHi = function(){
            console.log('大家好仪召!我是Vue');
        },
        Vue.msg = "歡迎使用插件",
        // 可以在Vue的原型上擴(kuò)展成員
        Vue.prototype.sayHello = function(){
            console.log('哈哈寨蹋!我是Vue原型上的方法');
        },
        // 給Vue混入成員
        Vue.mixin({
            data() {
                return {
                    plane:{
                        name:'奔馳',
                        price:'100W'
                    }
                }
            },
            methods: {
                showPlane(){
                    console.log(this.plane.name,this.plane.price);
                }
            },
        }),
        // 注冊(cè)全局組件
        Vue.component('b-box', {
            // 在腳手架環(huán)境中,只能通過渲染函數(shù)定義全局組件
            render(h) {
                return h('div',this.$slots.default)
            },
        }),
        // 注冊(cè)全局指令
        Vue.directive('bgcolor', function(el,bind){
            el.style.backgroundColor = bind.value
        })
    }
}

2扔茅、導(dǎo)入插件

// 導(dǎo)入自定義插件
import myPlugin from './plugins'
// 注意:一定要use
Vue.use(myPlugin)

3已旧、使用插件

<!-- 調(diào)用插件中定義的vue原型上的方法 -->
<button @click="sayhello">sayHello</button>
<!-- 調(diào)用插件中定義的vue方法 -->
<button @click="sayHi">sayHello</button>
<!-- 調(diào)用插件中定義的混入成員 -->
<button @click="showPlane">showPlane</button>
<div v-bgcolor="'lightblue'">我是淡藍(lán)色</div>
<b-box>哈哈</b-box>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市召娜,隨后出現(xiàn)的幾起案子运褪,更是在濱河造成了極大的恐慌,老刑警劉巖玖瘸,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秸讹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡雅倒,警方通過查閱死者的電腦和手機(jī)璃诀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔑匣,“玉大人劣欢,你說我怎么就攤上這事棕诵。” “怎么了凿将?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵校套,是天一觀的道長。 經(jīng)常有香客問我牧抵,道長笛匙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任灭忠,我火速辦了婚禮膳算,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弛作。我一直安慰自己涕蜂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布映琳。 她就那樣靜靜地躺著机隙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪萨西。 梳的紋絲不亂的頭發(fā)上有鹿,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音谎脯,去河邊找鬼葱跋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛源梭,可吹牛的內(nèi)容都是我干的娱俺。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼废麻,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼荠卷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起烛愧,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤油宜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后怜姿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慎冤,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年沧卢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了粪薛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡搏恤,死狀恐怖违寿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情熟空,我是刑警寧澤藤巢,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站息罗,受9級(jí)特大地震影響掂咒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜迈喉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一绍刮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挨摸,春花似錦孩革、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至熔掺,卻和暖如春饱搏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背置逻。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工推沸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人券坞。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓鬓催,卻偏偏與公主長得像,于是被迫代替她去往敵國和親报慕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子深浮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容