Day57:组件库封装-1

news2024/12/24 8:16:40

封装element组件

参考对象 折叠面板 按钮

npm create vue@3

npm i

使用vue3建库如果报错可以尝试禁用vs的 vetur 插件,这是vue2插件,会给vue3项目报错(禁用了之后需要重新加载

src新建components文件夹

下面新建Button文件夹,新建vue,ts,css文件

使用postcss书写样式

在APP引入script setup lang=ts

引入自定义前缀button并在appvue视图中实现

<template>
  <div>
    <!-- 组件库中的Button是通过接受一系列的props来添加不同的类名
    然后给这些类名添加不同的样式 -->
    <!-- 实现type=primary 这样一个蓝色的button -->
    <xzd-button type="primary">primary按钮</xzd-button>
    <xzd-button type="danger">danger按钮</xzd-button>
    <xzd-button type="danger" disabled>禁用按钮</xzd-button>
    <xzd-button type="info" circle>圆</xzd-button>
    <xzd-button type="danger" round>圆角按钮</xzd-button>
    <xzd-button size="large">大按钮</xzd-button>
    <xzd-button size="small">小按钮</xzd-button>
  </div>
</template>
<script setup lang="ts">
import XzdButton from './components/Button/XzdButton.vue'
</script>

给button不仅要添加自定义type,也要添加原生的type

组建库中的button是通过接受一系列的props来添加不同的类名

引入组件前缀button从前缀button.vue

传递一个type=primary的蓝色圆角button效果

公共button类

约定每个类的可选类型

把可选类型进一步拆分

把类型传递出去

import type { PropType } from "vue";
export type ButtonType = 'primary' | 'success' | 'waring' |
  'info' | 'danger'
export type ButtonSize = 'large' | 'small'
export type nativeType = 'button' | 'reset' | 'submit'

export interface ButtonProps {
    type?: ButtonType;
    size?: ButtonSize;
    plain?: boolean;
    round?: boolean;
    circle?: boolean;
    disabled?: boolean;
    nativeType?: nativeType;
    autofocus?: boolean
    //还需要接受2个原生的button属性
}
//props的类型如果封装成一个单独的文件 在引入的时候无法正确编译
export const buttonprops = {
    type: {
        type: String as PropType<ButtonType>,
        required: false
    },
    size: {
        type: String as PropType<ButtonSize>,
        required: false
    },
    plain: {
        type: Boolean,
        required: false
    },
    round: {
        type: Boolean,
        required: false
    },
    circle: {
        type: Boolean,
        required: false
    },
    disabled: {
        type: Boolean,
        required: false
    },
    nativeType: {
        type: String as PropType<nativeType>,
        required: false
    },
    autofocus: {
        type: Boolean,
        required: false
    }
}

自己定义的类名前缀button中用模板字符串拼接输入的type

判断是否为朴素类型,圆角,圆形

再加一个:disabled=disabled

在app中给button书写需要的可选类名

给文本内容分配插槽

在src下新建文件夹styles,新建vars.css和index.css。

由于没有设计

在把vars.css中element的系列颜色在检查元素的时候右键全部复制粘贴进来

统一替换el为自己定义的类名前缀

除了color之外还有border、font、相关的

reset.css清除浏览器默认样式。新建文件,并引入到index.css中

/* 定义一批css变量 */
@import './vars.css';
@import './reset.css';

想在css中实现嵌套,安装postcss即可,

新建postcss.config.cjs

npm i postcss-nested -D

安装vs高亮插件

在button的css中定义button的相关样式,并将button的css引入到styles中的index.css

通过type可以决定按钮的样式

在button的css中为button添加间距

选中button需要有focus、hover效果。边框active时变深

.xzd-button {
  & + & {
    margin: 12px;
  }
  &:hover,
  &:focus {
    color: var(--xzd-button-text-color);
    border-color: var(--xzd-button-hover-border-color);
  }
  &:active {
    color: var(--xzd-button-text-color);
    border-color: var(--xzd-button-active-border-color);
  }
}

修改朴素按钮的hover效果 &.is-plain ,&.is-round圆角,&.is-circle圆形

禁用按钮需要用原生的cursor: not-allowed;的禁用。需要给类名和属性,还有类名和属性的hover和focus也添加禁用。

.xzd-button {
  /* disabled */
  &.is-disabled,
  &.is-disabled:hover,
  &.is-disabled:focus,
  &[disabled],
  &[disabled]:hover,
  &[disabled]:focus {
    color: var(--xzd-button-disabled-text-color);
    cursor: not-allowed;
    background-image: none;
    background-color: var(--xzd-button-disabled-bg-color);
    border-color: var(--xzd-button-disabled-border-color);
  }
}

设置large和small对应尺寸的样式,并在buttonvue中添加[`xzd-button--${size}`]: size,

.xzd-button--large {
  --xzd-button-size: 40px;
  height: var(--xzd-button-size);
  padding: 12px 19px;
  font-size: var(--xzd-font-size-base);
  border-radius: var(--xzd-border-radius-base);
}
.xzd-button--small {
  --xzd-button-size: 24px;
  height: var(--xzd-button-size);
  padding: 5px 11px;
  font-size: 12px;
  border-radius: calc(var(--xzd-border-radius-base) - 1px);
}

设置产品系列颜色,使用遍历的方法写。在postcss中,想要支持写遍历,需要安装npm i postcss-each -D

给primary, success, warning, info, danger做一个遍历。 $val相当于循环变量,每次遍历的时候会替换成五个中的一个。遍历到哪个就给他添加一个新的值

/* 给不同的type类型添加上对应的样式(产品色彩) */
@each $val in primary, success, warning, info, danger {
  .xzd-button--$(val) {
    --xzd-button-text-color: var(--xzd-color-white);
    --xzd-button-bg-color: var(--xzd-color-$(val));
    --xzd-button-border-color: var(--xzd-color-$(val));
    --xzd-button-outline-color: var(--xzd-color-$(val)-light-5);
    --xzd-button-active-color: var(--xzd-color-$(val)-dark-2);
    --xzd-button-hover-text-color: var(--xzd-color-white);
    --xzd-button-hover-bg-color: var(--xzd-color-$(val)-light-3);
    --xzd-button-hover-border-color: var(--xzd-color-$(val)-light-3);
    --xzd-button-active-bg-color: var(--xzd-color-$(val)-dark-2);
    --xzd-button-active-border-color: var(--xzd-color-$(val)-dark-2);
    --xzd-button-disabled-text-color: var(--xzd-color-white);
    --xzd-button-disabled-bg-color: var(--xzd-color-$(val)-light-5);
    --xzd-button-disabled-border-color: var(--xzd-color-$(val)-light-5);
  }

primary的按钮不是朴素按钮,hover时有一层白色遮罩,需要单独处理。但每一样单独处理非常麻烦,需要在css中使用遍历

@each $val in primary, success, warning, info, danger {
  .xzd-button--$(val) {...}
  .xzd-button--$(val).is-plain {
    --xzd-button-text-color: var(--xzd-color-$(val));
    --xzd-button-bg-color: var(--xzd-color-$(val)-light-9);
    --xzd-button-border-color: var(--xzd-color-$(val)-light-5);
    --xzd-button-hover-text-color: var(--xzd-color-white);
    --xzd-button-hover-bg-color: var(--xzd-color-$(val));
    --xzd-button-hover-border-color: var(--xzd-color-$(val));
    --xzd-button-active-text-color: var(--xzd-color-white);
  }
}

注:sass原生支持嵌套和变量,和遍历

/* 给不同的type类型添加上对应的样式(产品色彩) */
@each $var in primary,success,warning,info,danger{
  .xzd-button--$(var) {
    --xzd-button-bg-color: var(--xzd-color-$(var));
  }
}

在前缀buttonvue中传一个默认值在网页检查端

折叠面板封装

新建文件夹,在app中引入

<xzd-collapse>
      <xzd-collapse-item name='1' title='标题1' disabled> <!-- 无法展开 -->
        <div>第一个折叠面板的内容</div>
      </xzd-collapse-item>
    </xzd-collapse>

必须要有name属性,添加title属性

新建两个vue——xzd-collapse和xzd-collapse-item

xzd-collapse中只写类名和插槽<solt />

xzd-collapse-item中写类名

在类型ts中,name是必传的,所以单独封装类型

余下的在export interface CollapseItemProps中规定传参类型

import type { InjectionKey } from "vue"

export type PropsName = string | number
export interface CollapseItemProps {
    name:PropsName,
    title?:string,
    disable?:boolean
}

基础用法写法

手风琴效果:每次只能展开一个面板。

通过accordion属性来设置是否以手风琴模式显示

基础写法:可以展开多个面板,面板之间互不影响

在item.vue上写头部样式(div)

在xzd-collapse-item中引入规定好的CollapseItemProps泛型参数

import type { CollapseItemProps } from './type'
defineProps<CollapseItemProps>()

在视图中写动态接受的div{{title}},给title写样式,样式中有一项为id,id中模板字符串为动态唯一值name

标题下面写内容,给内容书写样式,也动态唯一值name

只要传递过来disabled类名,则禁止点击

<div class="xzd-collaspe-item">
  <div class="xzd-collaspe-item__header" :class="{
    'is-disabled': disabled
    }" :id="`xzd-collaspe-head-${name}`">
    {{ title }}
  </div>
  <div class="xzd-clooapse-item__wrapper" :id="`xzd-collaspe-wrapper-${name}`">
    <div class="xzd-clooapse-item__content"></div>
  </div>
</div>

在app中引入两个Collapse,以显示Collapse标签的内容

在item.vue中引入type.ts中定义好的props约束,来约束数据类型

itemvue的title不能直接写为{{}},需要写在传递的插槽里。在app中以具名插槽的形式给插槽title传递title

<div class="xzd-collaspe-item__header" 
:class="{
    'is-disabled': disabled
}" 
:id="`xzd-collaspe-head-${name}`">
    <slot name="title">{{ title }}</slot>
