当前位置:   article > 正文

$emit,$on,$off--vue_$emit注销

$emit注销

父组件可以使用 props 把数据及父组件的的方法传给子组件。例:@click='close'
子组件可以使用 $emit 触发父组件的自定义事件。例:close(){ this.$emit('closeModal')}

  1. vm.$emit( event, arg ) //触发当前实例上的事件,arg是传递给父组件的参数
  2. vm.$on( event, fn ) //监听event事件后运行 fn
  3. $off(type, fn) //注销消息方法 type:消息名称 fn:消息回调函数

$emit:

this $emit(‘自定义事件名’,要传送的数据);触发当前实例上的事件,要传递的数据会传给监听器

  1. //父组件:
  2. <template>
  3. <view class="content">
  4. <!-- @closeModal="closeModal" 将closeBodel方法传递给子组件 -->
  5. <service-modal :tel="tel" @closeModal="closeModal" @tip="tip" />
  6. </view>
  7. </template>
  8. <script>
  9. import serviceModal from '@/components/service-modal'
  10. export default {
  11. data() {
  12. return {tel:"12345678900"}
  13. },
  14. components: {
  15. serviceModal
  16. },
  17. methods: {
  18. closeModal(){
  19. console.log("关闭弹窗方法调用")
  20. },
  21. tip(data){
  22. console.log(data)
  23. },
  24. },
  25. }
  26. </script>
  27. <style lang="scss"></style>
  1. //子组件:
  2. <template>
  3. <view class="modal">
  4. <view class="tel-tit">
  5. <view>客服电话</view>
  6. </view>
  7. <view class="tel-con">
  8. <view>{{tel}}</view>
  9. <view>工作时间:(09:00-18:00)</view>
  10. </view>
  11. <view class="tel-btn">
  12. <!-- 子组件内部点击事件closeModal -->
  13. <view @click="closeModal">取消</view>
  14. </view>
  15. </view>
  16. </template>
  17. <script>
  18. import { mapGetters } from 'vuex';
  19. export default {
  20. name:'modal',
  21. props: {
  22. tel: {
  23. type: [String,Number]
  24. },
  25. },
  26. data(){
  27. return{}
  28. },
  29. created() {},
  30. computed: {},
  31. methods: {
  32. closeModal(){ // 使用$emit调用父组件方法
  33. this.$emit('closeModal')
  34. this.$emit('tip','弹窗已被关闭!')
  35. // 执行完毕之后控制台会打印两句话
  36. // 关闭弹窗方法调用
  37. // 弹窗已被关闭!
  38. },
  39. },
  40. }
  41. </script>
  42. <style lang="scss" scoped></style>

$on

this.$on ( ′ 事 件 名 ′ ,callback ); callback回调emit要传送的数据

监听当前实例上的自定义事件。事件可以由vm.emit触发。回调函数会接收所有传入事件触发函数的额外参数。注:使用$on监听后,记得使用$off`销毁事件。

$off

        1)如果没有提供参数,则移除所有的事件监听器;

        2)如果只提供了事件,则移除该事件所有的监听器;

        3)如果同时提供了事件与回调,则只移除这个回调的监听器。

使用$on和$off后,子组件发生变化

  1. //父组件依然使用上边$emit的父组件
  2. //子组件:
  3. <template>
  4. <view class="modal">
  5. <view class="tel-tit">
  6. <view>客服电话</view>
  7. </view>
  8. <view class="tel-con">
  9. // {{}} 使用插值表达式引用tel(有的人也叫它大胡子表达式)
  10. <view>{{tel}}</view>
  11. <view>工作时间:(09:00-18:00)</view>
  12. </view>
  13. <view class="tel-btn">
  14. <view @click="closeModal">取消</view>
  15. </view>
  16. </view>
  17. </template>
  18. <script>
  19. import { mapGetters } from 'vuex';
  20. export default {
  21. name:'modal',
  22. props: {
  23. tel: {
  24. type: [String,Number]
  25. },
  26. },
  27. data(){
  28. return{}
  29. },
  30. created() {},
  31. computed: {},
  32. mounted() {
  33. //使用$on去监听$emit
  34. //当$emit里面的数据变化的时候,就会触发$on中的第二个参数是个函数
  35. this.$on('closeModal',res=>{
  36. console.log(res);
  37. })
  38. },
  39. destoryed() {
  40. //移除事件监听
  41. this.$off("closeModal");
  42. },
  43. methods: {
  44. closeModal(){ // 使用$emit调用父组件方法
  45. this.$emit('closeModal')
  46. this.$emit('tip','弹窗已被关闭!')
  47. // 执行完毕之后控制台会打印两句话
  48. // 关闭弹窗方法调用
  49. // 弹窗已被关闭!
  50. },
  51. },
  52. }
  53. </script>
  54. <style lang="scss" scoped></style>

官方文档:$emit | Vue.js

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/222752
推荐阅读
相关标签
  

闽ICP备14008679号