【vue3】vue3接收props以及emit的用法

这篇具有很好参考价值的文章主要介绍了【vue3】vue3接收props以及emit的用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

技术:vue3.2.40
UI框架:arco-design 2.44.7
css技术:less 4.1.3

实现:子组件接收props以及通过emit方法传值父组件

vue3使用的组合式API,我这里使用的是defineComponent

1.父页面调用子组件

<template>
  <div class="dataManagerMentPage">
    <a-table :columns="fieldColumns" :data="tableData" :scrollbar="true">
      <template #category="{ record }">
        {{ handModelType(record.category) }}
      </template>
      <template #optional="{ column, record, rowIndex }">
        <a-button @click="handDetails(column, record, rowIndex)" type="text"
          >详情</a-button
        >
      </template>
    </a-table>
    <modelDetails
      :modalForm="modalForm"
      @handleCancel="handleCancel"
      @handleModalOk="handleModalOk"
    ></modelDetails>
  </div>
</template>

<script lang="ts">
  import {
    defineComponent,
    reactive,
    toRefs,
    onUnmounted,
    onMounted,
  } from 'vue';

  import modelDetails from './components/modelDetails.vue';

  export default defineComponent({
    name: 'DataManagerMent',
    components: {
      modelDetails,
    },
    setup() {
      interface IDataManagerMant {
        // table字段名
        fieldColumns: any[];
        // table数据源
        tableData: any[];
        modalForm: {
          visible: boolean;
          title: string;
          data: object;
        };
      }
      const dataManagerMant = () => ({
        modalForm: {
          visible: false,
          title: '',
          data: null,
        },
        // table字段名
        fieldColumns: [
          {
            title: '设备ID',
            dataIndex: 'id',
            ellipsis: true,
            tooltip: true,
          },
          {
            title: '设备名称',
            dataIndex: 'deviceName',
            ellipsis: true,
            tooltip: true,
          },
          {
            title: '设备序列号',
            dataIndex: 'deviceOuterId',
            ellipsis: true,
            tooltip: true,
          },
          {
            title: '设备类型',
            dataIndex: 'category',
            slotName: 'category',
          },
          {
            title: '厂商',
            dataIndex: 'manufacturer',
            ellipsis: true,
            tooltip: true,
          },
          {
            title: '绑定模型',
            dataIndex: 'relatedModelId',
          },
          {
            title: '创建时间',
            dataIndex: 'createDate',
          },
          {
            title: '操作',
            dataIndex: 'optional',
            slotName: 'optional',
            align: 'center',
          },
        ],
        // table数据源
        tableData: [],
      });
      const state: IDataManagerMant = reactive(dataManagerMant());

      // 查看详情页
      function handDetails(column: any, record: any, rowIndex: any) {
        state.modalForm = {
          visible: true,
          title: record.id,
          data: record,
        };
      }
      // 判断设备类型
      function handModelType(category: string) {
        let name = '';
        switch (category) {
          case 'VEHICLE':
            name = '车辆';
            break;
          case 'VIDEO':
            name = '视频';
            break;
          case 'COMMON':
            name = '默认';
            break;

          default:
            name = '默认';
            break;
        }
        return name;
      }
      // 关闭弹窗
      function handleCancel() {
        state.modalForm = {
          visible: false,
          title: '',
          data: {},
        };
      }
      // 弹窗保存按钮事件
      function handleModalOk() {
        handleCancel();
      }

      return {
        ...toRefs(state),
        handDetails,
        handleCancel,
        handleModalOk,
        handModelType,
      };
    },
  });
</script>

<style lang="less" scoped>
  .dataManagerMentPage {
    width: 100%;
    height: 100%;
    margin: 0;
    padding: 0;
  }
</style>

2.子组件

<template>
  <a-modal
    width="50%"
    :visible="modalForm.visible"
    @ok="handleOk"
    @cancel="handleCancel"
    :title="'数据详情-' + modalForm.title"
    okText="保存"
    cancelText="取消"
    title-align="start"
    :okLoading="loading"
  >
    <a-spin :loading="loading" tip="正在获取数据中...">
      <div class="modelDetailsPage">
        
      </div>
    </a-spin>
  </a-modal>
</template>

<script lang="ts">
  import {
    defineComponent,
    reactive,
    toRefs,
    onUnmounted,
    onMounted,
    watch,
  } from 'vue';
  import { Message } from '@arco-design/web-vue';



  export default defineComponent({
    name: 'ModelDetails',
    props: {
      // 父级的
      modalForm: {
        visible: {
          type: Boolean,
          default: false,
        },
        title: {
          type: String,
          default: '',
        },
      },
    },

    setup(props, { emit }) {
      interface IDataManagerMant {
        loading: boolean;
      }
      const dataManagerMant = () => ({
        loading: false,
      });
      const state: IDataManagerMant = reactive(dataManagerMant());
      // 保存按钮事件
      function handleOk() {
        state.loading = true;
        Message.success('保存成功!');
        emit('handleModalOk');
        state.loading = false;
      }
      // 返回按钮事件
      function handleCancel() {
        emit('handleCancel');
      }

      watch(
        () => props.modalForm,
        (newV, oldV) => {
          if (newV.visible) {
            // 这里可以写处理化执行的函数方法=
          }
        }
      );
      return {
        ...toRefs(state),
        handleOk,
        handleCancel,
      };
    },
  });
</script>
<style lang="less" scoped>
  .modelDetailsPage {
    width: 100%;
    height: 100%;
    padding: 0 12px;
  }
</style>

注意点:

