Vue3—父子组件传值(子组件使用 emit 传值到父组件)

Vue3—父子组件传值(子组件使用 emit 传值到父组件)Vue3中,子组件通过setup函数中的第一个参数值props拿到定义的组件参数进行使用。如果要向父组件传参,需要使用setup函数中的第二个参数值context(组件上下文)中的emit。例1:Tab菜单子组件创建子组件Tabs.vue<template><divclass=”Tabs”><divv-for=”(menu,index)inlistMenu”:key=”index”…

大家好,又见面了,我是你们的朋友全栈君。

    Vue3中,子组件通过setup函数中的第一个参数值 props 拿到定义的组件参数进行使用。如果要向父组件传参,需要使用setup函数中的第二个参数值 context(组件上下文)中的emit。

官网APIicon-default.png?t=L892https://v3.cn.vuejs.org/guide/migration/emits-option.html

  例1:Tab菜单子组件

  • 创建子组件Tabs.vue
<template>
    <div class="Tabs">
        <div v-for="(menu, index) in listMenu" :key="index" 
            @click="menuClick(menu.name)"
            :class="{ 'mactive' : menu.isActive === true ? true : false }">
            {
  
  { menu.name }}
        </div>
    </div>
</template>
<script>
import { defineComponent, ref } from 'vue'
export default defineComponent({
    name: 'Tabs',
    props: {
        listMenu: { // 菜单数据
            type: Array,
            required: true,
            default(){
                return []
            }
        }
    },
    setup(props, context){
        const listMenu = props.listMenu
        function menuClick (menuName) {
            // 通过自定义事件回传值
            context.emit('menuClick', { menuName })
        }
        return {
            listMenu,
            menuClick
        }
    }
})
</script>
<style lang='scss'>
    .Tabs{
        padding: 0;
        margin: 0;
        display: flex;
        align-items: center;
        justify-content: space-around;
        height: 50px;
        background-color: #0087AC;
        color: black;
    }
    .mactive{
        color: white;
        font-weight: bold;
    }
</style>
  • 父组件
<template>
  <!--使用子组件,传值并监听子组件自定义事件拿值-->
  <Tabs :listMenu="listMenu" @menuClick="menuClick" />
</template>
<script>
import { defineComponent, ref } from "vue";
import Tabs from '../components/Tabs'

export default defineComponent({
  name: "Index",
  components: {
    Tabs
  },
  setup() {
    const listMenu = ref([
      {
        name : '总部',
        isActive : true
      },
      {
        name : '地球',
        isActive : false
      },
      {
        name : '火星',
        isActive : false
      }     
    ])
    function menuClick (param) {
      listMenu.value.forEach(item => {
        item.isActive = item.name === param.menuName ? true : false
      })
    }
    return {
      listMenu,
      menuClick
    }
  }
});
</script>

    

Vue3---父子组件传值(子组件使用 emit 传值到父组件)

  例2:搜索子组件

  • 创建子组件Search.vue
<template>
    <div class="searchInp">
        <div class="inp">
            <input type="text" :placeholder="placeholder" v-model="search.content" />
            <span @click="handlerSearch">搜索</span>
        </div>
    </div>
</template>
<script>
import { defineComponent, ref } from 'vue'

export default defineComponent({
    name: 'Search',
    props: {
        tip: {
            type: String,
            reuquired: false,
            default: ''
        }
    },
    setup(props, { emit }) {
        const placeholder = props.tip
        const search = ref({
            content: ''
        })
        function handlerSearch () {
            emit('searchClick', search.value)
        }
        return {
            placeholder,
            search,
            handlerSearch
        }
    }
})
</script>
<style lang="scss">
    .searchInp{
        height: 40px;
        line-height: 40px;
        width: 100%;
        background-color: #0087AC;
        border-radius: 20px;
        color: white;
    }
    .inp input{
        width: 80%;
        height: 30px;
        line-height: 30px;
        background-color: transparent;
        border: none;
        outline: none;
        color: white;
    }
    .inp input::-webkit-input-placeholder{
        color: white;
    }
    .inp span{
        width: 20%;
    }
</style>
  • 父组件
<template>
  <!--使用子组件,传值并监听子组件自定义事件拿值-->
  <Search tip="请输入搜索内容" @searchClick="searchClick" />
  <h3>子组件传值内容:{
  
  { searchCon }}</h3>
