vue 高級(jí)技巧

1.css 局部樣式

  • vue 中style樣式添加scoped屬性表示它的樣式只作用于當(dāng)前組件,樣式私有化占卧。
  • 但是當(dāng)前組件的根組件會(huì)受到父組件樣式的影響遗菠。(比如父組件有個(gè).box{background:red}, 如果子組件即當(dāng)前組件的根組件類名也為box,那背景也會(huì)為red)
  • 其中渲染的原理:

給HTML的DOM節(jié)點(diǎn)添加一個(gè)不重復(fù)的data屬性 來(lái)表示唯一性

在對(duì)應(yīng)的css選擇器末尾添加一個(gè)當(dāng)前組件的data屬性選擇器來(lái)私有化

  • 如果使用了scoped屬性后华蜒,想讓組件內(nèi)部樣式被外部控制舷蒲,只需要css添加 deep屬性即可
<style lang="less" scoped>
.text-box {
  /deep/ input {
    width: 166px;
    text-align: center;
  }
}
</style>

2. Vue.filter 全局過(guò)濾器

  • 過(guò)濾器的目的主要是為了對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)換

  • computed計(jì)算屬性也可以轉(zhuǎn)換,但是computed不能接受參數(shù)友多,只能針對(duì)某一個(gè)Vue內(nèi)部屬性進(jìn)行轉(zhuǎn)換牲平,但是filter可以接受參數(shù)。

注冊(cè)
全局過(guò)濾器

Vue.filter('globalFilter', value=>{....})

組件過(guò)濾器

filters:{
  testFilters: value=>{...}
}

使用

在雙花括號(hào)插值

{{message | testFilter}}

在v-bind表達(dá)式中使用

<div v-bind:=id="rawId | testFilter"></div>

3. Vue.nextTick

  • 用法: 在下次 DOM 更新循環(huán)結(jié)束之后執(zhí)行延遲回調(diào)域滥。在修改數(shù)據(jù)之后立即使用這個(gè)方法纵柿,獲取更新后的 DOM
  • 那么這句話是什么意思呢蜈抓,其實(shí)簡(jiǎn)單來(lái)說(shuō)就是,當(dāng)我們修改數(shù)據(jù)后昂儒,視圖層的數(shù)據(jù)更新是異步的沟使,既:當(dāng)修改過(guò)數(shù)據(jù)后立即輸出綁定改數(shù)據(jù)的dom元素,該dom元素中的數(shù)據(jù)還是未更新過(guò)的渊跋。
<template>
  <div id="app">
    <span ref="name">{{ name }}</span>
    <button type="button" @click="change">改變</button>
  </div>
</template>
<script>
export default {
  name: 'App',
  data() {
    return {
      list: [1,2,3],
      name: 'tom'
    }
  },
  methods: {
    change() {
      this.name = 'lucy';
      console.log(this.$refs.name.innerHTML, 'dom未更新'); // 輸出tom
      this.$nextTick(function (){
        console.log(this.$refs.name.innerHTML, 'dom已更新'); // 輸出tom
      });
    }
  }
}
</script>

4. mixins

  • 混入 (mixin) 提供了一種非常靈活的方式腊嗡,來(lái)分發(fā) Vue 組件中的可復(fù)用功能。一個(gè)混入對(duì)象可以包含任意組件選項(xiàng)拾酝。當(dāng)組件使用混入對(duì)象時(shí)燕少,所有混入對(duì)象的選項(xiàng)將被“混合”進(jìn)入該組件本身的選項(xiàng)。

  • 有以下幾個(gè)特點(diǎn)

當(dāng)組件和混入對(duì)象含有同名選項(xiàng)時(shí)蒿囤,這些選項(xiàng)將以恰當(dāng)?shù)姆绞竭M(jìn)行“合并”客们。
比如,數(shù)據(jù)對(duì)象在內(nèi)部會(huì)進(jìn)行遞歸合并材诽,并在發(fā)生沖突時(shí)以組件數(shù)據(jù)優(yōu)先

var mixin = {
  data: function () {
    return {
      message: 'hello',
      foo: 'abc'
    }
  }
}

new Vue({
  mixins: [mixin],
  data: function () {
    return {
      message: 'goodbye',
      bar: 'def'
    }
  },
  created: function () {
    console.log(this.$data)
    // => { message: "goodbye", foo: "abc", bar: "def" }
  }
})

同名鉤子函數(shù)將合并為一個(gè)數(shù)組底挫,因此都將被調(diào)用。另外脸侥,混入對(duì)象的鉤子將在組件自身鉤子之前調(diào)用建邓。

var mixin = {
  created: function () {
    console.log('混入對(duì)象的鉤子被調(diào)用')
  }
}

