组件库系列四:组件封装思路

2023-11-09


前面已经有按钮为例子搭建的组件库,这里记录几个组件的封装思路(持续更新)

按钮

感觉涟漪效果挺有趣的,就加进来了,简单分析一下

在按钮组件中使用canvas组件(需要另外封装好)

<!-- 涟漪效果 -->
<por-canvas globalListen v-if="press"></por-canvas>

canvas组件中主要就两个方法,绘制和清除。
点击按钮在绘制前会先进行清除,因为可能是二次点击
点击产生涟漪效果后,对document进行监听点击事件,如果点击了页面其他,就清除canvas效果

注意
(1)点击事件的冒泡问题,当document监听点击事件的时候,事件还在冒泡阶段,会被直接触发,所以需要设置为捕获阶段触发

document.addEventListener("click", this.onClickDocument, true);

(2)因为button组件已经有hover效果,这里需要设置为和hover前一致,也就是去掉hover效果。

输入框

  1. 只读、提示、禁止输入

    这两个可以通过动态绑定属性readonly、title和disabled实现

  2. 错误提示

    传入error参数,v-if判断error为存在时,显示error错误信息

    <div v-if="error">
    	<por-icon icon="icon-cuowu"></por-icon>
    	<span class="error-message">{{error}}</span>
    </div>
    
  3. 保证Vue中的v-model正常使用

    监听change事件,通过$emit触发change(上一级),将value向上传递

    @change="$emit('change', $event.target.value)"
    @input="$emit('input', $event.target.value)"// 同input
    

    还有focus和flur事件,保证输入框正常监听这些事件

tabs选项卡

tabs由五个标签组成:

<por-tabs :selected="selected">
   <por-tabs-head>
      <por-tabs-item name="1">1</por-tabs-item>
      <por-tabs-item name="2">2</por-tabs-item>
      <por-tabs-item name="3" disabled>3</por-tabs-item>
   </por-tabs-head>
   <por-tabs-body>
      <por-tabs-pane name="1">content 1</por-tabs-pane>
      <por-tabs-pane name="2">content 2</por-tabs-pane>
      <por-tabs-pane name="3">content 3</por-tabs-pane>
   </por-tabs-body>
</por-tabs>
  data(){
    return{
      selected: '1'
    }
  }
  1. item和pane如何匹配

    “选择”事件

    tabs提供eventBus,通过Provide向下传递,子组件通过inject获取
    head在eventBus上注册“选择”事件,更新线条位置
    item在eventBus上注册“选择”事件,添加active类名
    pane在eventBus上注册“选择”事件,name与selected相同时,则显示

    selected匹配

    使用tabs组件的使用动态绑定selected属性,name与selected相同的item组件添加样式类名,pane组件显示

    匹配过程

    初始化:找到name值与selected相同组件

    ​ 在挂载阶段遍历子组件,找到head组件,再遍历head组件,找到name与selected相同的 子组件,触发eventBus中的“选择事件”,传入name值,对应name值的item组件修改式, 对应name值的pane组件展示

    点击:传递item组件的name属性值

    item组件绑定点击事件,触发“选择”事件,传入name值,实现切换。

  2. 线条移动
    线条位于head组件中,根据选中的item组件与head组件与左侧窗口距离,计算出线条的左侧偏移量,宽度为item组件的宽度。(bottom为0,height为2px不用计算)

  3. 竖直模式
    direction属性控制水平还是竖直
    tabs组件修改为左右两栏形式,简单使用flex布局
    head组件,修改flex主轴为竖直方向
    线条需要修改位置的计算方式(left变为top等),还有宽高之类的进行对调。

toast提示

  1. 自动关闭

由auto属性决定,默认为5,即5秒后关闭

在mouted钩子中执行关闭方法,即开始计时。因为mouted说明toast已经创建完成。

如果auto属性为false,则点击,触发关闭方法

关闭后,调用this.$destroy()销毁组件

  1. 引入

toast还需要以插件的形式引入,不然没有$toast方法

import { Plugin } from './packages/index'
Vue.prototype.$toast = Plugin

Popover

<por-popover position="bottom">
    <por-button>下方弹出</por-button>
    <template slot="content">
    弹出内容
    </template>
</por-popover>
  1. 点击触发

点击popover包裹的按钮,触发点击事件,改变visible属性,通过v-if对visible进行判断决定浮层是否显示
因为DOM是动态生成的,而且不一定需要该点击事件。所以需要通过$ref和addEventListener添加

this.$refs.popover.addEventListener('click', this.onClick)

hover触发,同上

  1. 浮层位置

