vue的組件就是一個個vue文件,裏面包含3個部分:
template:html模版
style:css樣式
script:js代碼css
<template> <!-- 只能有一個根標籤 --> <div> <p>{{msg}}</p> </div> </template> // lang表示所使用的CSS 預處理語言 // scoped表示裏面的樣式做用範圍此侷限在此組件中 <style lang="less" scoped> p{ color:green } </style> <script> export default{ data(){ return{ msg:'hello wolrd' } }, methods:{ } } </script>
在父組件的script標籤中使用import引入相關組件的vue文件,並註冊到components對象中html
// App.vue <script> import Hello from './components/Hello.vue' export default { data() { return { } }, components: { Hello } } </script>
以後能夠以標籤的形式在模版中使用此Hello組件vue
<template> <div> <Hello /> </div> </template>
(1)在父組件中把要傳遞的數據經過屬性的形式綁定到子組件標籤上
(2)在子組件中經過props屬性接收父組件傳遞的數據(屬性名是什麼,接收的名稱就是什麼)npm
父組件:app
<template> <div id="app"> <h1>App組件</h1> <child :msg="msg" :person="person" :list="list"></Child> </div> </template> <script> import Child from "./components/Child.vue" export default { data() { return { msg:"我是父組件傳遞的值", person:{name:"張三丰",age:108}, list:['蘋果','西瓜','桃子'] } }, components: { Child } } </script>
子組件:less
<template> <div> <P>{{msg}}</P> <p>{{person.name}}--{{person.age}}</p> <ul> <li v-for="(item,index) in list" :key="index">{{item}}</li> </ul> </div> </template> <script> export default { data () { return { } }, props:['msg','person','list'] } </script>
props接收父組件傳遞的數據有2種語法:簡單語法和對象語法函數
//簡單語法 props:['msg','person','list']
//對象語法,會檢測傳遞值的數據類型 props:{ msg:String, list:Array, person:Object },
自定義事件能夠將父組件的某個函數暴漏給子組件,子組件能夠經過特定的方式來調用這個函數,並以傳參的形式將子組件的數據傳遞給父組件
(1)在父組件中經過v-on的形式綁定一個自定義事件到子組件標籤上,並設置自定義事件觸發時的回調
(2)子組件經過this.$emit()方法來觸發該自定義事件,並傳入相應的參數給回調函數this
//父組件 //eventName爲自定義事件的名稱 //showMsg爲mthods中定義的方法 <child @eventName="showMsg"></Child>
//子組件使用this.$emit()觸發自定義事件 this.$emit('eventName',this.content)
還能夠使用js語法來爲自組件綁定自定義事件
語法:$on('事件名稱',回調函數)code
//設定子組件標籤的ref標識 <child ref="child"></Child>
//經過ref標識找到子組件,併爲其添加子定義事件 mounted(){ this.$refs.child.$on('eventName',this.showMsg) }
經過第三方庫來進行組件通訊,例如pubsub-js,使用這個庫能夠讓任意兩個組件進行通訊
訂閱:PubSub.subscribe('事件名稱', 回調函數);
發佈:PubSub.publish('事件名稱', 傳遞的參數);component
安裝pubsub-js
npm install pubsub-js -S
引入pubsub-js (訂閱和發佈的組件都須要引入
import PubSub from 'pubsub-js'
組件1添加訂閱(至關於添加事件監聽)
<script> import PubSub from 'pubsub-js' export default { data () { return { content:"" } }, mounted(){ //在回調函數中添加訂閱 PubSub.subscribe('eventName', (eventName,data)=> { //參數一是固定的,爲事件名稱 //參數二纔是傳遞的參數 console.log(eventName,data) this.handleClick(data) }) }, methods:{ handleClick(data){ this.content = data } } } </script>
組件2發佈消息(至關於觸發事件監聽)
<script> export default { data () { return { content:"我是傳遞的參數" } }, methods:{ handleClick(){ //發佈(觸發事件監聽) PubSub.publish('eventName', this.content); } } } </script>