ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Vue3 父子组件传值,defineProps,defineEmits,以及父组件调用子组件的方法 defineExpose

2022-04-24 15:00:28  阅读:610  来源: 互联网

标签:index const defineExpose defineEmits state tab 组件 type


前言

父子组件的值传递,在vue2中直接使用 props、this.$emit('xxx')即可,在Vue3中有较大的变化,父组件传递的值,只有在子组件使用 defineProps、defineEmits接收才可以使用


 


父子组件值传递

需要将父组件的参数使用defineProps,defineEmits承接,如下:

使用案例

// 父组件
<script setup>
import {
  ref,
  onMounted,
  reactive,
  toRefs,
  computed,
} from 'vue';
// tabs数据
const tabsData = [
  {
    type: 1,
    text: '111',
  },
  {
    type: 2,
    text: '222',
  },
  {
    type: 3,
    text: '333',
  },
]
const state = reactive({
  // active tab的序号
  activeTabIndex: 2,
});
// 切换tab
const changeTab = (index, tab) => {
  if (state.activeTabIndex === index) {
    return;
  }
  state.activeTabIndex = index;
  ...
};

const { activeTabIndex } = toRefs(state);
</script>

<template>
  ...
  <CustomTabs 
    :activeIndex="activeTabIndex" 
    :tabsData="tabsData"
    @changeTab="changeTab"
  />
  ...
</template>

// 子组件
<script setup>
import useCommonStoreState from '@/hooks/useCommonStoreState';
import { toRefs } from 'vue';

const props = defineProps({
  tabsData: {
    type: Array,
    required: true,
    default: [],
  },
  activeIndex: {
    type: Number,
    default: 0,
    required: true,
  },
});

const emits = defineEmits(['changeTab']);

// 切换tab
const changeTab = (index, tab) => {
  emits('changeTab', index, tab);
};

const { activeIndex, tabsData } = toRefs(props);
</script>
<template>
  <div class="custom-tabs-container" @touchmove.stop>
    <div
      class="tab"
      :class="`${activeIndex === index ? 'active' : ''}`"
      v-for="(tab, index) in tabsData"
      :key="tab.type"
      @click="changeTab(index, tab)"
    >
      <span>{{ tab.text }}</span>
    </div>
  </div>
</template>

 


父组件调用子组件的方法 defineExpose

需要将子组件的方法暴露出来,如下:

使用案例

// 子组件
<script setup>
// 结束loading
const stopLoading = () => {
  // 请求结束关闭loading
  state.listLoading = false;
}

// 开启error
const startError = () => {
  state.listError = true;
}

defineExpose({
  stopLoading,
  startError
})
</script>
// 父组件
<script setup>
const customListRef= ref(null);

// 获取大师列表
const queryRichList = async params => {
  try {
   ...
  }catch (error) {
    window.console.log(error);
    state.failed = true;
    // 报错回调
    vantListRef.value.startError();
  } finally {
    // 请求结束回调,结束loading
    vantListRef.value.stopLoading();
  }
};

<script>
<template>
  <CustomList
    ref="customListRef"
    v-show="list.length"
    :list="list"
    :finished="finished"
    @queryListData="queryRichList(queryParams)"
  >
</template>

标签:index,const,defineExpose,defineEmits,state,tab,组件,type
来源: https://www.cnblogs.com/nangezi/p/16175091.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有