</div>

div中以具名插槽的形式传递title的内容

在Collapse中定义activeName,为空数组,如果点击哪一项,就给中间传哪一项的name。且给activeName传了约束类型PropsName数组型

需要传递一个点击事件,在点击折叠面板头部的时候触发, 点击后在activeName如果有这一项,就删除这一项,如果没有就添加上这一项

给子组件传递activeName,需要在collaspe-item内部做判断,判断这个数组中是否包含当前的name值。如果在,当前折叠面板应该展开,否则闭合

import {ref} from 'vue'
import type {PropsName} from './'
let activeName = ref<PropsName[]>([])
let handleClick = (name: PropsName): void => {
  // 判断这个数组中是否包含当前的name值。在,当前折叠面板应该展开,否则闭合
  const index = activeNames.value.indexOf(name) 
  // 只要不存在就是-1,存在为具体值
  if(index > -1) {
      activeNames.value.splice(index,1) /* 删除 */
  }else{
      activeNames.value.push(name) /* 加上 */
  }
}

跨级且使用插槽不能用props传参,需要使用依赖注入传递参数。

跨级传递,需要给传参一个唯一的key值

在type.ts中export一下collapseContextKey,再引入回item

在CollapseContext中规定要传递的参数的类型,再使用symbol生成唯一的collapseContextKey