根据触发按钮的位置(相对页面视口),确定大致位置(紧靠按钮下边或右边)

然后‘top’, ‘bottom’, ‘left’, 'right’几个值,使用transform进行偏移

如在上面弹出

transform: translateY(-100%);
margin-top: -10px;

下面弹出

margin-top: 10px;

左右位置的实现也类似

  1. 三角样式
// 弹出层上样式
&::before, &::after {
    content: '';
    display: block;
    border: 10px solid transparent;
    width: 0;
    height: 0;
    position: absolute;
}

// 对应top位置的样式
&::before, &::after {
	left: 10px;
}
&::before {
	border-top-color: black;
	border-bottom: none;
	top: 100%;
}
&::after {
	border-top-color: white;
	border-bottom: none;
	top: calc(100% - 1px);
}

拆解一下:

before伪元素相当于添加了一个黑色三角形

// 三角形:宽高都为0,border为透明,只有一边有颜色,形成三角形
&::before {
    content: '';
    display: block;
    width: 0;
    height: 0;
    border: 10px solid transparent;
    border-top-color: black;
    border-bottom: none;
    position: absolute;
    top: 100%;
}

在这里插入图片描述

after伪元素相当于增加了一个白色的三角形

白色三角形将黑色三角形覆盖,区别是偏移相差1px,形成黑色三角边框

&::after { 
   content: '';
   width: 0;
   height: 0;
   display: block;
   border: 10px solid transparent;
   border-top-color: white;
   position: absolute;
   top: calc(100% - 1px);
}

在这里插入图片描述

然后‘top’, ‘bottom’, ‘left’, 'right’具体位置,修改对应的参数

遇到的问题

  1. 涟漪效果组件,通过点击事件在document上进行监听点击事件的时候。注意设置为捕获阶段触发,不然会在本次事件冒泡时直接触发。
  2. 选项卡组件修改为竖直模式时,重点在于线条位置的改变:需要从水平变为竖直。除了修改css之外,还要对位置计算进行修改。我一开始先改了位置计算(点击前和点击后),然后修改css,导致位置一直不符合。因为同时修改了两个方面,导致思路有些混乱。后面先确定初始位置,然后对点击切换后的位置进行调整,很快解决问题。
  3. tabs线条和popover出现位置需要使用到getBoundingClientRect()获取元素相对于视窗的位置集合。
  4. 动态绑定多个类名可以使用computed维护一个数组。
  5. 三角形就是宽高都为0的盒子,设置边框。其中三边的边框为透明,只有一边有颜色。黑白两个三角形重叠且相差1px会形成三角边框。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

组件库系列四:组件封装思路 的相关文章