1.setup里如果需要接收props和使用emit,只需要带参数 setup(props, { emit })
2.setup里面只需要带emit(‘handleCancel’),不需要带$$符号,这个符号是vue2的写法
3.watch监听的方法,放在setup里面文章来源地址https://www.toymoban.com/news/detail-609784.html

到了这里,关于【vue3】vue3接收props以及emit的用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Vue前端框架10 组件的组成、组件嵌套关系、组件的注册方式、组件传递数据(props $emit)、数组传递多种数据类型、组件传递props校验、组件事件

    组件最大的优势就是可复用性 通常将组件定义在.vue中,也就是SFC单文件组件 组件的基本组成: 组件允许我们将UI划分为独立的、可重用的部分,并且对每个部分单独思考 实际应用中组件常常被组件成层层嵌套的树状结构 Vue组件使用前要注册,注册有两种方式:全局注册和

    2024年02月09日
    浏览(17)
  • vue3父组件异步props传值,子组件接收不到值问题

    当我们使用vue3进行开发在创建组件的时候,子组件经常需要调用父组件的数据,那么这是就需要vue3的props进行对父组件与子组件通信来达到传值的效果 在使用props进行父子组件通信时,子组件无法成功渲染数据,导致拿到数据为空问题 提示:这里填写问题的分析: 在使用

    2024年02月11日
    浏览(13)
  • watch监听,解决Vue3父组件异步props传值,子组件接收不到的问题

    watch监听,解决Vue3父组件异步props传值,子组件接收不到的问题

    写静态数据的时候父组件传值子组件接收并渲染是没问题的,但当父组件异步获取数据,子组件接收数据会晚于渲染,就会产生接收不到的问题,我在用echarts绘制图表时图表就直接不显示  用watch监听props数据并在watch内进行赋值操作可解决该问题 直接上代码 父组件,vue3语法

    2024年02月15日
    浏览(13)
  • 前端基础(props emit slot 父子组件间通信)

    前端基础(props emit slot 父子组件间通信)

    前言 :如何实现组件的灵活使用,今天学习组件封装用到的props、slot和emit。 目录 props 子组件 父组件 示例代码 slot 示例代码 作用域插槽 emit 示例代码 需要实现在其他组件中使用同一个子组件。 子组件(所谓子组件,就是封装好的组件,供其他组件使用) 子组件定义了so

    2024年02月11日
    浏览(53)
  • vue3 v-for遍历defineProps或者props接收的数据时,报“xx” is of type ‘unknown‘

    vue3 v-for遍历defineProps或者props接收的数据时,报“xx” is of type ‘unknown‘

    vue中使用ts,且在使用props或者defineProps进行父传子时,v-for遍历收到的数组,进行取值时,报“xx” is of type \\\'unknown\\\' 提示:ts进行类型推导造成的报错 提示:使用接口进行 提示:创建一个ts文件,放类型数据,在使用的页面进行引用            总结:前两个都有一个弊端,

    2024年02月16日
    浏览(15)
  • 持续不断更新中... 自己整理的一些前端知识点以及前端面试题,包括vue2,vue3,js,ts,css,微信小程序等

    答: 在普通的前端项目工程中,在script标签中增加setup即可使用api 使用setup()钩子函数 答: 不要在计算属性中进行异步请求或者更改DOM 不要直接修改computed的值 区别: 计算属性值基于其响应式依赖被缓存,意思就是只要他之前的依赖不发生变化,那么调用他只会返回之前缓

    2024年02月11日
    浏览(32)
  • vue3报错:runtime-core.esm-bundler.js:38 [Vue warn]: Invalid prop: type check failed for prop “modelVal

    🔥🔥🔥 欢迎关注csdn前端领域博主: 前端小王hs 🔥🔥🔥 email: 337674757@qq.com 🔥🔥🔥 前端交流群: 598778642 vue3报错:runtime-core.esm-bundler.js:38 [Vue warn]: Invalid prop: type check failed for prop “modelValue”. Expected Boolean, got Object at 警告的大意是绑定的函数期待得到的是布尔值,但得到

    2023年04月08日
    浏览(7)
  • Vue组件的嵌套关系;父组件传递子组件props;子组件传递给父组件$emit;自定义事件;案例

    Vue组件的嵌套关系;父组件传递子组件props;子组件传递给父组件$emit;自定义事件;案例

    前面将所有的逻辑放到一个App.vue中: 在之前的案例中,只是创建了一个组件App; 如果一个应用程序将所有的逻辑都放在一个组件中,那么这个组件就会变成非常的臃 肿和难以维护; 所以组件化的核心思想应该是对组件进行拆分,拆分成一个个小的组件; 再将这些组件组合

    2024年02月13日
    浏览(10)
  • vue3.0子组件接收父组件的值以及调用父组件的方法

    html: 使用 v-bind即 :xxx=\\\"变量/方法\\\"向子组件传递值或者方法,下面定义变量id和变量setIds,将searchForm.id的值和setIds方法传到子组件中去 js: js: 先通过props进行接收父组件传来的值,然后再在setup里面使用第一个参数props,可以拿到父组件所有的变量以及方法 html:

    2024年02月17日
    浏览(12)
  • 前端技术Html,Css,JavaScript,Vue3

    1.基本标签 2.文本格式化 3.链接 4.图片 5.无序列表 6.有序列表 7.表格 8.表单 1.选择器 2.文本和字体 3.链接 4.隐藏 5.定位position 6.浮动 7.对齐 8.图像 1.输出 2.函数 3.常用事件 4.DOM 5.改变Html 6.DOM 元素 (节点) 尾部创建新的 HTML 元素 (节点) - appendChild() 头部创建新的 HTML 元素 (节点)

    2024年02月13日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包