• 组件自定义事件


    组件自定义事件是一种组件间通信的方式,适用于:子组件 ===> 父组件

    使用场景

    A是父组件,B是子组件,B想给A传数据,那么就要在A中给B绑定自定义事件(事件的回调在A中)。

    绑定自定义事件:

    第一种方式,在父组件中:v-on:atguigu="test"/>

    App.vue

    1. <template>
    2. <div class="app">
    3. <Student @atguigu="getStudentName"/>
    4. div>
    5. template>
    6. <script>
    7. import Student from './components/Student'
    8. export default {
    9. name:'App',
    10. components:{Student},
    11. data() {
    12. return {
    13. msg:'你好啊!',
    14. studentName:''
    15. }
    16. },
    17. methods: {
    18. getStudentName(name,...params){
    19. console.log('App收到了学生名:',name,params)
    20. this.studentName = name
    21. }
    22. }
    23. }
    24. script>
    25. <style scoped>
    26. .app{
    27. background-color: gray;
    28. padding: 5px;
    29. }
    30. style>

    Student.vue

    1. <template>
    2. <div class="student">
    3. <button @click="sendStudentlName">把学生名给App</button>
    4. </div>
    5. </template>
    6. <script>
    7. export default {
    8. name:'Student',
    9. data() {
    10. return {
    11. name:'张三',
    12. }
    13. },
    14. methods: {
    15. sendStudentlName(){
    16. //触发Student组件实例身上的atguigu事件
    17. this.$emit('atguigu',this.name,666,888,900)
    18. }
    19. },
    20. }
    21. </script>
    22. <style lang="less" scoped>
    23. .student{
    24. background-color: pink;
    25. padding: 5px;
    26. margin-top: 30px;
    27. }
    28. </style>

    第二种方式,在父组件中:

    使用 this.$refs.xxx.$on() 这样写起来更灵活,比如可以加定时器啥的。

    App.vue

    1. <template>
    2. <div class="app">
    3. <!-- 通过父组件给子组件绑定一个自定义事件实现:子给父传递数据(第二种写法,使用ref) -->
    4. <Student ref="student"/>
    5. </div>
    6. </template>
    7. <script>
    8. import Student from './components/Student'
    9. export default {
    10. name:'App',
    11. components:{Student},
    12. data() {
    13. return {
    14. studentName:''
    15. }
    16. },
    17. methods: {
    18. getStudentName(name,...params){
    19. console.log('App收到了学生名:',name,params)
    20. this.studentName = name
    21. },
    22. },
    23. mounted() {
    24. this.$refs.student.$on('atguigu',this.getStudentName) //绑定自定义事件
    25. // this.$refs.student.$once('atguigu',this.getStudentName) //绑定自定义事件(一次性)
    26. },
    27. }
    28. </script>
    29. <style scoped>
    30. .app{
    31. background-color: gray;
    32. padding: 5px;
    33. }
    34. </style>

    Student.vue

    1. <template>
    2. <div class="student">
    3. <button @click="sendStudentlName">把学生名给App</button>
    4. </div>
    5. </template>
    6. <script>
    7. export default {
    8. name:'Student',
    9. data() {
    10. return {
    11. name:'张三',
    12. }
    13. },
    14. methods: {
    15. sendStudentlName(){
    16. //触发Student组件实例身上的atguigu事件
    17. this.$emit('atguigu',this.name,666,888,900)
    18. }
    19. },
    20. }
    21. </script>
    22. <style lang="less" scoped>
    23. .student{
    24. background-color: pink;
    25. padding: 5px;
    26. margin-top: 30px;
    27. }
    28. </style>

    若想让自定义事件只能触发一次,可以使用once修饰符,或$once方法。

    触发自定义事件:this.$emit('atguigu',数据)

    使用 this.$emit() 就可以子组件向父组件传数据

    解绑自定义事件this.$off('atguigu')

    1. this.$off('atguigu') //解绑一个自定义事件
    2. // this.$off(['atguigu','demo']) //解绑多个自定义事件
    3. // this.$off() //解绑所有的自定义事件

    组件上也可以绑定原生DOM事件,需要使用native修饰符。

    1. <Student ref="student" @click.native="show"/>

    注意:通过this.$refs.xxx.$on('atguigu',回调)绑定自定义事件时,回调要么配置在methods中,要么用箭头函数,否则this指向会出问题!

  • 相关阅读:
    后端研发工程师面经——JAVA语言
    不擅于社交的原因?如何提高社交能力?
    Redis Cluster Gossip Protocol: FAIL, UPDATE
    苹果Meta都在冲的Pancake技术,中国VR团队YVR竟抢先交出产品答卷
    SpringBoot 刷新上下文6--加载并注册BeanDefinition
    Jaya算法在电力系统最优潮流计算中的应用(创新点)【Matlab代码实现】
    商城项目09_品牌管理菜单、快速显示开关、阿里云进行文件上传、结合Alibaba管理OSS、服务端签名后直传
    uniapp读取(获取)缓存中的对象值(微信小程序)
    十二、模板方法模式
    VBA调用宏的方式总结大全
  • 原文地址:https://blog.csdn.net/NancyFyn/article/details/126317305