new Vue({
  mixins: [mixin],
  created: function () {
    console.log('組件鉤子被調(diào)用')
  }
})

// => "混入對(duì)象的鉤子被調(diào)用"
// => "組件鉤子被調(diào)用"

值為對(duì)象的選項(xiàng),例如 methods睁枕、componentsdirectives官边,將被合并為同一個(gè)對(duì)象。兩個(gè)對(duì)象鍵名沖突時(shí)譬重,取組件對(duì)象的鍵值對(duì)

ar mixin = {
  methods: {
    foo: function () {
      console.log('foo')
    },
    conflicting: function () {
      console.log('from mixin')
    }
  }
}

var vm = new Vue({
  mixins: [mixin],
  methods: {
    bar: function () {
      console.log('bar')
    },
    conflicting: function () {
      console.log('from self')
    }
  }
})

vm.foo() // => "foo"
vm.bar() // => "bar"
vm.conflicting() // => "from self"
  • 當(dāng)然也可以 全局混入
  • 混入也可以進(jìn)行全局注冊(cè)罐氨。使用時(shí)格外小心臀规!一旦使用全局混入,它將影響每一個(gè)之后創(chuàng)建的 Vue 實(shí)例栅隐。使用恰當(dāng)時(shí)塔嬉,這可以用來(lái)為自定義選項(xiàng)注入處理邏輯。
// 為自定義的選項(xiàng) 'myOption' 注入一個(gè)處理器租悄。
Vue.mixin({
  created: function () {
    var myOption = this.$options.myOption
    if (myOption) {
      console.log(myOption)
    }
  }
})

new Vue({
  myOption: 'hello!'
})
// => "hello!"

5. watch

  • 類型:{ [key: string]: string | Function | Object | Array }
  • 一個(gè)對(duì)象谨究,鍵是需要觀察的表達(dá)式,值是對(duì)應(yīng)回調(diào)函數(shù)泣棋。值也可以是方法名胶哲,或者包含選項(xiàng)的對(duì)象。Vue 實(shí)例將會(huì)在實(shí)例化時(shí)調(diào)用 $watch()潭辈,遍歷 watch 對(duì)象的每一個(gè)屬性
var vm = new Vue({
  data: {
    a: 1,
    b: 2,
    c: 3,
    d: 4,
    e: {
      f: {
        g: 5
      }
    }
  },
  watch: {
    a: function (val, oldVal) {
      console.log('new: %s, old: %s', val, oldVal)
    },
    // 方法名
    b: 'someMethod',
    // 該回調(diào)會(huì)在任何被偵聽的對(duì)象的 property 改變時(shí)被調(diào)用鸯屿,不論其被嵌套多深
    c: {
      handler: function (val, oldVal) { /* ... */ },
      deep: true
    },
    // 該回調(diào)將會(huì)在偵聽開始之后被立即調(diào)用
    d: {
      handler: 'someMethod',
      immediate: true
    },
    e: [
      'handle1',
      function handle2 (val, oldVal) { /* ... */ },
      {
        handler: function handle3 (val, oldVal) { /* ... */ },
        /* ... */
      }
    ],
    //  如果只是監(jiān)聽e.f改變澈吨,可以只監(jiān)聽e.f,比監(jiān)聽e deep: true要好
    'e.f': function (val, oldVal) { /* ... */ }
  }
})
vm.a = 2 // => new: 2, old: 1

6. Vue.$set

  • 問(wèn)題
    如果在實(shí)例創(chuàng)建之后添加新的屬性到實(shí)例上寄摆,它不會(huì)觸發(fā)視圖更新谅辣。 或者 索引數(shù)組的修改,vue無(wú)法劫持該數(shù)據(jù)進(jìn)行響應(yīng)式變化

  • 當(dāng)你把一個(gè)普通的 JavaScript 對(duì)象傳入 Vue 實(shí)例作為 data 選項(xiàng)婶恼,Vue 將遍歷此對(duì)象所有的屬性桑阶,并使用Object.defineproperty把這些屬性全部轉(zhuǎn)為 getter/setter

  • 受現(xiàn)代 JavaScript 的限制 (以及廢棄 Object.observe),Vue 不能檢測(cè)到對(duì)象屬性的添加或刪除勾邦。由于 Vue 會(huì)在初始化實(shí)例時(shí)對(duì)屬性執(zhí)行 getter/setter 轉(zhuǎn)化過(guò)程蚣录,所以屬性必須在 data 對(duì)象上存在才能讓 Vue 轉(zhuǎn)換它,這樣才能讓它是響應(yīng)的

  • 解決方案

  • Vue 不允許在已經(jīng)創(chuàng)建的實(shí)例上動(dòng)態(tài)添加新的根級(jí)響應(yīng)式屬性 (root-level reactive property)检痰。然而它可以使用 Vue.set(object, key, value) 方法將響應(yīng)屬性添加到嵌套的對(duì)象上

