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


    前言

    父子组件的值传递,在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>
    
  • 相关阅读:
    yourphp常用标签
    如何访问他人电脑上的共享文件夹
    Win7如何分享局域网并设置共享文件夹账户和密码
    CLR Via CSharp读书笔记(21):自动内存管理(垃圾回收)
    《Java编程思想》之I/O系统
    WebCore::Node Dump
    java中的IO整理(3)数据操作流合并流压缩流输入输出重定向 老秋的日志 网易博客
    WebKit 分析–for android Braincol 博客园
    JavaScript EE,第 2 部分: 用 Ajax 调用远程 JavaScript 函数
    java中System重定向输出流
  • 原文地址:https://www.cnblogs.com/nangezi/p/16175091.html
Copyright © 2020-2023  润新知