仿element-ui 实现自己组件库 <3>

news2024/11/30 12:32:13

目录

input 组件封装

v-model用在组件上

显示和隐藏密码

封装switch组件

实现转换的功能

设置checkbox


input 组件封装

首先input组件的基本框架和样式:

<div class="miao-input">
        <input class="miao-input_inner" >
</div>
        
<style lang="scss" scoped>
 .miao-input {
     width: 100%;
     position: relative;
     font-size: 14px;
     display: inline-block;

     .miao-input_inner {
         -webkit-appearance: none;
         background-color: #fff;
         background-image: none;
         border: 1px solid #dcdfe6;
         border-radius: 4px;
         box-sizing: border-box;
         color: #606266;
         display: inline-block;
         font-size: inherit;
         height: 40px;
         line-height: 40px;
         outline: none;
         padding: 0 15px;
         transition: border-color .2s cubic-bezier(.645, 045, .355, 1);
         width: 100%;

         &:focus {
             outline: none;
             border-color: #409eff;
         }

         // input禁用样式
         &.is-disabled {
             background-color: #f5f7fa;
             border-color: #e4e7ed;
             color: #c0c4cc;
             cursor: not-allowed;
         }
     }
 }

 // 后面加suffix的意思是后面如果有后缀的话,触发该样式
 .miao-input_suffix {
     .miao-input_inner {
         padding-right: 30px;
     }

     .miao-input_suffix {
         position: absolute;
         right: 10px;
         height: 100%;
         top: 0;
         line-height: 40px;
         text-align: center;
         color: #c0c4cc;
         transition: all .3s;
         z-index: 900;

         i {
             color: #c0c4cc;
             font-size: 14px;
             cursor: pointer;
             transition: color .2s cubic-bezier(.645, .045, .355, 1);
         }
     }
 }
</style>

v-model用在组件上

首先app.vue里:

<miao-input v-model="username">
</miao-input>
data(){
return {
username:'ss'
}
}

在input.vue里:

props:{
value:{
type:String,
default:''
}
}
 <input class="miao-input_inner" 
        :class="{'is-disabled': disabled}"
        :placeholder="placeholder" :type="type" :name="name"
            :disabled="disabled"
            :value="value"
                    
            >

除了value之外还要触发事件

@input="handleinput"   
methods:{
        handleinput(e){
// this.value=e.target.value是不行的因为直接改了父组件传的参数
this.$emit('input',e.target.value)
// 触发这个事件

        }
    }

添加图标

<span class="miao-input_suffix">
            <i class="miao-input_icon miao-icon-cancel" v-if="clearable" @click="clear"></i>
            <i class="miao-input_icon miao-icon-visible" v-if="showPassword"></i>
        </span>
<div class="miao-input" :class="{'miao-input_suffix': showSuffix}">
computed:{
  showSuffix(){
            return this.clearable || this.showPassword
  }
    },

点击图标清空内容:

 clear(){
            this.$emit('input','')
            // 父组件就会清空
        }

显示和隐藏密码

<i class="miao-input_icon miao-icon-visible" v-if="showPassword" @click="handlePassword"></i>
 :type="showPassword ? (passwordVisible ? 'text':'password'):type"

 如果传来show-password判断是否需要切换密码显示,如果不传不判断 

封装switch组件

只要是表单元素都支持name属性

switch初始模版:

<template>
    <div class="one-switch">
        <span class="one-switch_core">
            <span class="one-switch_button"></span>
        </span>
    </div>
</template>

css:

.miao-switch {
    display: inline-block;
    align-items: center;
    position: relative;
    font-size: 14px;
    line-height: 20px;
    vertical-align: middle;

    .miao-switch_core {
        margin: 0;
        display: inline-block;
        position: relative;
        width: 40px;
        height: 20px;
        border: 1px solid #dcdfe6;
        outline: none;
        border-radius: 10px;
        box-sizing: border-box;
        background: #dcdfe6;
        cursor: pointer;
        transition: border-color .3s, background-color .3s;
        vertical-align: middle;

        .miao-switch_button {
            position: absolute;
            top: 1px;
            left: 1px;
            border-radius: 100%;
            transition: all .3s;
            width: 16px;
            height: 16px;
            background-color: #fff;
        }
    }
}

// 选中样式
.is-checked {
    .miao-switch_core {
        border-color: #409eff;
        background-color: #409eff;

        .miao-switch_button {
            transform: translateX(20px);
        }
    }
}

// 隐藏input标签
.miao-switch_input {
    position: absolute;
    width: 0;
    height: 0;
    opacity: 0;
    margin: 0;
}

v-model绑定组件里的value和触发的事件:
 

props:{
        value:{
            type:Boolean,
            default:false
        }
    },
    methods:{
        handleClick(){
            this.$emit('input',!this.value)
        }
    }

实现转换的功能

