在vue2.0中父组件如何触发子组件的自定义方法?

如果我在父组件的button上绑定了click事件,我想当点击button时可以触发子组件(单文件的子组件xx.vue)的某个方法(如fn1),要这样的效果该怎样实现?之前看了vue1的文档实例里面有methods和events这两者有什么区别,为什么在vue2去掉dispatch后我用emit(‘fn’),如果fn放在events会没有响应,而放在methods里面才会被触发到?

子组件:

[html] view plain copy
print ?
  1. >  
  2. <html lang=“en”>  
  3. <head>  
  4.     <meta charset=“UTF-8”>  
  5.     <title>Documenttitle>  
  6.     <script src=“vue.js”>script>  
  7. head>  
  8. <body>  
  9. <div id=“parent”>   
  10.     <input type=“text” name=“” id=“” v-model=“msg” />  
  11.     <input type=“button” id=“” value=“dianji” @click=“clickDt” />  
  12.     <user-profile ref=“profile”>user-profile>    
  13. div>    
  14.     
  15. <script>    
  16.     Vue.component(‘user-profile’, {    
  17.         template: ’<span>{{ msg }}span>‘,    
  18.         data: function () {    
  19.             return {  
  20.                 msg: 123  
  21.             };  
  22.         },    
  23.         methods: {    
  24.             greet: function (msg) {    
  25.                 console.log(msg);    
  26.             }    
  27.         }    
  28.     
  29.     })    
  30. //      var parent = new Vue({el: ’#parent’});    
  31. //      var child = parent.refs.profile;    
  32. //      child.greet();        new Vue({          el:"#parent",          data:{              msg:""          },          methods: {                  clickDt(){                  this.refs.profile.greet(this.msg);  
  33.             }  
  34.         }  
  35.     })  
  36. script>    
  37. body>  
  38. html>  



    
    Document
    




 
   

[javascript] view plain copy
print ?
  1.   
  2. ”text/javascript”>  
  3. import { mapGetters, mapActions } from ‘vuex’  
  4. var bus = new   
  5. export default {  
  6.    props:[’parentmsg’],  
  7.    data(){  
  8.     return {  
  9.       msg:’hello’,  
  10.       something:this.parentmsg  
  11.     }  
  12.    },  
  13.    ready(){  
  14.       console.log(window.location)  
  15.    },  
  16.    events:{  
  17.       emitchild(){  
  18.         console.log(’ds0’)  
  19.       }  
  20.    },  
  21.    methods:{  
  22.     …mapActions([  
  23.        ’incrementCounter’,  
  24.        ’showMask’  
  25.     ]),  
  26.     fdsf(){  
  27.       this.emit('clickfn',this.msg);  
  28.     },      some(){        this.emit(‘childjian’,this.msg)  
  29.     },  
  30.     childdomeing(){  
  31.       console.log(’child99’)  
  32.     },  
  33.     emitchild(){  
  34.         console.log(’ds0’)  
  35.       }  
  36. }  
  37. }  
  38.   



父组件

 
   

[javascript] view plain copy
print ?
  1.   
  2. ”text/ecmascript-6”>  
  3.     import Display from ‘./Display.vue’;  
  4.     import Increment from ‘./Increment.vue’;  
  5.     import store from ‘../vuex/store’ ;  
  6.     import Mask from ‘./Mask.vue’;  
  7.     import Xinjian from ‘./xinjian.vue’  
  8.     export default{  
  9.         components:{  
  10.             Display:Display,  
  11.             Increment:Increment,  
  12.             showMask:Mask,  
  13.             showInfo:Xinjian  
  14.         },          
  15.         data(){  
  16.             return {  
  17.                something:’hello child’  
  18.             }  
  19.         },  
  20.         computed:{  
  21.             showHide(){  
  22.                 return store.state.showMask;  
  23.             }  
  24.         },  
  25.         store:store,  
  26.         events:{  
  27.               
  28.         },  
  29.         methods:{  
  30.             parentjian(msg){  
  31.                 console.log(’child click:’+msg)  
  32.             },  
  33.             dosomething(msg){  
  34.                 console.log(10);  
  35.                 if(msg)  
  36.                     console.log(msg)  
  37.                 console.log(this.children)  
  38.             },              emitchild(msg){                  console.log(999)                  this.emit(‘showMask’,msg);  
  39.             }  
  40.         }  
  41.     }  
  42.   


Vue 2.0 废弃了 broadcast dispatch,不过可以用 children访 refs 访问子组件,然后直接调用子组件的方法。
由于 events 实例选项属性已废弃,因此只能通过 created 钩子实现对自定义事件的监听,使用 this. onthis. one。参见:
https://vuejs.org/v2/guide/mi…



组件中的v-on绑定自定义事件理解

每个 Vue 实例都实现了事件接口(Events interface),即:

使用 $on(eventName) 监听事件

使用 $emit(eventName) 触发事件

Vue的事件系统分离自浏览器的EventTarget API。尽管它们的运行类似,但是$on 和 $emit 不是addEventListener 和 dispatchEvent 的别名。

另外,父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件。 
下面是一个例子: 
在vue2.0中父组件如何触发子组件的自定义方法?_第1张图片




你可能感兴趣的:(vue2.0)