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

目录

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-

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java | Leetcode Java题解之第151题反转字符串中的单词

题目&#xff1a; 题解&#xff1a; class Solution {public String reverseWords(String s) {StringBuilder sb trimSpaces(s);// 翻转字符串reverse(sb, 0, sb.length() - 1);// 翻转每个单词reverseEachWord(sb);return sb.toString();}public StringBuilder trimSpaces(S…

这份简历让一位程序员在谷歌获得30万美元

大家好&#xff0c;我是弗雷。每次都在让大家尝试走出职场&#xff0c;但今天我们却选择再次走进职场。 作为曾经的职场人&#xff0c;我深深明白简历的敲门砖作用&#xff0c;制作一份优质的简历至关重要。 你所见过的最优秀的简历是什么样子&#xff1f; 或者你想象中最优秀…

全息图分类及相位型全息图制作方法

全息图是一种光学器件&#xff0c;全息图分为振幅型和相位型全息图&#xff0c;振幅型全息图记录光的振幅信息即强度信息&#xff0c;相位型全息图记录光的相位信息&#xff0c;利用相位信息可以恢复光的波前形状&#xff0c;从而记录物体形状&#xff0c;这里主要介绍相位全息…

Java多线程面试重点-2

16.Synchronized关键字加在静态方法和实例方法的区别? 修饰静态方法&#xff0c;是对类进行加锁&#xff08;Class对象&#xff09;&#xff0c;如果该类中有methodA和methodB都是被Synch修饰的静态方法&#xff0c;此时有两个线程T1、T2分别调用methodA()和methodB()&#x…

深度学习与人工智能

深度学习&#xff0c;是一种特殊的人工智能&#xff0c;他与人工智能及机器学习的关系如下&#xff1a; 近些年来&#xff0c;基于人工神经网络的机器学习算法日益盛行起来&#xff0c;逐渐呈现出取代其他机器学习算法的态势&#xff0c;这主要的原因是因为人工神经网络中有一中…

AI 客服定制:LangChain集成订单能力

为了提高AI客服的问题解决能力&#xff0c;我们引入了LangChain自定义能力&#xff0c;并集成了订单能力。这使得AI客服可以根据用户提出的问题&#xff0c;自动调用订单接口&#xff0c;获取订单信息&#xff0c;并结合文本知识库内容进行回答。这种能力的应用&#xff0c;使得…

Android 13 高通设备热点低功耗模式(2)

前言 之前写过一篇文章:高通热点被IOS设备识别为低数据模式,该功能仿照小米的低数据模式写的,散发的热点可以达到被IOS和小米设备识别为低数据模式。但是发现IOS设备如果后台无任何网络请求的时候,息屏的状态下过一会,会自动断开热点的连接。 分析 抓取设备的热点相关的…

如何查找您的 SOLIDWORKS 序列号或许可证密钥

每个 SOLIDWORKS正版的软件都有自己的许可密钥&#xff0c;也称之为SOLIDWOKS的序列号。硕迪科技作为SOLIDKS正版软件代理商&#xff0c;我们的技术团队经常帮助客户查找他们的序列号。这篇文章将向您展示如何查找您的 SOLIDWORKS 序列号。 如果您拥有独立的 SOLIDWORKS 许可&…

碳化硅陶瓷膜良好的性能

碳化硅陶瓷膜是一种高性能的陶瓷材料&#xff0c;以其独特的物理和化学特性&#xff0c;在众多领域展现出了广泛的应用前景。以下是对碳化硅陶瓷膜的详细介绍&#xff1a; 一、基本特性 高强度与高温稳定性&#xff1a;碳化硅陶瓷膜是一种非晶态陶瓷材料&#xff0c;具有极高的…

[Vulnhub]Solid-State POP3邮件服务(James)+rbash逃逸

信息收集&SSH Server IP addressPorts Open192.168.8.100TCP:22,25,80,110,119,4555 Nmap 扫描: $ nmap -p- 192.168.8.100 --min-rate 1000 -sC -sV 结果: Host is up (0.00061s latency). Not shown: 65529 closed tcp ports (conn-refused) PORT STATE SERVICE…

