vue(七)

 

 

组件的自定义事件


1. 一种组件问通信的方式,适用于 子组件===>父组件
2.使用场量: A是父组件。B是子组件。B想给A传数据,那么就要在A中给B绑定自定义事件(事件的回调在A中)。
3.绑定自定义事件:

        1.第一种方式,在父组件中: <Demo @atguigu-"test"/> 或<Demo v-on:atguigyu-"test"/>
        2.第二种方式。在父组件中:

<Dome ref="demo"/>

mounted(){
    this.$refs.xxx.$on("atguigu" ,this.test)
}


3.若想让自定义事件只能触发一次,可以使用once修饰符,或$once方法。
4.触发自定义事件: this.$emit("atguigu" ,数据)
5.解绑自定义事件this.off(" atguigu')
6.组件上也可以绑定原生DOM事件,需要使用native修饰符。
7.注意:通过this. $refs.xxx.$on( 'atguigu' ,回调)绑定白定义事件时,回调要么配置在methods中,要么用箭头函数,否则this指向会出问题!

 

实例:

app.vue

<template>
  <div id="app">
    <h2>xxx:{{name}}</h2>

    <!--通过父组件给子组件绑定一个自定义事件实现:子给父传递数据 (第一种写法。使用@或v-on)-->
    <School @atguigu="getSchoolName" />

    <!--通过父组件给子组件绑定一个白定义事件实现: 子给父传递数据(第二种写法。使用ref)-->
    <Student ref="student" />

  </div>
</template>

<script>
  import School from './components/School'
  import Student from './components/Student'
export default {
    name: 'App',
    data() {
      return {
        name:""
      }
    },
    components: {
       School,
       Student
    },
    methods: {
      getSchoolName(name) {
        console.log(name),
        this.name=name
      },
      getStudentName(name,...params) {
        console.log(name+" "+params),
          this.name = name
      }
    },
    mounted() {
      //第二种写法。使用ref的
      this.$refs.student.$on("atguigu", this.getStudentName)
     
    }
}
</script>

<style scoped>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
  background-color:#b6ff00;
}
</style>

 School.vue

 

<template>
  <div class="demo">
    <div>{{schoolName}}</div>
    <div>{{schoolAdress}}</div>
    <button @click="SetShoolName">上传学校姓名</button>
  </div>
</template>

<script>


  export default {
    name: 'School',
    data() {
      return {
        schoolName: 'xuexiao',
        schoolAdress: 'dizhi'
      }
    },
    methods:{
      SetShoolName() {
        console.log("school:" + this.schoolName)
        this.$emit("atguigu", this.schoolName)
      }
    }
  }
</script>

<style scoped>
  .demo{
    background-color:royalblue;
  }
</style>

Student.vue

<template>
  <!--组件的结构-->
  <div class="demo2">
    <div>{{name}}</div>
    <div>{{age}}</div>
    <button @click="SetStudentName">上传学生姓名</button>
  </div>
</template>

<script>
  export default {
    name: 'Student',
    data() {
      return {
        name: "Alice",
        age:"18"
      }
    },
    methods: {
      //触发Student组件实例身上的atguigu事件
      SetStudentName() {
        this.$emit("atguigu", this.name,100,200,300)
      }
    }
  }
</script>

<style scoped>
  .demo2{
    background-color:greenyellow;
  }
</style>

 

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y2X5Z-O5a2k5be3,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

解绑

<template>
  <!--组件的结构-->
  <div class="demo2">
    <div>{{name}}</div>
    <div>{{age}}</div>
    <button @click="SetStudentName">上传学生姓名</button>
    <button @click="unbind">解绑</button>
  </div>
</template>

<script>
  export default {
    name: 'Student',
    data() {
      return {
        name: "Alice",
        age:"18"
      }
    },
    methods: {
      //触发Student组件实例身上的atguigu事件
      SetStudentName() {
        this.$emit("atguigu", this.name,100,200,300)
      },
      unbind() {
        //this.$off("atguigu")             解绑单个自定义事件
        //this.$off(["atguigu","demo"])    解绑多个自定义事件
        this.$off()                      //解绑全部自定义事件
      }
    }
  }
</script>

 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y2X5Z-O5a2k5be3,size_20,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y2X5Z-O5a2k5be3,size_11,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y2X5Z-O5a2k5be3,size_20,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y2X5Z-O5a2k5be3,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值