美文网首页
Vue3---父子组件间互相传值

Vue3---父子组件间互相传值

作者: 小李不小 | 来源:发表于2021-08-13 11:17 被阅读0次

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

例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>
    ```
![image.png](https://img.haomeiwen.com/i16629650/07d6fab75fa5c981.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

例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>

![image.png](https://img.haomeiwen.com/i16629650/e2db04815f7dd2f6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


相关文章

  • Vue3---父子组件间互相传值

    Vue3中,子组件通过setup函数中的第一个参数值 props 拿到定义的组件参数进行使用。如果要向父组件传参,...

  • vue之$eventBus非父子组件传值使用解析

    - 在vue中,我们可以使用props和$emit进行父子组件的传值,但是如果需要互相传值的组件不是父子关系,这时...

  • vue之$eventBus非父子组件传值使用解析

    在vue中,我们可以使用props和$emit进行父子组件的传值,但是如果需要互相传值的组件不是父子关系,这时我们...

  • VUE 父子组件互相传值

    父组件代码 子组件代码 父组件向子组件传值 通过v-bind: 子组件向父组件传值 通过事件绑定,比如这个@del...

  • vue 组件之间的通信

    组件之间的说明,分为好几种:1,父组件向子组件传递数据2,子组件通过事件向父组件传值3,兄弟组件互相传值注:父子组...

  • vue 6种通信总结①

    常用vue通信大概有这几种方式进行: 组件间的父子之间的传值 组件间的子父之间的传值 非组件间的组件间的传值(简称...

  • Vue父子组件通信和双向绑定

    本篇文章主要介绍父子组件传值,组件的数据双向绑定。 1. 基础父子组件传值 父子组件传值,这是Vue组件传值最常见...

  • react-父子组件间通信

    React-父子组件间通信 父组件传 值 给子组件, 传 方法 给子组件 子组件接收 值 ,触发父组件的 方法

  • (Vue-cli)六、组件间传值(组件间传值&全局状态管理sto

    六、组件间传值 1.父子组件传值 (1) 父传子 父组件向子组件传值,可以通过绑定属性传值;子组件通过props接...

  • Vue组件间通信

    Vue组件间通信 父子组间通信 通过props向子组件传值,通过事件向父级组件发送消息 通过props向子组件传值...

网友评论

      本文标题:Vue3---父子组件间互相传值

      本文链接:https://www.haomeiwen.com/subject/qzydbltx.html