设计vue3组件

news2025/8/22 1:46:39

在程序设计过程中,我们经常会遇到很多地方用到相同结构内容的情况,这时,我们想复用一部分代码,这时可以将可复用的UI部分以组件的形态封装,形成一定的组件调用关系。

组件化最简单的就是把一段代码提出来单独写进一个vue文件里了。要做的工作分被调用组件和调用方两个部分

组件设计

defineProps

写入组件第一个面临的事情是原来直接可以使用的数据跨组件不能用了。

这时,只能通过定义props,将组件需要的数据改为从调用方获取。

const props = defineProps({
  user: Object,
  doc: Object,
});

分支情况1:有些变量,我们希望不要直接反应到调用方去

例如:一个组件化的form,只有点击保存,数据才传回去。

这时,我们可以将实际修改的变量存到一个临时变量中,通过watch对应的props,使得props更新的时候,可以实时更新这个临时值;对应的,在修改完成后,通过emit将值以事件的形式返回回去。

defineExpose

有时,我们还需要将组件的某个功能提供给调用方调取,这时,我们可以通过将部分函数封装成expose,达到在调用方调用的目的。一般来讲,能以props传递的尽量还是使用props,尽量不要使用expose的函数进行值设定。

inject

inject和provide,通常用在一对上下级组件里面,例如我们的开源项目APIcat里用到的简易tabs

分成父级的tabs(总体框架)和子层的tab-item(每个tab页面)两个组件

tabs里面provide了一个状态数据对象

const state = reactive({ selectedIndex: null, count: 0 }); 

provide("tabsProvider", state)

子对象里inject了这个数据

const tabs = inject("tabsProvider"); 

watch( () => tabs.selectedIndex, () => { 
  isActive.value = props.name === tabs.selectedIndex; 
  if (isActive.value) { 
    emits("shown") 
  } 
}); 

onBeforeMount(() => { 
  tabs.count++; 
  if (tabs.selectedIndex == null) { 
    tabs.selectedIndex = props.name 
  } 
  if (tabs.selectedIndex == props.name) { 
    isActive.value = true; 
  } 
});

 

注意那个count,父组件里面是0,子组件里通过onBeforeMount,将其做了自增操作,因为每个组件都做了一次onBeforeMount,实际达成的效果就是动态获得总的tab数量,同时通过对selectedIndex的watch,实现了对选中状态的监听,这样,子组件就可以控制显示与否了。

这个做法element-ui里特别多,但是那个里面更为复杂,用到了很多render等高级技术,如果要在组件化的高级道路上继续发展,可以去看他们的源码,如果初级应用,看看我们的APIcat(界面部分在ui里面)。

调用方设计

调用方就是调用不同的组件了,需要讲的点有两个

活用component

作为调用方,可能我们页面某个位置是按条件调用不同的组件的,例如我们的百家饭网站,API操作页面有不同的面板,通过切换左侧按钮切换

 

这时,我们可以使用component语法来加载不同的模块

<component :is="Opening"></component>

通过为Opening设置不同的模块,就可以加载不同的页面组件了

function handleSelect(to) {
  switch (to) {
    case "structure":
      Opening.value = markRaw(Structure)
      break
    case "json_editor":
      Opening.value = markRaw(jsonEditor);
      break;
    case "document":
      Opening.value = markRaw(Editor);
      break;
    case "tester":
      Opening.value = markRaw(Tester);
      break;
    ...
    default:
      break;
  }
}

活用promise

有时,组件还会遇到从不同的数据来源获取数据的问题,例如从本地文件、远程api、内存、剪贴板等。我们可以活用promise来做到