Vue.set(vm.obj, 'e', 0)
您還可以使用 vm.$set 實(shí)例方法包归,這也是全局 Vue.set 方法的別名:

this.$set(this.obj,'e',02)

有時(shí)你想向已有對(duì)象上添加一些屬性,例如使用 Object.assign() 或 _.extend() 方法來(lái)添加屬性铅歼。但是公壤,添加到對(duì)象上的新屬性不會(huì)觸發(fā)更新。在這種情況下可以創(chuàng)建一個(gè)新的對(duì)象椎椰,讓它包含原對(duì)象的屬性和新的屬性:

// 代替 Object.assign(this.obj, { a: 1, e: 2 })
this.obj= Object.assign({}, this.obj, { a: 1, e: 2 })

7. Vue的通信方式
https://blog.csdn.net/u013262823/article/details/86570909

父子組件通信: v-bind:attr 厦幅,props
provide, inject (祖孫通信)
$attr、 $listeners
$parent, $children
ref
$emit, $on
Vuex

provide inject
父組件

<template>
  <div class="test">
    <son prop="data"></son>
  </div>
</template>
 
<script>
export default {
  name: "Test",
  provide: {
    name: "Garrett"
  }
};
</script>

孫組件

<template>
    <div>
        {{name}}
    </div>
</template>
 
<script>
export default {
    name: 'Grandson',
    inject: [name]
}
</script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末慨飘,一起剝皮案震驚了整個(gè)濱河市确憨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瓤的,老刑警劉巖休弃,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異圈膏,居然都是意外死亡塔猾,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門稽坤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)丈甸,“玉大人,你說(shuō)我怎么就攤上這事尿褪∧览蓿” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵杖玲,是天一觀的道長(zhǎng)顿仇。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么夺欲? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任跪帝,我火速辦了婚禮,結(jié)果婚禮上些阅,老公的妹妹穿的比我還像新娘伞剑。我一直安慰自己,他們只是感情好市埋,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布黎泣。 她就那樣靜靜地躺著,像睡著了一般缤谎。 火紅的嫁衣襯著肌膚如雪抒倚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天坷澡,我揣著相機(jī)與錄音托呕,去河邊找鬼。 笑死频敛,一個(gè)胖子當(dāng)著我的面吹牛项郊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播斟赚,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼着降,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了拗军?” 一聲冷哼從身側(cè)響起任洞,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎发侵,沒(méi)想到半個(gè)月后交掏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刃鳄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年盅弛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铲汪。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡熊尉,死狀恐怖罐柳,靈堂內(nèi)的尸體忽然破棺而出掌腰,到底是詐尸還是另有隱情,我是刑警寧澤张吉,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布齿梁,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏勺择。R本人自食惡果不足惜创南,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望省核。 院中可真熱鬧稿辙,春花似錦、人聲如沸气忠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)旧噪。三九已至吨娜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間淘钟,已是汗流浹背宦赠。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留米母,地道東北人勾扭。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像爱咬,于是被迫代替她去往敵國(guó)和親尺借。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • VUE介紹 Vue的特點(diǎn)構(gòu)建用戶界面精拟,只關(guān)注View層簡(jiǎn)單易學(xué)燎斩,簡(jiǎn)潔、輕量蜂绎、快速漸進(jìn)式框架 框架VS庫(kù)庫(kù)栅表,是一封裝...
    多多醬_DuoDuo_閱讀 2,719評(píng)論 1 17
  • Vue 實(shí)例 屬性和方法 每個(gè) Vue 實(shí)例都會(huì)代理其 data 對(duì)象里所有的屬性:var data = { a:...
    云之外閱讀 2,221評(píng)論 0 6
  • 主要還是自己看的,所有內(nèi)容來(lái)自官方文檔师枣。 介紹 Vue.js 是什么 Vue (讀音 /vju?/怪瓶,類似于 vie...
    Leonzai閱讀 3,358評(píng)論 0 25
  • 以下內(nèi)容是我在學(xué)習(xí)和研究Vue時(shí),對(duì)Vue的特性践美、重點(diǎn)和注意事項(xiàng)的提取洗贰、精練和總結(jié),可以做為Vue特性的字典陨倡; 1...
    科研者閱讀 14,095評(píng)論 3 24
  • 前言 記錄平時(shí)學(xué)到的知識(shí)敛滋,標(biāo)題寫的大氣一點(diǎn),也算是給自己一點(diǎn)鼓勵(lì)兴革,希望在技術(shù)這條路可以遠(yuǎn)走越遠(yuǎn)绎晃,路越走越寬~ 文中...
    徐國(guó)軍_plus閱讀 1,044評(píng)論 0 9