你也想做一个Element-ui吧!!!——Blueの前端路(一)

目录

前言:

 父子组件

button组件

 使用vue脚手架初始化一个项目

如何封装,注册和使用一个组件

main.js中将组件设置为全局

使用

此组件我们所需实现的内容

type

父组件组件传递type属性

子组件接收负组件传递的数据

通过绑定类名的方法动态控制样式

设置不同类型的样式

plain属性

父组件组件传递plain值

子组件接收负组件传递的数据,同样进行props校验,并且设置默认值为false

通过绑定类名的方法动态控制样式,由于plain类型是布尔值,所以在类型中我们使用对象的形式来控制样式

设置不同类型的样式,由于plain类型是以对象的形式在类中定义的,所以使用获取属性的方法定义样式

round

父组件传递round值

子组件获取属性值:

round样式

子组件设置该选择器

circle

button组件中使用字体图标

第一步: 在main.js中引入字体图标

第二步:父组件传递图标名,子组件接收并且放到图标中

父组件传值:

子组件接收:

使用接收到的字体图标。在没有传入icon时隐藏标签,在slot插槽没有传入值时,不显示标签

设置icon配套样式,使图标和文字之间有一定间隔

button组件中的点击事件

组件中的定义点击事件:

定义一个点击事件,这个点击事件的作用是调用父组件中的点击事件,并且回调

父组件在使用时定义自己的点击事件,其本质是子组件中的点击事件触发父组件中的点击事件。

结尾


前言:

  又到了暑假了,俺最近想做一个属于自己的组件库类似Element-ui这样的东东,奈何本人也是一名新手,没有那么强的前端功力,所俺就边学边记录自己的学习过程,将自己的笔记和所遇到的问题写成csdn的文章,一是为了分享笔记,让更多朋友们能够轻松学习,二是在写笔记的途中,也可以总结提高。以下是我所观看的视频:

http://【VUE进阶-从0到1搭建UI组件库(1-3)】https://www.bilibili.com/video/BV1nJ411V75n?p=7&vd_source=bb412cc25ca27e171f8e17085daad038

 父子组件

父组件:为你所写的页面,该页面需要引入其他组件所以为父组件

子组件:你所写的能够被引用到其他页面的东东

button组件

 使用vue脚手架初始化一个项目

使用vue created one-ui,创建一个名为one-ui的项目。

按照自己的习惯设置脚手架风格,这里不多做介绍。

脚手架搭建完毕后,将App.vue文件下的自带内容清理一下,为后续开发做准备。

如何封装,注册和使用一个组件

在componet下创建一个button.vue的文件,放置button组件代码。创建一个组建的button组件,,并且指定name为WssButton(按照自己想法来取名)。  

<template><button class="wss-button">按钮组件</button>
</template><script>export default {name: 'WsButton'
}
</script><style lang="scss"></style>

 

main.js中将组件设置为全局

import Button from './components/button.vue'
Vue.component(Button.name, Button)//用此组件命名为我们取的名字

使用

<template><div><WsButton></one-button></div>
</template>

此组件我们所需实现的内容

 

type

让按钮支持type属性,使得按钮支持不同样式

父组件组件传递type属性

App.vue:

<template><div class="app"><div class="row"><WsButton type="primary" @click="ww(123)">按钮</WsButton><WsButton type="success">按钮</WsButton><WsButton type="info">按钮</WsButton><WsButton type="warning">按钮</WsButton><WsButton type="danger">按钮</WsButton></div></div></template>
子组件接收负组件传递的数据

button.vue代码:

export default {name: 'oneButton',// 此时对props进行校验,值接收string类型的type值props: {type:{type: String,// 设置默认值:如果不传值,那么使用defaultdefault: 'default'}},created () {console.log(this.type)//defalut primary success info danger warning}
}
通过绑定类名的方法动态控制样式

button.vue代码:

<template><button class="wss-button" :class="`wss-button-${type}`"><span><slot></slot></span></button>
</template>
设置不同类型的样式

button.vue代码:

