VUE3子组件-业务代码优化

news2024/11/13 12:16:55

Vue3子组件

1.简介

Vue 3组件的主要优势之一就是它们可以帮助你将你的应用程序分解成可维护和可重用的部分。当你在应用程序中多次使用相同的代码时,你可以将它们抽象成一个组件,然后在应用程序中的多个地方使用该组件,而不必每次都编写相同的代码。

最近写前端代码,有些功能代码可以复用,于是尝试使用子组件方式优化代码。

总结主要有两个使用方向

  • 一:像方法一样调用传递参数,调用组件(打开一个可复用的复杂详情页)

  • 二:引入组件解决复杂的业务问题(比如一个可编辑表格,列字段是一个动态可以增删的tag标签,每次修改都需要通过遍历整个表格List对象,按照id匹配行数据,进而修改对应列字段,过程十分繁杂)

2.组件举例

2.1父组件

父组件点击按钮
在这里插入图片描述

父组件代码 - FatherComponent.vue

<template>
  <div class="content_box">
    <el-button @click="">处理</el-button>
  </div>
<ChildComponent ref="childComponentRef"  @success="handleSuccess"></ChildComponent>
</template>
<script lang="ts">
import {
  defineComponent, nextTick,
  onMounted, reactive, ref
} from 'vue';
 
import ChildComponent from "/@/views/my/childComponentRef.vue";

export default defineComponent({
  name: 'FatherComponent',
  components: {
    ChildComponent,
  },
  setup() {
   

    const childComponentRef = ref()

    function openDetailInfo(record) {
      let toData = {
        costProjectAct: record.dictId,
        name: record.dictName
      }
      childComponentRef.value?.openDetailDialog(toData)
    }
    
    function handleSuccess(){
    	//todo 刷新表格
    	reloadTable()
    }

    return {
    openDetailInfo,childComponentRef,handleSuccess
    };
  },
});
</script>

2.2子组件

本子组件弹出一个Element-UI弹窗Dialog

在这里插入图片描述

子组件代码 - ChildComponent.vue

<template>
  <div>
    <el-dialog
      v-model=" dataInfo.show"
      :title="dataInfo.title"
      width="30%"
      :before-close="handleClose"
      draggable
    >
      <span>This is a message</span>
      <template #footer>
        <span class="dialog-footer">
          <el-button @click="dialogVisible = false">关闭</el-button>
          <el-button type="primary" @click="submitForm">
            提交
          </el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
<script lang="ts">
import {
  defineComponent, defineExpose, onMounted, reactive, ref, watch
} from "vue";

export default defineComponent({
  name: 'ChildComponent',
  components: {

  },
  props: ['data'],
  setup(props, { emit }) {


    onMounted(() => {

    });

    const dataInfo =ref({
      show: false,//编辑提示框是否显示
      title: '',
    })

    function openDetailDialog(record){
      dataInfo.value.title =  "详情页-" + record.name
      dataInfo.value.show = true
    }


    function handleClose(){
      dataInfo.value.show = false
    }

    function submitForm(){
      // todo 提交逻辑
      // 1.子组件业务操作 - 当前模拟关闭弹窗
      dataInfo.value.show = false

      // 2.告知父组件需要刷新列表等操作 使用emit注意参数success需要和父组件对应
      emit('success');
    }

    defineExpose({
      openDetailDialog
    })

    return {
      handleClose,dataInfo,openDetailDialog,submitForm
    };
  },
});
</script>


3.首先外部方法调用包含参数

3.1子组件

关键代码定义一个方法

    function openDetailDialog(record){
      dataInfo.value.title =  "详情页-" + record.name
      dataInfo.value.show = true
    }

然后使用defineExpose暴露方法

  defineExpose({
      openDetailDialog
    }) 

3.2父组件

1.使用方法调用需要给引入的子组件绑定ref对象

2.使用方法调用需要给引入的子组件绑定ref对象financeComponentRef.value?.openDialog(toData)方法调用组件中方法

<ChildComponent ref="childComponentRef"  @success="handleSuccess"></ChildComponent>

//对象映射
const childComponentRef = ref()


childComponentRef.value?.openDetailDialog(toData)

4.组件通信-子组件通知父组件

4.1子组件

在子组件页面点击确认,关闭弹窗,同时通知父组件页面-表格组件刷新需要使用emit方法

在vue声明时候,可以看到emit参数

  setup(props, { emit }) {
  
  }

点击确认,使用 emit(‘success’); 发送消息告知父组件

 function submitForm(){
      // todo 提交逻辑
      // 1.子组件业务操作 - 当前模拟关闭弹窗
      dataInfo.value.show = false

      // 2.告知父组件需要刷新列表等操作 使用emit注意参数success需要和父组件对应
      emit('success');
    }