从父组件中传参到子组件item

通过inject collapseContextKey来得到父子组件之间的传值

通过isActive的变量来判断当前Item的name是否存在于activeNames中。如果在显示对应的content,否则不显示。

定义一个isActive,通过computed来判断是否为真。在视图中v-show isActive,为真显示,为假不显示。

在item.vue头部定义点击事件handleClick,再实现一下handleClick方法。

点击标题的头部,如果它在显示,让那一条折叠面板收起来;如果没显示,则显示。

如果disable,则直接return

组间传递的方法handleClick和点击的那个头的name

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

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

相关文章

9月19-21日上课内容 zabbix监控系统与部署Zabbix5.0监控

本章结构 前言 监控软件的作用 作为一个运维&#xff0c;需要会使用监控系统查看服务器状态以及网站流量指标&#xff0c;利用监控系统的数据去了解上线发布的结果和网站的健康状态 利用一个优秀的监控软件&#xff0c;我们可以&#xff1a; ●通过一个友好的界面进行浏览整…

什么是单片机最小系统?

大家好&#xff0c;我是山羊君Goat。 对于单片机来说&#xff0c;它是一种电子编程器件&#xff0c;可以实现很多多样的功能&#xff0c;常见的单品机有51&#xff0c;STM32等等。 单片机&#xff08;single-chip Microcomputer&#xff09;&#xff0c;是一种集成电路芯片&am…

