詳解vue.js2.0父組件點(diǎn)擊觸發(fā)子組件方法
之前關(guān)于vue.js2.0父組件的一點(diǎn)學(xué)習(xí),最近需要回顧,就順便發(fā)到隨筆上了
<body> <div id="counter-event-example"> <p>{{ total }}</p> <button-counter v-on:ee="incrementTotal"></button-counter> <button-counter v-on:ee="incrementTotal"></button-counter> </div> <script> Vue.component('button-counter', { template: '<button v-on:click="increment">{{ counter }}</button>', data: function () { return { counter: 0 } }, methods: { increment: function () { this.counter += 1 this.$emit('ee', 'cc' ) } }, }) new Vue({ el: '#counter-event-example', data: { total: 'arg' }, methods: { incrementTotal: function (b) { this.total = b + '1'; } } }) </script> </body>
子組件通過(guò)$emit觸發(fā)父組件的事件,$emit后面的參數(shù)是向父組件傳參,注意,父組件的事件處理函數(shù)直接寫(xiě)函數(shù)名即可,不要加(),參數(shù)直接傳遞到了父組件的methods的事件處理函數(shù)了。
另外,寫(xiě)一個(gè)小拾遺。vue子組件用了定義模板組件功能,然后在父組件里定義一個(gè)HTML元素綁定這個(gè)子組件后才能在父組件通過(guò)這個(gè)HTML元素使用。
再說(shuō)一個(gè)非常方便的v-ref
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="vue.js"></script> </head> <body> <div id="parent"> <input type="text" name="" id="" v-model="msg" /> <input type="button" id="" value="dianji" @click="clickDt" /> <user-profile ref="profile"></user-profile> </div> <script> Vue.component('user-profile', { template: '<span>{{ msg }}</span>', data: function () { return { msg: 123 }; }, methods: { greet: function (msg) { console.log(msg); } } }) // var parent = new Vue({el: '#parent'}); // var child = parent.$refs.profile; // child.greet(); new Vue({ el:"#parent", data:{ msg:"" }, methods: { clickDt(){ this.$refs.profile.greet(this.msg); } } }) </script> </body> </html>
Vue2.0組件間數(shù)據(jù)傳遞
Vue1.0組件間傳遞
- 使用$on()監(jiān)聽(tīng)事件;
- 使用$emit()在它上面觸發(fā)事件;
- 使用$dispatch()派發(fā)事件,事件沿著父鏈冒泡;
- 使用$broadcast()廣播事件,事件向下傳導(dǎo)給所有的后代
Vue2.0后$dispatch(),$broadcast()被棄用,見(jiàn)https://cn.vuejs.org/v2/guide/migration.html#dispatch-和-broadcast-替換
1,父組件向子組件傳遞場(chǎng)景:Father上一個(gè)輸入框,根據(jù)輸入傳遞到Child組件上。
父組件:
<template> <div> <input type="text" v-model="msg"> <br> //將子控件屬性inputValue與父組件msg屬性綁定 <child :inputValue="msg"></child> </div> </template> <style> </style> <script> export default{ data(){ return { msg: '請(qǐng)輸入' } }, components: { child: require('./Child.vue') } } </script>
子組件:
<template> <div> <p>{{inputValue}}</p> </div> </template> <style> </style> <script> export default{ props: { inputValue: String } } </script>
2,子組件向父組件傳值場(chǎng)景:子組件上輸入框,輸入值改變后父組件監(jiān)聽(tīng)到,彈出彈框
父組件:
<template> <div> //message為子控件上綁定的通知;recieveMessage為父組件監(jiān)聽(tīng)到后的方法 <child2 v-on:message="recieveMessage"></child2> </div> </template> <script> import {Toast} from 'mint-ui' export default{ components: { child2: require('./Child2.vue'), Toast }, methods: { recieveMessage: function (text) { Toast('監(jiān)聽(tīng)到子組件變化'+text); } } } </script>
子組件:
<template> <div> <input type="text" v-model="msg" @change="onInput"> </div> </template> <script> export default{ data(){ return { msg: '請(qǐng)輸入值' } }, methods: { onInput: function () { if (this.msg.trim()) { this.$emit('message', this.msg); } } } } </script>
vue2.0父子組件以及非父子組件如何通信
1.父組件傳遞數(shù)據(jù)給子組件
父組件數(shù)據(jù)如何傳遞給子組件呢?可以通過(guò)props屬性來(lái)實(shí)現(xiàn)
父組件:
<parent> <child :child-msg="msg"></child>//這里必須要用 - 代替駝峰 </parent> data(){ return { msg: [1,2,3] }; }
子組件通過(guò)props來(lái)接收數(shù)據(jù):
方式1:
props: ['childMsg']
方式2 :
props: { childMsg: Array //這樣可以指定傳入的類型,如果類型不對(duì),會(huì)警告 }
方式3:
props: { childMsg: { type: Array, default: [0,0,0] //這樣可以指定默認(rèn)的值 } }
這樣呢,就實(shí)現(xiàn)了父組件向子組件傳遞數(shù)據(jù).
2.子組件與父組件通信
那么,如果子組件想要改變數(shù)據(jù)呢?這在vue中是不允許的,因?yàn)関ue只允許單向數(shù)據(jù)傳遞,這時(shí)候我們可以通過(guò)觸發(fā)事件來(lái)通知父組件改變數(shù)據(jù),從而達(dá)到改變子組件數(shù)據(jù)的目的.
子組件:
<template> <div @click="up"></div> </template> methods: { up() { this.$emit('upup','hehe'); //主動(dòng)觸發(fā)upup方法,'hehe'為向父組件傳遞的數(shù)據(jù) } }
父組件:
<div> <child @upup="change" :msg="msg"></child> //監(jiān)聽(tīng)子組件觸發(fā)的upup事件,然后調(diào)用change方法 </div> methods: { change(msg) { this.msg = msg; } }
3.非父子組件通信
如果2個(gè)組件不是父子組件那么如何通信呢?這時(shí)可以通過(guò)eventHub來(lái)實(shí)現(xiàn)通信.
所謂eventHub就是創(chuàng)建一個(gè)事件中心,相當(dāng)于中轉(zhuǎn)站,可以用它來(lái)傳遞事件和接收事件.
let Hub = new Vue(); //創(chuàng)建事件中心
組件1觸發(fā):
<div @click="eve"></div> methods: { eve() { Hub.$emit('change','hehe'); //Hub觸發(fā)事件 } }
組件2接收:
<div></div> created() { Hub.$on('change', () => { //Hub接收事件 this.msg = 'hehe'; }); }
這樣就實(shí)現(xiàn)了非父子組件之間的通信了.原理就是把Hub當(dāng)作一個(gè)中轉(zhuǎn)站!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue-cli和v-charts實(shí)現(xiàn)可視化圖表過(guò)程解析
這篇文章主要介紹了vue-cli和v-charts實(shí)現(xiàn)可視化圖表過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10vue cli3.x打包后如何修改生成的靜態(tài)資源的目錄和路徑
這篇文章主要介紹了vue cli3.x打包后如何修改生成的靜態(tài)資源的目錄和路徑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04詳解處理Vue單頁(yè)面應(yīng)用SEO的另一種思路
這篇文章主要介紹了詳解處理Vue單頁(yè)面應(yīng)用SEO的另一種思路,本文主要針對(duì) vue 2.0 單頁(yè)面 Meta SEO 優(yōu)化展開(kāi)介紹,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-11-11vue+element樹(shù)形選擇器組件封裝和使用方式
這篇文章主要介紹了vue+element樹(shù)形選擇器組件封裝和使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2020-04-04Nuxt項(xiàng)目支持eslint+pritter+typescript的實(shí)現(xiàn)
這篇文章主要介紹了Nuxt項(xiàng)目支持eslint+pritter+typescript的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05使用Vue-neo4j實(shí)現(xiàn)繪制三國(guó)人物圖譜關(guān)系
這篇文章主要介紹了使用Vue-neo4j實(shí)現(xiàn)繪制三國(guó)人物圖譜關(guān)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04Vue中使用crypto-js AES對(duì)稱加密算法實(shí)現(xiàn)加密解密
?在數(shù)字加密算法中,通過(guò)可劃分為對(duì)稱加密和非對(duì)稱加密,本文主要介紹了Vue中使用crypto-js AES對(duì)稱加密算法實(shí)現(xiàn)加密解密,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03vue2.0項(xiàng)目實(shí)現(xiàn)路由跳轉(zhuǎn)的方法詳解
這篇文章主要介紹了vue2.0項(xiàng)目實(shí)現(xiàn)路由跳轉(zhuǎn)的詳細(xì)方法,非常不錯(cuò),具有一定的參考借鑒借鑒價(jià)值,需要的朋友可以參考下2018-06-06