4.2父组件

可以看到@success=“handleSuccess” 这个属性 其中@success需要和子组件中emit(‘success’) 的success对应,这样能触发我们再父组件绑定的方法

<ChildComponent ref="childComponentRef"  @success="handleSuccess"></ChildComponent>

即调用父组件方法,刷新表格

    function handleSuccess(){
    	//todo 刷新表格
    	reloadTable()
    }

5.组件通信-父组件通知子组件

5.1父组件

父组件改造一下添加自定义属性 :data

父组件定义一个变量userInfo与:data绑定

<ChildComponent ref="childComponentRef"  @success="handleSuccess" :data="userInfo"></ChildComponent>


const userInfo = ref({
     id:  '99789798789789',  
	name: '小明'
})

5.2子组件

在子组件中,可以看到props参数,使用 props[‘data’]形式接收父组件数据绑定参数

  setup(props, { emit }) {
  	const userInfo = ref()
    onMounted(() => {
       userInfo.value =  props['data']
       console.log(userInfo.value )
    });
  }

像我们使用Element-UI的实际上可以理解为 v-model 绑定的参数,传递给el-dialog子组件props参数中

    <el-dialog
      v-model=" dataInfo.show"
      :title="dataInfo.title"
      width="30%"
      :before-close="handleClose"
      draggable
    >

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/453778.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5年了,终于入职阿里测试岗位,直接涨薪30K...

前言 本科毕业后就一直从事软件测试的工作&#xff0c;和多数人一样&#xff0c;最开始从事功能测试的工作&#xff0c;看着自己的同学一步一步往上走&#xff0c;自己还是在原地踏步&#xff0c;说实话这不是自己想要的状态。 一年半后开始沪漂生活&#xff0c;又摸爬滚打了…

阿里巴巴软件测试面试过了,起薪20k

普通二本计算机专业毕业&#xff0c;从毕业后&#xff0c;第一份接触测试的工作是在一家通讯小公司&#xff0c;大部分接触的工作是以功能测试为主&#xff0c;一直都是几千块钱工资&#xff0c;还一度被派出差&#xff0c;以及兼职各种产品、运维、运营的活&#xff0c;感觉自…

Cleer ARC II 音弧

戴上Cleer ARC II 音弧解放双耳&#xff0c;享受更自由的音符 用惯了各种入耳式耳机&#xff0c;换上开放式耳机&#xff0c;戴着确实更加舒服&#xff0c;特别是我现在用的这款Cleer ARC II 音弧&#xff0c;戴上还不容易掉&#xff0c;很适合运动使用。这款耳机采用一种耳挂佩…

JavaEE1(4/23)

目录 1.计算机CPU 2.CPU和GPU的区别 3.线程 4.内存是如何分配的 5.进程的调度 6.线程和进程的区别和联系&#xff1f; 1.计算机CPU 主频 &#xff1a;运算速度 3.73Ghz 表示每秒计算37.3亿次 基准速度&#xff1a;最小计算速度 睿频&#xff1a;最大运行速度 超频&…

【头歌C语言程序设计】结构体解答

写在前面 这道题总体来说还是偏难的&#xff0c;如果只看代码比较难以理解&#xff0c;当结构体的文章发出后&#xff0c;就有许多小伙伴问我这个问题&#xff0c;我开始意识到&#xff0c;可能我对这道题所作的解答还不够&#xff08;不装了&#x1f601;&#xff0c;根本没有…

Python进阶篇(三)-- TCP套接字与UDP套接字编程

1 Python3 网络编程 1.1 介绍 本文将首先利用 Python 实现面向TCP连接的套接字编程基础知识&#xff1a;如何创建套接字&#xff0c;将其绑定到特定的地址和端口&#xff0c;以及发送和接收数据包。其次还将学习 HTTP 协议格式的相关知识。在此基础上&#xff0c;本篇将用 Pyt…

Spring boot项目编译后未能加载静态资源文件

起因: 因甲方爸爸加了一个紧急的需求: 需要搞一个文件上传和下载功能. 我心中想:这不简单,搞个资源服务器,将上传文件放上去,然后访问资源链接就行了. 但接下来甲方爸爸说 不需要这莫麻烦,直接将文件放服务器里,用的时候下载到资源文件夹下就行. 我心里想: 我擦嘞 还能这样!! 然…

【C++】—— STL简介(了解)

前言&#xff1a; 在上节&#xff0c;我们简单的认识了模板的基本概念。今天我简单的给大家介绍一下关于 STL 。 目录 &#xff08;一&#xff09; 什么是STL &#xff08;二&#xff09; STL的版本 &#xff08;三&#xff09; STL的六大组件 &#xff08;四&#xff09;…

Tomcat概述以及部署与优化