云服务器 CentOS7 操作系统上安装Jpress (Tomcat 部署项目)

1、xShell 和 xftp 下载安装&#xff08;略&#xff09; https://www.xshell.com/zh/free-for-home-school/2、xftp 连接云服务器 xftp 新建连接 3、JDK 压缩包下载 下载 jdk1.8 注&#xff1a;此处 CentOS7 是64位&#xff0c;所以下载的是&#xff1a;Linux x64&#xf…

CSAPP的Lab学习——ProxyLab

文章目录 前言一、第一部分&#xff1a;实现一个顺序的web代理HTTP/1.0 GET请求请求标头端口号 二、第二部分&#xff1a;处理多个并发请求三、第三部分&#xff1a;缓存web对象最大缓存大小最大对象大小驱逐政策同步 总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招…

打点初级技巧

什么是打点&#xff1f; 打点的目的获取一个服务器的控制权限。获得一个webshell。 步骤 如果你拿到一个网站的名字&#xff0c;该如何进行打点呢&#xff1f;首先&#xff0c;在天眼查上查询该网站&#xff0c;进入查询到的官网&#xff1a; 天眼查-商业查询平台_企业信息查…

48v转24v 3A 48v转12v 48v转5v电源芯片AH7691X

AH7691X是一款高-效-率、高-压降压型DC-DC转换器&#xff0c;采用固定110KHz的开关频率&#xff0c;具备3A的输出电流能力&#xff0c;低纹波&#xff0c;并且具备***软启动功能、过压保护功能和温度保护。该器件还集成了峰值限流功能&#xff0c;简化了电路设计。 AH7691X内部…

2023 年热门的大型语言模型 (LLMs)汇总【更新至9月26】

一、全景地图 整理了一张大语言模型的血缘图谱&#xff0c;如下图所示&#xff1a; 图中的大语言模型&#xff0c;都是自己做过评测的&#xff0c;主观了点&#xff0c;但是原汁原味&#xff0c;有好的可以推荐给我。 二、ChatGPT系列 ChaTGP是商业版本大语言模型的正统&…

ModuleNotFoundError: No module named ‘Crypto.Cipher‘或‘Crypto 的终极解决方案

1、安装wapiti漏洞扫描工具&#xff0c;出现这个错误&#xff0c;先安装pycrypto&#xff0c;因为在python3以上的版本中&#xff0c;Crypto包名变了。 1&#xff09;尝试安装&#xff1a; pip install pycrypto 2&#xff09;安装成功&#xff0c;找到本地python安装目录&a…

processflow基于私有云存储的多人实时协作尝试

前言 继上一篇基于oneDrive实现多人协作之后&#xff0c;发现Onedrive存在诸多限制之处&#xff0c;比如国内网络环境很差&#xff0c;多人协作还需要processflow用户自己注册oneDrive账号&#xff0c;然后oneDrive系统内进行文件分享&#xff0c;才能拿到分享链接进行多人协作…