Nacos启动报错

报错日志&#xff1a; Caused by: java.lang.NullPointerException at com.mysql.jdbc.ConnectionImpl.getServerCharset(ConnectionImpl.java:2983) at com.mysql.jdbc.MysqlIO.sendConnectionAttributes(MysqlIO.java:1873) at com.mysql.jdbc.Mysql…

Spring boot 启动报:Do not use @ for indentation

一、使用maven插件动态切换配置时出现报错 二、配置文件及pom 2.1 配置文件结构 2.2 application.yml spring: # 根据环境读取配置文件&#xff08;手动&#xff09; # profiles: # active: dev# 根据环境读取配置文件&#xff08;通过勾选maven插件&#xff09;profiles…

SAP Build 2-PDF数据提取与决策

0. 安装desktop agent 在后续过程中发现要预先安装desktop agent&#xff0c;否则没法运行自动化流程… 0.1 agent下载 参考官方文档说明 https://help.sap.com/docs/build-process-automation/sap-build-process-automation/create-user-in-rbsc-download-repository?loca…

AI 一键换脸,背景替换,ioDraw让图片更有趣

还在为繁琐的图片处理而烦恼吗&#xff1f;快来试试ioDraw的AI图片工具&#xff01; 它集图像识别、图像生成、智能换脸、背景替换、图像融合、肖像风格化、空间风格化、智能扩图、智能抠图、画质提升、美颜、拉伸修复、透视校正等功能于一身&#xff0c;为你提供前所未有的图…

网络攻击第二节考题有问题的

这个选ab&#xff0c;不懂a是啥这俩是啥 DHCP欺骗-教程详解-CSDN博客 OSI七层网络攻击行为及防范手段_物理层的攻击方式-CSDN博客 这选项讲了吗 选abc 假消息攻击-CSDN博客 啥是ips防护 12题选adcd 为啥连接别人的wifi会被dns欺骗&#xff1f;&#xff1f; 连接的那个wifi…

appproxy 一个轻量级的VPN代理工具,支持HTTP, SOCKS5协议

appproxy 项目背景 在分析app的时候,偶尔需要抓包,尝试了目前比较常见的代理工具Drony Postern ProxyDroid 发现都有一个相同的问题,对于较新的Android系统不太友好,要么app列表显示不正常,或者界面过于复杂,往往设置之后经常会失效,偶然在play上发现一个比较新的代理工具,界…

I/O Stream设计实验

实验要求和目的 深入理解java输入输出流相关类的基本用法&#xff0c;并且可以掌握Java程序的编写和调试。 实验环境 Java语言&#xff0c;PC或android平台 实验具体内容 设计和编写以下程序&#xff1a; 程序1&#xff1a; 从键盘读入多行字符串&#xff08;英文&#xf…

终于把AUC的计算方式搞懂了!

1. 横纵坐标 纵坐标&#xff1a;sensitivity或者TPR 横坐标&#xff1a;FPR 或者 1-Specificity 2. 计算方法 2.1 方法1 def get_roc_auc(y_true, y_score):"""正样本得分大于负样本得分的概率&#xff0c;需要遍历每个正样本和每个负样本1. 选取所有正样本与…

蓝牙资讯|苹果iOS 18增加对AirPods Pro 2自适应音频的更多控制

苹果 iOS 18 系统将为 AirPods Pro 2 用户带来一项实用功能 —— 更精细的“自适应音频”控制。AirPods Pro 2 的“自适应音频”功能包含自适应降噪、个性化音量和对话增强等特性&#xff0c;可以根据周围环境自动调节声音和降噪效果。 当更新至最新测试版固件的 AirPods Pro 2…

小白跟做江科大32单片机之定时器

原理部分 1. 计数器每遇到一个上升沿就会计数值1,。 72MHZ72000000 72000000/65536/655360.0167638063430786132812559.652323555555554 (s) 2. 3. 计数时钟每来一个上升沿&#xff0c;计数值1&#xff0c;自动运行。如果计数值与存储在自动重装载寄存器中的值相等&#…