function open(id, req_code = "") {
  var p;
  if (id === "local") {
    p = getYamlAndOpen(localCache.value, { Editable: true });
  } else if (id === "copy") {
    p = navigator.permissions.query({ name: 'clipboard-read' }).then((permission) => {
      if (permission.state !== 'denied') {
        return navigator.clipboard.read()
      }
      return Promise.reject("没有剪贴板访问权限")
    }).then((clipboardContents) => {
      ...
  } else if (id === "disk") {
    p = uploadBlob().catch(() => { });
  } else {
    p = new_axios
      ...
      .then((data) => {
        return getYamlAndOpen(data, docInfo.value);
      })
      .catch((err) => testNeedCode(id, err));
  }
  p.finally(() => {
    loading.close();
  });
}

通过在不同的分支里定义promise,并返回给下游操作,下游操作可以避免不同加载方式的区别,统一进行操作。 

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

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

相关文章

Netflix Eureka 2.0.0正式发布:借尸还魂还是虚晃一枪?

本文已被https://yourbatman.cn收录&#xff1b;女娲Knife-Initializr工程可公开访问啦&#xff1b;程序员专用网盘https://wangpan.yourbatman.cn&#xff1b;技术专栏源代码大本营&#xff1a;https://github.com/yourbatman/tech-column-learning&#xff1b;公号后台回复“…

【Web前端HTML5CSS3】09、高度塌陷与 BFC

九、高度塌陷与 BFC 1、高度塌陷 在浮动布局中&#xff0c;父元素的高度默认是被子元素撑开的 当子元素浮动后&#xff0c;其会完全脱离文档流&#xff0c;子元素从文档流中脱离将会无法撑起父元素的高度&#xff0c;导致父元素的高度丢失 父元素高度丢失以后&#xff0c;其…

IU酒店释放轻中端投资活力,开启曲靖酒店新篇章

曲靖位于云南省东北部&#xff0c;是云南连接内地的重要陆路通道&#xff0c;素有“滇黔锁钥”、“入滇门户”、“云南咽喉”之称&#xff0c;是仅次于昆明的云南第二大城市。曾入选“中国十佳宜居城市”榜单10次的城市&#xff0c;拥有3000多年的文明史&#xff0c;早在三国魏…

mock功能

目标 了解mock的作用及使用场景&#xff1b; mock使用场景 mock&#xff1a;假的 前端程序员提到的mock数据的含义是&#xff1a;真的假数据 真的&#xff1a;符合接口规范要求的。 假数据&#xff1a;数据是人为创建出来的&#xff0c;不是真正的业务数据。 什么时候需要m…

客快物流大数据项目(九十七):ClickHouse的SQL语法

文章目录 ClickHouse的SQL语法 一、​​​​​​​常用的SQL命令 二、​​​​​​​​​​​​​​select查询语法 三、insert into语法 四、​​​​​​​​​​​​​​alter语法 ClickHouse的SQL语法 一、​​​​​​​常用的SQL命令 作用 SQL 列出所有数据库 s…

日本知名汽车零部件公司巡礼系列之株式会社135

株式会社135 业务内容&#xff1a; 各种齿轮零件加工(减速机零件) 齿轮马达的齿轮头零件组装加工 轮式起重机齿轮零件加工 其他部位、零件等的加工 公司简介&#xff1a; 资本金&#xff1a;3000万日元 员工数&#xff1a;41名&#xff08;男33名&#xff0c;女8名&#x…

N维码算法的探索(二),16色的16进制编码表达汉字的试探

前些天写了一篇《N维码算法的探索》&#xff0c;是利用颜色像素对n维码算法扩展的思考。读者非常有限&#xff0c;能够理解的可能需专业人士了。 这种研究的意义何在&#xff1f;不知道。用上了就是有用&#xff0c;用不上也就被历史淘汰了。普通人通常的逻辑是&#xff1a;既…

js获取某一时间到现在的总时间以及svg图标统一管理方法的封装

目录 js获取某一时间到现在的总时间方法封装 一、需求 二、方法 三、使用 js封装一个svg图标管理方法 一、需求 二、实现 三、使用 js获取某一时间到现在的总时间方法封装 一、需求 在做一些信息展示的时候&#xff0c;我们需要展示各种时间&#xff0c;有时是准确的创…

攻防世界-宜兴网信办-inget

题目 访问题目路径 这个题目的意思就是请输入ID&#xff0c;然后尝试绕过&#xff0c;那应该就是SQL注入&#xff0c;但是呢&#xff0c;我是个懒狗&#xff0c;我直接跑sqlmap 先跑数据库名 sqlmap "http://61.147.171.105:51322/?id1" --current-db 爆表 sqlma…

迅为3A5000开发板龙芯自主指令集从里到外100%全国产设计方案

迅为3A5000开发板龙芯处理器自主指令集架构从里到外100%全国产设计方案 iTOP-3A5000 开发板采用全国产龙芯3A5000处理器&#xff0c;基于龙芯自主指令系统&#xff08;LoongArch&#xff09;的LA464微结构&#xff0c;并进一步提升频率&#xff0c;降低功耗&#xff0c;优化性能…

低代码多分支协同开发的建设与实践

作者&#xff1a;黄也(胖丁) 引言 随着低代码的普及&#xff0c;在低代码平台上构建企业级应用逐渐成为生产趋势。同时&#xff0c;随着低代码技术的提升&#xff0c;越来越多的复杂应用在低代码平台中完成。在其研发生命周期中&#xff0c;低代码开发者就会面临多人协作、并…

卷积神经网络 CNN 基础概念

目录 一&#xff1a;卷积神经网络 二&#xff1a;局部感受野 三&#xff1a;卷积层 四&#xff1a;池化层 五&#xff1a;激活层 六&#xff1a;全连接层 七&#xff1a;卷积神经网络算法过程 一&#xff1a;卷积神经网络 卷积神经网络(Convolutional Neural Networks,C…

nor flash调试与使用总结

最近项目中使用到norflash&#xff0c;总结一下学习与使用经验 文章目录一、Flash基本概念存储器介绍与Flash在其中定位---非易失存储器类别中嵌入式领域常见设备Flash的典型分类---NorFlash&#xff08;贵/容量小/读快写慢&#xff09;与NandFlash&#xff08;便宜/容量大/读慢…

Zookeeper 4 Zookeeper JavaAPI 操作 4.9 模拟12306 售票案例

Zookeeper 【黑马程序员Zookeeper视频教程&#xff0c;快速入门zookeeper技术】 文章目录Zookeeper4 Zookeeper JavaAPI 操作4.9 模拟12306 售票案例4.9.1 Curator 实现分布式锁 API4.9.2 分布式锁案例 - 模拟12306 售票4 Zookeeper JavaAPI 操作 4.9 模拟12306 售票案例 4.…

企业经常会问到的软件测试面试题及答案,一定要好好记住

相信对于很多软件测试新手来说&#xff0c;技术项目的面试是十分让人头疼的&#xff0c;生怕没回答得好&#xff0c;就会跟这个offer失之交臂&#xff0c;因此&#xff0c;今天&#xff0c;我以身边朋友面试遇到过的几个问题以及刷过的软件测试题库柠檬班中的压中的题目&#x…

Maven 项目模板

Maven 项目模板 Maven 使用 archetype(原型) 来创建自定义的项目结构&#xff0c;形成 Maven 项目模板。 在前面章节我们学到 Maven 使用下面的命令来快速创建 java 项目&#xff1a; mvn archetype:generate 什么是 archetype&#xff1f; archetype 也就是原型&#xff…

终于有人把性能优化讲清楚了!阿里架构师推荐的Java性能权威指南

Java给大部分人的感觉就是慢&#xff0c;有严重的性能问题。其实程序慢的问题&#xff0c;与语言无关&#xff0c;与Java无关。Java应用的性能优化也是一个老生常谈的话题&#xff0c;但是只要我们深入的了解性能调优方法&#xff0c;走遍天下都不怕&#xff01; 大多数开发人…

mac系统M1pro芯片安装VMware Fusion虚拟机win11操作系统(原创详细版)

VMware22年11月份推出Fusion 13&#xff0c;这是Fusion虚拟软件的最新更新。它允许Mac用户操作虚拟机来运行非macOS操作系统&#xff0c;如Windows 11。 有了Fusion 13&#xff0c;英特尔和苹果芯片Mac用户可以访问Windows 11虚拟机。英特尔Mac提供对Windows 11的全面支持&…

webpack 构建脚手架

前言 1. 构建项目 2. 局部安装 3. webpack.config.js 4. 打包 css 文件 5. 打包 less 文件 6. 打包 vue 文件 7. loader 和 plugin 区别 8. 添加版权的插件 9. html-webpack-plugin 打包 html 的插件 10. 压缩文件 11. webpack-dev-server 搭建本地服务器 前言 本文记录 webpa…

基于鸽群算法改进的DELM预测 -附代码

鸽群算法改进的深度极限学习机DELM的回归预测 文章目录鸽群算法改进的深度极限学习机DELM的回归预测1.ELM原理2.深度极限学习机&#xff08;DELM&#xff09;原理3.鸽群算法4.鸽群算法改进DELM5.实验结果6.参考文献7.Matlab代码1.ELM原理 ELM基础原理请参考&#xff1a;https:…