<label class="miao-switch" :class="{'is-checked': value}" @click="handleClick">
// 选中样式
.is-checked {
    .miao-switch_core {
        border-color: #409eff;
        background-color: #409eff;

        .miao-switch_button {
            transform: translateX(20px);
        }
    }
}

根据传入switch.vue的两个颜色来控制:

nexttick是基于promsie的封装,这里用语法糖async和await,用nexttick等数据修改后dom更新完毕再更改按钮颜色

methods:{
        async handleClick(){
            this.$emit('input',!this.value)
            //点击时候还要修改背景色
            //等待value发生变化再setcolor
            //把数据改了发生更新
            //nexttick基于promise封装
            //数据修改后等待dom更新再修改按钮颜色
         await this.$nextTick()
         this.setColor()

        },
        setColor() {
            //修改开关颜色,必须传入其一的颜色
            if (this.activeColor || this.inactiveColor) {
                let color = this.value ? this.activeColor : this.inactiveColor
                this.$refs.core.style.borderColor = color
                this.$refs.core.style.backgroundColor = color

            }
        }

    },
    mounted(){
        this.setColor()
    }

设置checkbox

用户使用switch组件实际上当成表单元素使用,可能用到name属性,需要在switch组件中添加一个checkbox,当值改变时候,需要设置checkbox的value值

同步checkbox里的checked值,一进来mounted和切换时候设置值

点击label相当于点击input框

<!-- 外面的大框架如果用label会触发两次,抵消了 -->
        <input class="miao-switch_input" type="checkbox" :name="name" ref="input">
 async handleClick(){
            this.$emit('input',!this.value)
            //点击时候还要修改背景色
            //等待value发生变化再setcolor
            //把数据改了发生更新
            //nexttick基于promise封装
            //数据修改后等待dom更新再修改按钮颜色
         await this.$nextTick()
         this.setColor()
            this.$refs.input.checked = this.value

        },
mounted(){
        this.setColor()
        //控制checkbox的值
        this.$refs.input.checked=this.value
        //input值和value同步


    }

具体代码: 

GitHub - Alicca-miao/component-library-vue-ui-Contribute to Alicca-miao/component-library-vue-ui- development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/Alicca-miao/component-library-vue-ui-

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

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

相关文章

LDR6500:手机电脑拓展坞转接器方案的卓越之选

随着科技的飞速发展&#xff0c;手机和电脑已成为我们日常生活中不可或缺的工具。然而&#xff0c;它们的接口有限&#xff0c;经常难以满足我们多样化的需求。这时&#xff0c;一款高效、稳定的拓展坞转接器就显得尤为重要。LDR6500&#xff0c;作为乐得瑞科技精心研发的USB P…

HCIA12 NAT网络地址转换实验

NAT&#xff08;Network Address Translation&#xff09;是将 IP 报头中的 IP 地址转换为另一个 IP 地址的过程。主要俩好处&#xff1a; • 有效避免来自外网的攻击&#xff0c;可以很大程度上提高网络安全性。 • 控制内网主机访问外网&#xff0c;同时也可以控制外网…

微信鸿蒙版本来了 我不允许你不会

前言: 各位同学大家好, 好久没有更新鸿蒙文章了 现在更新一个鸿蒙版本高仿微信版本 那么废话不多说 我们正式开始 作者:徐庆 团队:坚果派 公众号:“大前端之旅” 润开鸿生态技术专家,华为HDE,CSDN博客专家,CSDN超级个体,CSDN特邀嘉宾,InfoQ签约作者,OpenHarmony布…

SQLServer 借助Navcate做定时备份的脚本

首先创建SQLServer链接&#xff0c;然后在Query标签种创建一个查询 查询内容如下 use ChengYuMES declare ls_time varchar(1000) declare ls_dbname varchar(1000) set ls_time convert(varchar, getdate(), 112) _ replace(convert(varchar, getdate(), 108), :, )-- 需…

51单片机STC89C52RC——代码编译

1&#xff0c;勾选 “Create HEX file” 2&#xff0c;编译

周五美国股市总结,标普止步四日连涨,纳指五日连创新高,法股单周跌幅两年多最深

美国消费者信心意外下滑至七个月新低&#xff0c;通胀预期反弹&#xff0c;标普大盘脱离历史最高&#xff0c;道指连跌四日&#xff0c;罗素小盘股跌至六周新低&#xff0c;有分析称对经济担忧浮现。全周标普和纳指分别累涨1.6%和3.2%&#xff0c;都是八周里第七周上涨&#xf…

大模型+人工智能:重塑地方志管理的新力量

前言 在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;正以前所未有的速度渗透到各个领域&#xff0c;改变着我们的工作和生活方式。特别是在地方志管理这一领域&#xff0c;大模型和人工智能的结合正在开启一场深刻的变革。今天&#xff0c;就让我们一起…

SpringBoot3 整合 Mybatis 完整版

