Vue中有個很是重要的核心思想,就是組件化,組件化是爲了代碼複用html
組件化,就像一個電腦主機裏的主板,有內存條的插口,有硬盤,光驅等等的插口,咱們的項目,就像一個電腦主機,經過各類組件化的模塊(硬盤、內存等),來拼合成一個完整的電腦。
vue
(圖片來源 vue-組件化應用構建)vuex
如圖,每個塊都是一個組件,由許許多多的組件拼合而成,能夠無限的嵌套下去api
組件部分數組
<template> <div></div> </template> <script> export default { name:"myAlert" }; <style></style>
使用者部分app
<template> <div> <myAlert></myAlert> <!-- 實例中使用組件 --> </div> </template> <script> import myAlert from '@/components/alert.vue';//導入本身寫的組件 export default { components:{myAlert}//在這個vue實例中註冊組件 }; </script> <style></style>
// 定義名爲 todo-item 的新組件 Vue.component('myAlert', { template: '<div>這是一個彈框</div>' }) var app = new Vue(...)
html部分使用ide
<div> <myAlert></myAlert> </div>
Vue
中存在的組件之間傳值的方案以下組件化
子組件中聲明props
,父組件往對應的props值中傳遞
ui
父組件使用this.$refs.組件名.變量
來選中子組件並修改子組件的內容this
父組件使用this.$children[0].變量
來選中並修改子組件的內容
須要注意的是:由官網vm.$children得知
$children 並不保證順序,也不是響應式的
因此通常不建議使用此方法來進行傳值,由於不能很穩定的找到指定組件的實例,除非這個頁面只有一個子組件
另外,此例中,this.$children[0]
不是響應式的this.$children[0].變量
是響應式的。
此處爲觀察者模式
this.$emit('confirm','點擊了肯定')
來派發confirm
事件<myAlert @confirm='successCallback'></myAlert>
來監聽事件;confirm
事件的派發者和監聽者,都是myAlert
組件,myAlert
組件監聽完畢後將調用父組件的successCallback
回調事件,固然這個監聽的事件名
和觸發的事件名
都是能夠自定義
的。$parents
或者$root
//組件一 this.$parents.$on('foo',(e)=>{ console.log(e);//此處e爲$emit時傳入的值 }) //組件二 this.$parents.$emit('foo','bar');//控制檯輸出bar
概念,所謂跨輩分傳值,就是
祖輩->父輩->子輩->孫輩->...
其中,垮了一個輩分或多個輩分的就是跨輩分傳值,例如,祖輩及孫輩
因爲多級嵌套,使用props
傳遞顯然是不現實的
針對這種狀況,vue
提供了 provide/inject
兩個API
來完成這件事
provide
聲明一個變量inject
來注入祖輩聲明的變量寫法:
//祖輩 export default { provide(){//此處能夠傳入動態變量,與data相似 return { componentYeye:this } }, data(){ return { yeyedeBianliang:'爺爺的變量' } } } //孫輩 export default { inject:['componentYeye'],//此處爲數組,注入祖輩聲明的變量 mounted(){ console.log(this.componentYeye.yeyedeBianliang);//爺爺的變量 } }
注意
vuex
中建議變量修改都是用commit
相似所謂原型掛載,就是在main.js
中將公共變量,事件,都掛在到Vue原型上
//main.js Vue.prototype.$globalData = {} Vue.prototype.$sayName = function(e){ console.log('個人名字是',e) } new Vue({...}) //組件一 Vue.prototype.$globalData.name='小明'; this.$sayName('小王');//個人名字是小王 //組件二 console.log(this.$sayName.name);//小明 this.$sayName('小王');//個人名字是小王
所謂事件總線,就是在當前的Vue
實例以外,再建立一個Vue實例來專門進行變量傳遞,事件處理,管理回調事件等
//main.js中 Vue.prototype.$bus = new Vue(); new Vue({...}) //組件一 this.$bus.$on('sayName',(e)=>{ console.log('個人名字是',e) }) //組件二 this.$bus.$emit('sayName','小明');//個人名字是 小明
Vuex
是Vue
提供的一種,專門用來管理vue
中的公共狀態,事件等等。詳見 從0開始探究vue-公共變量的管理