一、Tomcat概述 1、Tomcat的概念 Tomcat是Java语言开发的&#xff0c;服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP程序的首选。一般来说&am…

Python入门基础小练习

通过前面的两个篇章Python-入门基础篇和Python-入门基础语句篇大家应该已经认识了python基础的语句和函数了&#xff0c;并且可以使用pycharm编译器创建.py文件进行运行了&#xff0c;今天适当的来一些小练习&#xff0c;给枯燥的学习增添一些趣味性。 判断一个数是否为偶数 …

linux服务器实现百万并发遇到的问题以及解决思路

目录 前言服务器与客户端的配置介绍server 代码client 代码遇到的问题error too many open files为什么会出现这个问题解决这个问题的思路 killed&#xff08;已杀死&#xff09;为什么会出现这个问题解决这个问题的思路 最终结果学到的经验教训 前言 在完成百万并发服务器的时…

搭建家庭影音媒体中心 - 公网远程连接Jellyfin流媒体服务器

文章目录 前言1. 安装Home Assistant2. 配置Home Assistant3. 安装cpolar内网穿透3.1 windows系统3.2 Linux系统3.3 macOS系统 4. 映射Home Assistant端口5. 公网访问Home Assistant6. 固定公网地址6.1 保留一个固定二级子域名6.2 配置固定二级子域名 转载自远程穿透的文章&…

MySQL高级第十六篇:数据库日志有哪些(慢查询日志、通用查询日志、错误日志和二进制日志)

MySQL高级第十六篇&#xff1a;数据库日志有哪些&#xff08;慢查询日志、通用查询日志、错误日志和二进制日志&#xff09; 一、MySQL支持的日志有哪些&#xff1f;1. 日志类型总结2. 日志有什么缺点吗&#xff1f; 二、通用查询日志&#xff08;slow query log&#xff09;三…

【开发工具】idea2023.1社区版设置优化,媲美旗舰版

相信大家很多时候都是用旗舰版来开发&#xff0c;各种序列号破解包各种搞&#xff0c;但说不定哪天又失效了那天又爆泄漏隐私安全问题。随着idea的版本升级破解也不好搞了&#xff0c;所以我就直接用了社区版&#xff0c;经过一番折腾发现社区版一点不比旗舰版差&#xff0c;可…

Linux文件类型与属性

一、文件类型 Linux 系统下一共分为 7 种文件类型。通过 stat 命令或者 ls 命令来查看文件类型。 - &#xff1a;普通文件 d &#xff1a;目录文件 c &#xff1a;字符设备文件 b &#xff1a;块设备文件 l &#xff1a;符号链接文件 s &#xff1a;套接字文件 p &…

Jeston NANO 配置并安装 torch+ torchvision

由于nano的arm64架构&#xff0c;所以用它进行深度学习配置部署时会与用普通电脑&#xff08;x86&#xff09;有所不同: x86架构 x86架构是最常用的计算机架构之一&#xff0c;它是基于英特尔的8086处理器所设计的&#xff0c;后来又逐渐发展成x86-64架构&#xff0c;支持64位处…

开放原子训练营(第二季)RT-Thread Nano学习营刘玉宽

4月22日周六&#xff0c;早早起床充满期待的来到了北京艾丽华酒店&#xff0c;参加“2023年RT-Thread线下培训”。这是疫情三年以来开放原子在北京第一次组织的线下活动。 进入到会场&#xff0c;被震撼了&#xff0c;好火爆啊————满满一屋子人&#xff0c;有白发苍苍的老者…

MySQL运维36-排队论

文章目录 1、排队模型2、什么是排队论3、李特尔法则&#xff08;Little’s law&#xff09;3.1、李特尔法则的内容3.2、李特尔法则的意义 4、肯德尔排队表示法4.1、肯德尔表示法的核心要素A/S/m4.2、肯德尔表示法中对顾客达到分布的表示&#xff1a;4.3、用肯德尔表示法表示的常…

day03_注释丶关键字丶标识符丶常量

​注释 注释的概念&#xff1a;在编写程序的过程中&#xff0c;对程序代码进行解释说明。 代码本身和人类的自然语言相比&#xff0c;可读性肯定是要差一些&#xff0c;所以为了更快能够知道代码的含义、作用、需要注意地方&#xff0c;所有程序员都应该养成写注释的好习惯。 …

【安卓源码】Binder机制1-Servicemanager 进程的启动和defaultServiceManager

1. servicemanager 进程的启动 对于用户空间&#xff0c;不同进程之间彼此是不能共享的&#xff0c;而内核空间却是可共享的。Client进程向Server进程通信&#xff0c;恰恰是利用进程间可共享的内核内存空间来完成底层通信工作的&#xff0c;Client端与Server端进程往往采用io…