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>

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 国际邮箱有哪些比较出名_国际上比较认可的邮箱

    国际邮箱有哪些比较出名_国际上比较认可的邮箱经济全球化,越来越多的企业选择跨国贸易,包括外贸、物流、软件科技等行业。在和客户谈生意时,虽然邮箱这个工具不起眼,但是却有着举足轻重的作用,如TOM国际企业邮箱。什么国际邮箱靠谱?企业注册国际邮箱,一般选择企业邮箱。要说什么国际邮箱靠谱,首先考虑海外邮件收发稳定性,其次是安全性。和普通邮箱相比,TOM企业邮箱的国内外邮件收发更安全,拥有专属的收发信通道,邮件加密传输,让用户丝毫不会担心邮件安全。公司用邮箱来往的信息,大多为重要信息,最好能长期存储,无限容量的企业邮箱可长期存储,单次发送邮件附件最大2

  • 玻尔兹曼公式推导碰撞项_玻尔兹曼方程表达式

    玻尔兹曼公式推导碰撞项_玻尔兹曼方程表达式在做别的事之前,让我们试做一个假想的研究。假定我们有一个很好的能跟踪单个运动粒子而不产生任何其他效应的激光探测器,把这个探测器应用在一个波尔兹曼气体上,可以很容易发现,无论粒子间碰撞能否忽略,牛顿轨道方程始终是有意义的(如果需要考虑碰撞,沿牛顿轨道的粒子存活几率是应该引进的)。问题就这样产生了:因为波尔兹曼方程和给定的初值边值条件已经构成了一个完全集合,我们是否应该简单的无视牛顿方程?如果牛顿方程…

  • 高并发下的nginx性能优化实战

    高并发下的nginx性能优化实战

  • django和drf_类中的方法可以序列化么

    django和drf_类中的方法可以序列化么前言上一篇文章我们讲述了序列化,这篇就带大家一起来实现以下序列化Serializer我们使用序列化类Serializer,我们来看下源码结构,这里推荐使用pycharm左边导航栏的Structu

  • clion 2021 永久激活码破解方法

    clion 2021 永久激活码破解方法,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • intellij idea 2021激活码(最新序列号破解)

    intellij idea 2021激活码(最新序列号破解),https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

发表回复

您的电子邮箱地址不会被公开。

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