一文教你学会Makefile脚本的简单应用

一文教你学会Makefile脚本的简单应用 一.什么是Makefile脚本二.Makefile语法三.使用Makefile编译多个文件3.1 运行脚本3.2 利用Makefile删除不必要文件 四.Makefile进阶语法4.1在Makefile中使用变量4.2 Makefile中通配符 五.总结 一.什么是Makefile脚本 Makefile其实就是一种脚…

Nginx:location与rewrite

目录 一.location与rewrite区别 1.1.基于Nginx的location与rewrite常用的正则表达式&#xff08;Nginx的正则表达式&#xff09; 二.location模块 2.1.location的三种匹配类别 2.2.location的常用匹配规则 2.3.location匹配优先级 2.4.location模块使用实例 三.rewrite…

第2讲:Vue开发环境的搭建及运行

Vue开发环境搭建步骤 1、安装node http://www.nodejs.com.cn/ 一般安装在根目录下&#xff0c;直接下一步下一步安装即可。如何检测安装完毕 node -v 2、第二步&#xff1a;安装vue-cli脚手架 npm install -g vue/cli &#xff0c;查看安装版本 vue --version 3、第…

Buildroot添加自定义文件

在日常开发中&#xff0c;我们经常会向buildroot文件系统里添加自定义文件。本文介绍几种添加的方法 一、buildroot/system/skeleton目录 skeleton能够在目标文件系统编译完成后将指定文件覆盖到某个目录。通过这种方式&#xff0c;我们可以方便地添加或修改一些文件到根文件系…

【lesson11】环境变量

文章目录 环境变量的认识main函数参数问题 环境变量的认识 我们知道我们运行自己写的可执行程序的时候&#xff0c;我们必须带路径才能运行&#xff0c;可是执行系统指令的时候不用路径就能运行。 演示&#xff1a; 问题&#xff1a;系统命令可以直接运行&#xff0c;自己写…

单链表详细解析|画图理解

前言&#xff1a; 在前面我们学习了顺序表&#xff0c;相当于数据结构的凉菜&#xff0c;今天我们正式开始数据结构的硬菜了&#xff0c;那就是链表&#xff0c;链表有多种结构&#xff0c;但我们实际中最常用的还是无头单向非循环链表和带头双向循环链表&#xff0c;我们今天先…

删除表

MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 语法格式: drop table 表名; 说明:连同表结构、表中的数据都删除 案例&#xff1a;删除test03表&#xff0c;并验证 mysql> desc test03; ---…

安装Pymc3模块包问题记录

首先跟着各个方法安装&#xff0c;都不行&#xff0c;导入pymc3包时&#xff0c;就会报各种错&#xff1b;最后找了好几个博客跟着修改&#xff0c;最终才把pymc3包安装上了&#xff0c;也能导入进去了。 重新整理下安装步骤&#xff1a; 1、下载安装Anaconda3&#xff1a; …

【趣味JavaScript】5年前端开发都没有搞懂toString和valueOf这两个方法!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…

在C或C++中查找内存泄漏

编程软件中的内存泄漏可能很难精确定位&#xff0c;因为这里面有大量的数据。本文中&#xff0c;您可以学习如何借助运行时错误检测工具查找C和C应用程序中的内存泄漏。 什么是内存泄漏&#xff1f;C和C语言实例 What Is a Memory Leak? 当您面临内存泄漏时&#xff0c;C和C…

师德师风演讲稿写作格式:如何用三句话吸引听众的注意力

写师德师风演讲稿时&#xff0c;可以按照以下格式进行写作&#xff1a; 1. 开头部分&#xff1a; a. 引起听众的兴趣&#xff0c;可以使用一个引人入胜的故事、一个有趣的事实或者一个引人思考的问题。 b. 简要介绍自己以及演讲的主题。 2. 主体部分&#xff1a; a. 阐述师…