【vue】组件插槽、组件自定义事件

本文深入探讨了Vue组件中的插槽机制,解释了如何使用`:v-slot`或`#`语法来定义和使用插槽,允许父组件定制子组件的内容。同时,文章还介绍了组件自定义事件的实现,包括`v-on`绑定,以及在子组件中通过`this.$emit()`触发自定义事件并在父组件中响应的方法。文中提供了具体的代码示例,包括app组件、Nav子组件和Nav1子组件的事件处理逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

插槽

插槽就是子组件中的提供给父组件使用的一个占位符,用 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的标签。
语法::v-slot:插槽名 语法糖:#插槽名

<template>
  <div>
      <box :msg="name" :ae="age"></box>
      <box msg="小红" ae="21"></box>

      <box1 :title="title" :name="name">
        <h4 style="color:red">app组件的插槽</h4>
        11111
      </box1>

      <box2 title="box2的组件">
        <template v-slot:n1>
         <h1>box2</h1>
        </template>
      </box2>
      <box2 title="box2的组件">
        <!-- 语法糖 #号代替 -->
        <template #n1>
         <h1>box266666</h1>
        </template>
        <h1 style="color:blue">box22222</h1>
        <template #n2>
         <h1>第二个</h1>
        </template>
      </box2>

  </div>
</template>

组件自定义指令

v-on绑定

实现步骤:

  1. 首先给子组件标签通过v-on:自定义事件名字=“函数名”,绑定一个函数,接着在父组件APP的methods里面定义这个函数(需要接收一个参数)
  2. 在子组件中,首先定义一个click事件,接着在methods内书写click事件函数,在其内部通过this.$emit()去触发APP组件里面的自定义事件,括号内的第一个参数是自定义事件名字,后面的参数是数据,(注意:给哪个子组件绑定自定义事件就去哪个子组件去触发这个事件)
  3. 在子组件的methods里面定义触发这个函数的函数,通过this.函数名括号传数据
    app组件代码
<template>
  <div>
    <!-- 这是原生事件 -->
    <button @click="but">点我触发原生事件</button>

    <!-- 组件自定义事件 -->
    <Nav v-on:myNav="fn"></Nav>
    <!-- 这里的click不是原生的,而是自定义的 -->
    <Nav v-on:click="fn2"></Nav>
    <!-- 这里Nav1直接就是原生的点击事件 不需要内部触发 使用native方法 此方法只能提供官方的事件,自己写的无法读取-->
    <Nav1 v-on:click.native="fn3"></Nav1>
  </div>
</template>

<script>
import Nav from "@/com/Nav.vue"
import Nav1 from "@/com/Nav1.vue"
export default {
  methods: {
    but() {
      // 事件三要素:在原生事件绑定中button就是事件源 click事件类型  but就是监听器  也是事件处理程序
      console.log("点击到了");
    },
    fn(a,b){
      //Nav组件是事件源 myNav是Nav组件绑定的事件类型 fn是Nav组件上绑定的监听器
      // myNav由Nav组件内部自己设计
      console.log("myNav事件触发了",a,b);
    },
    fn2(){
      console.log("fn2触发了");
    },
    fn3(){
      console.log("fn3触发了");
    }
  },
  components:{
    Nav,
    Nav1,
  }
};
</script>

子组件Nav代码

<template>
    <div>
        <h1>{{age}}</h1>
        <button @click="add">点击增加</button>
        <button @click="x">点击触发组件的click事件</button>
    </div>
</template>
<script>

export default {
    data() {
        return {
            age: 0,
        };
    },
    methods: {
        add() {
            this.age++
        },
        x(){
            // 这里点击触发组件的click自定义事件
            this.$emit("click")
        }
    },
    //   监听
    watch: {
        age(e) {
            if (e == 3) {
                // 这里e为3时触发组件内的自定义事件  还可以传值
                this.$emit("myNav",11,22)//myNav事件触发了
            }
        },
       
    }
}
</script>

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

<template>
    <div>
   <!-- 这里是Nav1组件上使用了native方法 -->
      <button>Nav1</button>
    </div>
</template>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值