本文记录一下完整的 SpringBoot3 整合 Mybatis 的步骤。 只要按照本步骤来操作&#xff0c;整合完成后就可以正常使用。1. 添加数据库驱动依赖 以 MySQL 为例。 当不指定 依赖版本的时候&#xff0c;会 由 springboot 自动管理。 <dependency><groupId>com.mysql&l…

代码随想录的复习刷题计划1 :动态规划背包问题 01背包+完全背包

动态规划刷题复习 一、01背包 416. 分割等和子集1049. 最后一块石头的重量 II494. 目标和474. 一和零 416. 分割等和子集 class Solution { public:bool canPartition(vector<int>& nums) {int sum0;for(int i0;i<nums.size();i) {sumnums[i];}if(sum%2!0)retu…

腾讯大模型最新路线图,主打一个“实用”

让大模型更接地气&#xff0c;腾讯交出一份阶段性答卷。 大模型狂奔一年多后&#xff0c;正迈向产业落地的深水区。如何用好这一革命性的新技术&#xff0c;已成为整个社会的一道必答题。 去年&#xff0c;国内大模型百花齐放&#xff0c;外界关注的焦点也集中在模型能力上。…

Win11 问题集

文章目录 一、Win11 选择其他应用打开无反应1、新建 1.reg 文件2、新建 2.reg 文件3、运行 reg 文件 二、Win11 账户怎么改名 一、Win11 选择其他应用打开无反应 Win11选择打开方式卡死怎么办? 选择打开方式没有反应的解决办法 1、新建 1.reg 文件 1.reg Windows Registry…

「实战应用」如何用DHTMLX将上下文菜单集成到JavaScript甘特图中(一)

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。 DHTMLX Gantt是一个高度可定制的工具&#xff0c;可以与项目管理应用程序所需的其他功能相补充。在本文中您将学习如何使用自定义上…

计算机木马

病毒具有传播特性、恶意性 木马没有巨大的恶意&#xff0c;主要是帮黑客做些事情&#xff0c;没害你&#xff0c;没有那么广大的传播性

LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码

LIMS&#xff08;实验室&#xff09;信息管理系统源码、有哪些应用领域&#xff1f;采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码 LIMS实验室信息管理系统&#xff0c;是一种基于计算机硬件和数据库技术&#xff0c;集多个功能模块为一体的信息管理系统。该系统主…

有监督学习——梯度下降

1. 梯度下降 梯度下降&#xff08;Gradient Descent&#xff09;是计算机计算能力有限的条件下启用的逐步逼近、迭代求解方法&#xff0c;在理论上不保证下降求得最优解。 e.g. 假设有三维曲面表达函数空间&#xff0c;长(x)、宽(y)轴为子变量&#xff0c;高(z)是因变量&…

【已解决】引入 element 组件无法使用编译错误 ERROR Failed to compile with 1 error

如果大家使用这个vue 配合 element 框架不熟练&#xff0c;当你顺利按照文档安装好 vue 和 element 的时候想要使用element 的组件时候确无法展示出来&#xff0c;甚至报错。不妨看看是不是这个问题&#xff0c; 1.首先使用element 的时候&#xff0c;前提是把必须要的 elemen…

博科SAN交换机初始化和Zone创建

1 初始化 博科的SAN交换机默认配置&#xff1a; 地址&#xff1a;10.77.77.77 账户&#xff1a;admin 密码&#xff1a;password 设备硬件查看 ***-SAN-1:admin> chassisshowFAN Unit: 1 Fan Direction: Reverse (Non-portside Intake) Time Awake: 0 daysP…

基于Python+Flask+MySQL+HTML的B站数据可视化分析系统

FlaskMySQLVue 基于PythonFlaskMySQLHTML的B站数据可视化分析系统 项目采用前后端分离技术&#xff0c;项目包含完整的前端HTML&#xff0c;以及Flask构成完整的前后端分离系统 爬虫文件基于selenium&#xff0c;需要配合登录账号 简介 主页 登录页面&#xff0c;用户打开浏…

电脑屏幕录制怎么录制?这7个录制屏幕的技巧值得一试!

电脑屏幕录制怎么录制&#xff1f;屏幕录制是什么? 简单地说&#xff0c;电脑屏幕录制就是在你的设备屏幕上录制视频。它可以捕捉屏幕上正在发生的事情&#xff0c;并让你与其他人分享。记录电脑、手机或笔记本电脑屏幕的原因有很多&#xff1a; 1. 一个简单的屏幕录制可以用…

C++程序员笔试训练

面试题1&#xff1a;使用库函数将数字转换位字符串 考点&#xff1a;c语言库函数中数字转换位字符串的使用 char *gcvt(double number, int ndigit, char *buf);参数说明&#xff1a; number&#xff1a;待转换的double类型数值。 ndigit&#xff1a;保留的小数位数。 buf&am…