随机推荐

  • 浅谈VPS

    1 VPS的原理 VPS是采用VPS VirtualPrivateServer 技术 将一部物理服务器分割成多个虚拟专享服务器 分割后形成的VPS虚拟主机都可分配独立公网IP地址 独立操作系统Windows Linux 独立享用空间 独立内
  • 5.4.1 虚拟专用网VPN

    5 4 1 虚拟专用网VPN 我们已经学习了因特网的路由协议 5 3 1 因特网的路由协议 一 5 3 2 因特网的路由协议 二 基于距离向量算法的RIP协议 5 3 3 因特网的路由协议 三 OSPF协议 5 3 4 因特网的路由协议 四
  • TCP滑动窗口 和 拥塞窗口

    结论 滑动窗口 表征发送端和接收端的接收能力 拥塞窗口 表征中间设备的传输能力 TCP滑动窗口 需要说明一下 如果你不了解TCP的滑动窗口这个事 你等于不了解TCP协议 我们都知道 TCP必需要解决的可靠传输以及包乱序 reordering
  • 计算智能:不确定知识与推理

    不确定性 简单来说 不确定性指的是条件A不能100 推导出结论B 不确定性是现实问题中的常态 比如说医学中症状向疾病的推导等等 信度是智能体主动提供的对于相关命题的信心 它来自于已经接受到的感知信息 智能体获得新的感知信息后 其概率评估应得
  • 语雀导出知识库内所有文档为markdown格式备份

    语雀 写在前面 本复刻版本无法提交issue 有问题欢迎到语雀评论区和我交流 我一般不看csdn的评论 需要找我请到语雀文章评论区 欢迎给我的语雀文档点赞 或者给我复刻的仓库star 另外我想说明一下 复刻这个仓库的目的是为了防止重要的笔记
  • navigator对象

    navigator 对象是 JavaScript 中的一个内置对象 表示当前浏览器的信息和状态 它提供了访问浏览器相关信息的属性和方法 下面是一些 navigator 对象的常见属性和方法 navigator userAgent 返回包含浏
  • MySQL慢查询日志总结

    慢查询日志概念 MySQL的慢查询日志是MySQL提供的一种日志记录 它用来记录在MySQL中响应时间超过阀值的语句 具体指运行时间超过longquerytime值的SQL 则会被记录到慢查询日志中 longquerytime的默认值为10
  • 在ubuntu18.04下安装 elsasticsearch-head 插件

    下载链接地址为 https github com mobz elasticsearch head archive master zip 下载命令如下 下载完成之后使用 unzip master zip 命令对下的压缩包进行解压 查看node
  • Qt连接远程SqlServer数据库,遍历结果集速度慢

    如题 我用qt连接远程的sqlserver数据库 一共110条数据 查询的时候遍历结果非常慢 达到十几秒左右 一开始我以为是结构体本身的问题 把结构体里面的赋值函数参数改成引用传递后 速度有所改善 缩短到9秒左右 但是并没有改变根本 最后我
  • AES-GCM加密算法的简单介绍

    一 什么是AES加密 常见的加密主要分为两类 对称加密和非对称加密 AES加密就是对称加密的一种 即加密和解密使用相同的一把密钥 它的全称是Advanced Encryption Standard 高级加密标准 主要是用来取代DES加密算法
  • mobx v6 + react hook 状态管理配置

    react hook 风格下不再使用class类的形式定义组件 也就不再适用mobx以前版本的装饰器语法 以下分享 reack hook 语法风格下使用 mobx v6 版本的状态管理配置使用方式 相关依赖版本 react 17 0 2 m
  • Spark基本概念

    Application 指的是用户编写的Spark应用程序 代码 包含了Driver功能代码和分布在集群中多个节点上运行的Executor代码 Driver Spark中的Driver即运行行数Application的Main 函数并且创建
  • 为什么一个mac可以对应多个ip_路由器、交换机、IP、MAC原来可以这样理解

    先理解它们能够代表着什么 数据帧 快递 二层MAC地址 你的身份证号 全球唯一 三层IP地址 你的当前的住宅地址 你随时可能会搬去其他地址住额外的 规则 一个住宅地址只能住一个人 否则会导致收发快递不正常 交换机 给你派件的快递员 但是只认
  • CTFSHOW 萌新计划web9-15

    题目地址 http ctf show 0x01 web9 乍一看别被迷惑了 这个正则是字符串中包含 system exec highlight才能执行eval if preg match system exec highlight i c
  • 如何用logging记录python实验结果?

    做python实验有时候需要打印很多信息在控制台 console 但是控制台的信息不方便回顾和保存 故而可以采用logging将信息存储起来 先新建一个文件message log 代码如下 import logging logging ba
  • Android Studio 守护进程 错误 Error:Unable to start the daemon process....

    简介 有段时间没有使用Android Studio 最近使用AS打jar包的时候 不知道什么原因 突然出现了的问题 下面也没有详细的错误信息 网上很多解决类似问题的做法都是说AS在启动Jvm时候的空间问题 然而这个问题的下划线下面是有更详细
  • 航天生物计算机作文,科幻遨游太空作文(精选6篇)

    科幻遨游太空作文 精选6篇 导语 很多人语文成绩上不去 都是因为作文分数一直提不上去 为了让您在写作文时更加简单方便 下面是小编为大家收集的科幻遨游太空作文 精选6篇 欢迎大家借鉴与参考 希望对大家有所帮助 遨游太空作文1 太空 是一个充满
  • SQL触发器

    触发器 触发器是与表有关的数据库对象 可以在 insert update delete 之前或之后 触发并执行触发器中定义的SQL语句 触发器的这种特性可以协助应用在数据库端确保数据的完整性 日志记录 数据校验等操作 使用别名 NEW 和
  • 微信小程序之用camera实现类似扫码枪连续扫码

    微信小程序之用camera实现类似扫码枪连续扫码 搜了CSDN里面的文章 除了有一篇有关微信小程序 用微信小程序里面代码实现 扫码的功能 其它都是用别的 原博文是 小程序连续扫码实现但是他只是实现了一次扫码后就不能再继续扫码了 在js代码部
  • 组件库系列四:组件封装思路

    文章目录 按钮 输入框 tabs选项卡 toast提示 Popover 遇到的问题 前面已经有按钮为例子搭建的组件库 这里记录几个组件的封装思路 持续更新 按钮 感觉涟漪效果挺有趣的 就加进来了 简单分析一下 在按钮组件中使用canvas组