.wss-button
{display: inline-block;line-height: 1;white-space: nowrap;cursor: pointer;background: #ffffff;border: 1px solid #dcdfe6;color: #606266;-webkit-appearance: none;text-align: center;box-sizing: border-box;outline: none;margin: 0;transition: 0.1s;font-weight: 500;//禁止元素的文字被选中-moz-user-select: none;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;padding: 12px 20px;font-size: 14px;border-radius: 4px;&:hover,&:hover{color: #409eff;border-color: #c6e2ff;background-color: #ecf5ff;}}.wss-button-primary{color:#fff;background-color: #409eff;border-color: #409eff;&:hover,&:focus{background: #66b1ff;background-color: #66b1ff;color: #fff;}}.wss-button-success{color:#fff;background-color: #67c23a;border-color: #67c23a;&:hover,&:focus{background: #85ce61;background-color: #85ce61;color: #fff;}}.wss-button-info{color:#fff;background-color: #909399;border-color: #909399;&:hover,&:focus{background: #a6a9ad;background-color: #a6a9ad;color: #fff;}}.wss-button-warning{color:#fff;background-color: #e6a23c;border-color: #e6a23c;&:hover,&:focus{background: #ebb563;background-color: #ebb563;color: #fff;}}.wss-button-danger{color:#fff;background-color: #f56c6c;border-color: #f56c6c;&:hover,&:focus{background: #f78989;background-color: #f78989;color: #fff;}}

plain属性

和type类型相同,我们只要将样式先设置好,然后通过父组件传递过来的值进行判断,就可以设置plain属性了。

父组件组件传递plain值

App.vue的代码:

 <div class="row"><WsButton type="primary" plain>按钮</WsButton><WsButton type="success" plain>按钮</WsButton><WsButton type="info"   plain>按钮</WsButton><WsButton type="warning" plain>按钮</WsButton><WsButton type="danger" plain>按钮</WsButton></div>
子组件接收负组件传递的数据,同样进行props校验,并且设置默认值为false

button.vue代码:

  props: {plain: {type: Boolean,default: false}}

通过绑定类名的方法动态控制样式,由于plain类型是布尔值,所以在类型中我们使用对象的形式来控制样式

App.vue的代码:

<template><button class="wss-button" :class="[`wss-button-${type}`,{'is-plain':plain}]"><span><slot></slot></span></button>
</template>
设置不同类型的样式,由于plain类型是以对象的形式在类中定义的,所以使用获取属性的方法定义样式

button.vue代码:

// 朴素按钮样式
.wss-button.is-plain{&:hover,&:focus{background: #fff;border-color: #489eff;color: #409eff;}
}
.wss-button-primary.is-plain{color: #409eff;background: #ecf5ff;&:hover,&:focus{background: #409eff;border-color: #409eff;color: #fff;}
}
.wss-button-success.is-plain{color: #67c23a;background: #c2e7b0;&:hover,&:focus{background: #67c23a;border-color: #67c23a;color: #fff;}
}
.wss-button-info.is-plain{color: #909399;background: #d3d4d6;&:hover,&:focus{background: #909399;border-color: #909399;color: #fff;}
}
.wss-button-warning.is-plain{color: #e6a23c;background: #f5dab1;&:hover,&:focus{background: #e6a23c;border-color: #e6a23c;color: #fff;}
}
.wss-button-danger.is-plain{color: #f56c6c;background: #fbc4c4;&:hover,&:focus{background: #f56c6c;border-color: #f56c6c;color: #fff;}
}

round

设置round属性和之前的相似,只要在组件中定义好了样式,动态获取属性值即可

父组件传递round值

App.vue代码:

<div class="row"><WsButton type="primary"  round>按钮</WsButton><WsButton type="success"  round>按钮</WsButton><WsButton type="info"    round>按钮</WsButton><WsButton type="warning"  round>按钮</WsButton><WsButton type="danger"  round>按钮</WsButton></div>
子组件获取属性值:

button.vue代码

 round: {type: Boolean,default: false}
round样式

button.vue代码

.wss-button.is-round{border-radius: 20px;padding: 12px 23px;
}
子组件设置该选择器

button.vue代码

<button class="wss-button" :class="[`wss-button-${type}`, {'is-plain': plain ,'is-round': round}>
<span>
<slot></slot>
</span>
</button>

circle

自己动手看看吧!!!!

button组件中使用字体图标

在项目中使用字体图标,首先需要有字体图标,我们可以去阿里巴巴矢量图标库下载。

下载完成后,在asset目录下新建一个fonts目录,存放我们下载到的字体图标。

第一步: 在main.js中引入字体图标
import './assets/iconf/iconfont.css'
第二步:父组件传递图标名,子组件接收并且放到图标中
父组件传值:

App.vue代码:

<div class="row"><WsButton icon="dingbudaohang_xiaoxi" circle></WsButton><WsButton type="primary" icon="cedaohang_shouye" circle></WsButton><WsButton type="success" icon="cuowu" circle></WsButton><WsButton type="warning" icon="touxiangxiala_shuaxin" circle></WsButton><WsButton type="danger" icon="dingbudaohang_weizhigongneng" circle></WsButton></div>
子组件接收:

button.vue

    icon: {type: String,default: ''}
使用接收到的字体图标。在没有传入icon时隐藏<i>标签,在slot插槽没有传入值时,不显示<span>标签

button.vue

<template><button class="wss-button" :class="[`wss-button-${type}`,{'is-plain':plain,'is-round':round,'is-circle':circle,}]"><i v-if="icon" :class="`icon-${icon}`"></i><!-- 如果没传入文本插槽,则不显示span内容 --><span v-if="$slots.default"><slot></slot></span></button>
</template>
设置icon配套样式,使图标和文字之间有一定间隔

button.vue代码

.wss-button [class*=one-icon-]+span{margin-left: 5px;
}

button组件中的点击事件

我们在使用组件时,直接给组件定义事件是不会被触发的。我们需要在组件中定义一个点击事件,这个点击事件不进行其他操作,只出发父组件中的点击事件。

组件中的定义点击事件:
<template><button class="wss-button" :class="[`wss-button-${type}`, {'is-plain': plain ,'is-round': round,'is-circle': circle}]" @click="clickthing"><i  v-if="icon" class="iconfont" :class="`icon-${icon}`"></i><span v-if="$slots.default"><slot></slot></span></button>
</template>
定义一个点击事件,这个点击事件的作用是调用父组件中的点击事件,并且回调
 methods: {clickthing (e) {this.$emit('click', e)}}
父组件在使用时定义自己的点击事件,其本质是子组件中的点击事件触发父组件中的点击事件。
 <WsButton type="primary" @click="ww(123)">按钮</WsButton>
<script>
export default {methods: {ww (a) {console.log(a)}}
}
</script>

结尾

一起加油吧!!!

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

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

相关文章

MP4怎么转为MP3?超多人都在用的四种转换方法!

MP4怎么转为MP3&#xff1f;MP4&#xff0c;这一风靡全球的多媒体容器格式&#xff0c;无疑是数字时代的一枚璀璨明珠&#xff0c;深深烙印在每个人的数字生活之中&#xff0c;那么&#xff0c;它究竟是如何在众多格式中脱颖而出&#xff0c;赢得如此广泛认可的呢&#xff1f;首…

【qt】TCP服务端发消息给客户端

在使用Qt的网络编程中&#xff0c;数据的传输通常使用QByteArray来进行. 可以用toUtf8() 来进行转换. 用write() 来写入数据 运行结果:

python如何查看类的函数

Python非常方便&#xff0c;它不需要用户查询文档&#xff0c;只需掌握如下两个帮助函数&#xff0c;即可查看Python中的所有函数&#xff08;方法&#xff09;以及它们的用法和功能&#xff1a; dir()&#xff1a;列出指定类或模块包含的全部内容&#xff08;包括函数、方法、…

10349 数字滑雪

为了解决这个问题&#xff0c;我们可以采用动态规划加深度优先搜索&#xff08;DFS&#xff09;的方法。这里的关键是使用一个辅助矩阵dp来存储从每个点开始的最长滑行距离。我们从每个点出发&#xff0c;尝试向四个方向滑行&#xff0c;只有当目标点的高度低于当前点的高度时&…

【Linux】进程控制(shell的模拟实现)

目录 一.进程终止 进程退出 exit(int status)和_exit(int status) exit的方式退出 _exit的方式退出 退出码 二.进程等待 进程等待方法 wait waitpid 非阻塞等待 三.进程替换 execl execv execle 四.shell模拟实现 一.进程终止 什么是进程终止&#xff0c;这应该很好理…

2024年企业最担心的是什么?隐私?数据安全?企业聊天软件?

随着科技日新月异的发展&#xff0c;企业在面对激烈的市场竞争时&#xff0c;也必须不断调整策略&#xff0c;积极应对新的挑战。 2024年&#xff0c;企业的关注焦点涉及到多个方面&#xff0c;然而可以认为其最担心的一些核心问题大致为以下几点&#xff1a; 隐私与数据安全。…

2024C++信息素养大赛-算法创意实践挑战_复赛真题(广东省)题目+参考答案和详细解析

第一题&#xff1a; #include<bits/stdc.h> using namespace std; int a,b;int main(){scanf("%d%d",&a,&b);printf("%d",a*b);return 0; } 第二题&#xff1a; #include<bits/stdc.h> using namespace std; int a,b,c;int main(){sca…

如何选择一款适合自己的鼠标?

在今天的数字时代&#xff0c;鼠标已经成为人们日常办公和娱乐的不可或缺的工具之一。然而&#xff0c;市面上各式各样的鼠标琳琅满目&#xff0c;如何选择一款适合自己的鼠标成为了一个令人困惑的问题。 鼠标的类型 在选择鼠标时&#xff0c;首先需要了解鼠标的类型。常见的…

昇思学习打卡-15-热门LLM及其他AI应用/基于MindNLP+MusicGen生成自己的个性化音乐

文章目录 MusicGen权重选择生成音乐采样模式&#xff08;Sampling&#xff09;贪心模式&#xff08;Greedy Search&#xff09;使用 学习使用MindNLPMusicGen生成自己的个性化音乐的流程 MusicGen MusicGen模型基于Transformer结构&#xff0c;可以分解为三个不同的阶段: 用户…

文心快码——百度研发编码助手

介绍 刚从中国互联网大会中回来&#xff0c;感受颇深吧。百度的展商亮相了文心快码&#xff0c;展商人员细致的讲解让我们一行了解到该模型的一些优点。首先&#xff0c;先来简单介绍一下文心快码吧。 文心快码&#xff08;ERNIE Code&#xff09;是百度公司推出的一个预训练…

AGI 之 【Hugging Face】 的【问答系统】的 [Haystack构建问答Pipeline] 的简单整理

AGI 之 【Hugging Face】 的【问答系统】的 [Haystack构建问答Pipeline] 的简单整理 目录 AGI 之 【Hugging Face】 的【问答系统】的 [Haystack构建问答Pipeline] 的简单整理 一、简单介绍 二、构建问答系统 三、用Haystack构建问答pipeline 1、检索器 2、阅读器 3、初…

24暑假计划

暑假计划&#xff1a; 1.从明天起开始将C语言的部分补充完整&#xff0c;这部分的预计在7月24日前完成 2.由于之前的文章内容冗余&#xff0c;接下来进行C语言数据结构的重新编写和后面内容的补充预计8月10号前完成 3.后续开始C的初级学习

YOLOv5改进 | 注意力机制| 对小目标友好的BiFormer【CVPR2023】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a; 《YOLOv5入门 改…

从新手到进阶:高效设计 Tableau 可视化的 5 种技巧 | 数据可视化分析

让我们一起跟着大神学习五个超实用的技巧&#xff0c;加速你的可视化分析之旅&#xff01; 在日常分析中&#xff0c;人人都想实现可视化最佳实践。然而&#xff0c;对于很多初学者来说&#xff0c;在还未熟练掌握 Tableau 的情况下&#xff0c;这种愿望貌似不太符合实际。 为…

【HarmonyOS】获取通讯录信息

【HarmonyOS】获取通讯录信息 一、问题背景&#xff1a; 在Android和IOS中&#xff0c;获取手机通讯录信息的方式&#xff0c;一般是申请通讯录权限后&#xff0c;获得手机所有的通讯录列表信息。 在鸿蒙中&#xff0c;因为权限方式安全性提高的变更&#xff1a;将用户权限限…

【八股系列】CSS盒模型:掌握网页布局的核心

&#x1f389; 博客主页&#xff1a;【剑九 六千里-CSDN博客】 &#x1f3a8; 上一篇文章&#xff1a;【Vue中的&#xff1c;keep-alive&#xff1e;组件&#xff1a;深入解析与实践指南】 &#x1f3a0; 系列专栏&#xff1a;【面试题-八股系列】 &#x1f496; 感谢大家点赞&…

爬虫管理解决方案:让数据收集变得高效且合规

一、为何数据收集的效率与合规性同等重要&#xff1f; 随着大数据技术的飞速发展&#xff0c;数据收集已成为企业决策与市场洞察的核心驱动力。然而&#xff0c;在信息海洋中精准捕捞的同时&#xff0c;如何确保这一过程既高效又不触碰法律的红线&#xff0c;是每个数据实践者…

使用嵌入式知识打造智能手环:nRF52蓝牙开发实战(C++/BLE/传感器)

项目概述 现代人越来越注重健康管理&#xff0c;智能穿戴设备应运而生。本项目旨在利用低功耗蓝牙芯片nRF52832&#xff0c;结合加速度计、心率传感器、陀螺仪等传感器&#xff0c;开发一款功能完善、性能稳定的智能运动手环。该手环能够实时采集用户的运动数据和生理指标&…

用MATLAB绘制三向应力圆

% 定义主应力值 sigma1 100; % MPa sigma2 50; % MPa sigma3 -33; % MPa sigma_m1(sigma1 sigma3)/2; sigma_m2(sigma1 sigma2)/2; sigma_m3(sigma2 sigma3)/2; % 计算半径 r1 (sigma1 - sigma3) / 2; r2 (sigma1 - sigma2) / 2; r3 (sigma2 - sigma3…

《mysql篇》--JDBC编程

JDBC是什么 JDBC就是Java DataBase Connectivity的缩写&#xff0c;翻译过来就很好理解了&#xff0c;就是java连接数据库。所以顾名思义&#xff0c;JDBC就是一种用于执行SQL语句的JavaApl&#xff0c;是Java中的数据库连接规范。为了可以方便的用Java连接各种数据库&#xff…