</template>
<script>
import { defineComponent, ref } from "vue";
import Search from '../components/Search'

export default defineComponent({
  name: "Index",
  components: {
    Search
  },
  setup() {
    const searchCon = ref('')
    function searchClick (searCon) {
      searchCon.value = searCon.content
    }
   
    return {
      searchClick,
      searchCon
    }
  }
});
</script>

Vue3---父子组件传值(子组件使用 emit 传值到父组件)

   例3:也可以在模板中直接使用 $emit 来传自定义事件到父组件

  •  子组件
<template>
  <div>
    <h1 @click="changeName();$emit('aboutEvent', name)">This is an about page</h1>
  </div>
</template>
<script>
import { defineComponent, ref } from 'vue'
export default defineComponent({
  name: 'AboutComponent',
  setup(){
    const name = ref('About')
    function changeName () {
      name.value = 'AboutComponent'
    }
    return {
      changeName,
      name
    }
  }
})
</script>
  •  父组件
<template>
  <div class="about">
    <AboutComponent @aboutEvent="handleEvent" />
  </div>
</template>
<script>
import { defineComponent, defineAsyncComponent } from 'vue'
export default defineComponent({
  name: 'About',
  components: {
    AboutComponent: defineAsyncComponent(() => import('@/components/AboutComponent'))
  },
  setup () {
    function handleEvent (param) {
      console.log(param)
    }
    return {
      handleEvent
    }
  }
})
</script>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/145289.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月17日 下午6:40
下一篇 2022年5月17日 下午6:40


相关推荐

  • asp.net(c#)的货币格式化

    asp.net(c#)的货币格式化

    2021年8月7日
    60
  • log4j conversionpattern详解_log4j配置文件

    log4j conversionpattern详解_log4j配置文件#locallog4j.rootCategory=ERROR,stdout,report-error#online#log4j.rootCategory=ERROR,report-error#Consolelog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdou…

    2022年8月22日
    9
  • 单调栈简介

    单调栈简介何为单调栈栈内元素非递增或者非递减。另一种说法是从栈底到栈顶非递增或者非递减。在很多情况下,可能会出现相同的数字元素,所以称之为非递增或者非递减栈更合适。显而易见,从单调栈的这种结构很容易联想到,在算法中,合理运用单调栈,能够将O(n^2)的时间复杂度优化到O(n),这就是技巧。相对的,空间复杂度会增加,因为需要动态维护一个栈。这里需要明白一点,算法里面,都是时间和空间的取舍,所谓的时空间转换指的就是这个,所以要根据具体场景去选择。适用范围求一个数组每一个的下一个最大值、对一个数组排序、判断当前元素

    2026年2月14日
    7
  • idea 在线激活码_在线激活

    (idea 在线激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html0VOERWDQ5R-eyJsaWNlbnNlSWQi…

    2022年3月31日
    90
  • 自适应阈值法(图文总结)

    自适应阈值法(图文总结)概念 该方法网上很多很简洁但是很难懂的公式 本文章将会由简单例子入手 一步步去理解那些公式 但是不做代码实现 毕竟只要搞懂了这个算法的思想 代码的实现其实千变万化 甚至用 CV 库的话根本不用写代码 为啥出现这个二值化算法 OTSU 的致命缺陷在哪里 在大津算法 OTSU 中 由于采取的都是全局均值求出最佳全局阈值 但是在图片光照不均匀的场景 很容易把稍微模糊的边缘目标图像当作背景 为了避免这种场景 我们就可以考虑更为细腻的局部自适应阈值 它是根据图像不同区域亮度 不断计算更新局部阈值 同时不断 刷新 局部图像

    2026年3月26日
    2
  • fluter的环境搭配及android studio开发

    fluter的环境搭配及android studio开发fluter 的环境搭配及 androidstudi 开发 step1 系统要求 step2 获取 FlutterSDKst 更新环境变量 1 镜像环境设置 1 在用户变量 2 系统变量 step4Android 设置 1 安装 AndroidStudi 在命令终端 terminal 中配置 flutter 相关 3 设置您的 Android 设备 step1 系统要求开发环境必须满足以下最低要求 1 操作系统 Windows7 或更高版本 64 bit 2 磁盘空间 400MB 不包括 AndroidStudi 的

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号