iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 13
0

https://ithelp.ithome.com.tw/upload/images/20190912/20110850dsypfXRkNe.jpg

超緊繃!30天Vue.js學習日記 父與子的敲敲話(2)

在昨天的文章中,我們了解到如何使用props將數據傳給子組件,那有沒有能讓子組件與父組件溝通的方法呢?當然有,我們今天便會針對這個主題介紹:$emit

$emit怎麼用?簡單範例告訴你:

<div id="app">
	{{username}}
	<my-component @pushname="getname" >
	</my-component>
</div>
<script type="text/javascript">
Vue.component('my-component',{
methods: {
    updateUsername() {
      let vue = this;
      vue.$emit("pushname", vue.username);
      console.log(vue.username);
    }
  },
data(){
	return{username:''}
},
template:'<div><input type="text" v-model="username"/><button @click="updateUsername">更新</button></div>'
});
new Vue({
  el:'#app',
  data:{
  	username:'IAN'
  },
  methods: {
    getname(newName) {
      // console.log(newName)
      let vm = this;
      vm.username = newName;
    }
  }
});
</script>

在上述範例中當按鈕被觸及後,會呼叫updateUsername(),並使用$emit將要更新的username傳給我們的根實例,然後我們藉由:
<my-component @pushname="getname">
接獲pushname,並觸發getname去做到渲染根實例中的data,是不是很簡單阿?其實還蠻複雜的
在這邊建議大家可以看著範本練習,便會比較了解$emit的用法!

介紹完子組件對父組件的傳遞,那我們能不能讓非父子組件進行溝通呢?
當然可以,我們在這邊提供官網說明:

https://ithelp.ithome.com.tw/upload/images/20190924/20110850ZXDt0uuuPi.png

看來是相當精簡的解說呢XD
不過我還是提供了範例,以防大家看不懂:

<div id="app">
<com1></com1>
<com2></com2>
</div>
<script type="text/javascript">
Vue.component('com1',{
template:'<div><button @click="submit">送出</button></div>',
methods:{
	submit(){
		this.$root.bus.$emit('eventName', 'hello');
		// console.log('sucess');
	}
}
});
Vue.component('com2',{
data(){
	return{
		msg:''
	}
},
template:'<div>{{msg}}</div>',
created(){
    this.$root.bus.$on('eventName', value => {
      this.print(value)
    })
  },
  methods: {
    print(value) {
      let vm = this;
      vm.msg = value;
      // console.log('catch',value);
    }
  },
  beforeDestroy() {
     vm.$root.bus.$off('eventName');
  }
});
new Vue({
	el:'#app',
	data:{
		bus : new Vue()
	}
})
</script>

根據上面的範例,我們先在根實例中創建一個bus 實例,這樣一來com1以及com2就能調用它,組件com1透過$emit將資料傳向bus , com2再藉由$on獲得com1傳遞的值!

本日範例在此下載:

https://drive.google.com/open?id=1cYNaJzdxGuKaQXv4MHuP5L-Jf6lNARNv

今天的教學到這邊結束,我們明天見!


上一篇
[Vue.js][日記]父與子的敲敲話...
下一篇
[Vue.js][日記]極致廢話版的SLOT教學
系列文
超緊繃!30天Vue.js學習日記33

尚未有邦友留言

立即登入留言