aaui1122 v0.1.0
aaui
仿照elementui样式进行的封装UI组件的学习(纯属个人学习资源)
####button组件
==属性==
参数名 | 参数描述 | 参数类型 | 默认值 |
---|---|---|---|
type | 按钮类型(primary/success/info) | string | default |
plain | 是否是朴素按钮 | boolean | flase |
round | 是否是圆角按钮 | boolean | flase |
cirle | 是否是圆形按钮 | boolean | flase |
disadbled | 是否禁用按钮 | boolean | flase |
iconname | 图标类名 | string | 无 |
==事件==
事件名 | 事件描述 |
---|---|
click | 点击事件 |
drag | 拖拽事件 |
==支持的字体图标==
字体图标 | 图标描述 |
---|---|
liuyanguanli | 留言管理 |
gouwucheguanli | 购物车管理 |
zhanghaoshezhi | 账号管理 |
mimaguanli | 密码管理 |
在组件上添加 iconname="icon名字"
//elementui 按钮的样式
.button{
display: inline-block;
line-height:1;
white-space:nowrap; // 文本不会换行,文本会在在同一行上继续,直到遇到 <br> 标签为止。
cursor: pointer;//光标呈现为指示链接的指针(一只手)
background-color: #fff;
border: 1px solid #eee;
color: #606266;
-webkit-appearance: none;//去除浏览器默认样式
text-align: center;
box-sizing: border-box;//border-box怪异盒模型 content-box标准盒模型
outline: none;//取消轮廓线 大部分表单点击之后会出现蓝色边框
margin: 0;
transition: 0.1s;//过渡
font-weight: 500;
//禁止元素的文字被选中
-moz-user-select: none;//针对火狐
-webkit-user-select: none;//针对谷歌 safari
-ms-user-select: none;//针对Ie -o代表Opera私有属性。
padding: 12px 20px;
font-size: 14px;
border-radius: 4px;
&:hover,//鼠标经过
&:focus{//聚焦
color:#409eff;
border-color:#c6e2ff;
background-color: #ecf5ff;
}
}
type的类型通过props传过的类名 控制按钮样式
#####vue中动态绑定class的方式有3种
(1)以对象形式
v-bind:class="{ active: isActive, 'text-danger': hasError }"
(2)以数组形式
v-bind:class="[activeClass, errorClass]"
(3)数组中对象形式
v-bind:class="[activeClass, {'errorClass':true}]"
在vue中可以通过$slots拿到所以的插槽
可以通过判断$slots.default判断插槽内是不是有传入值
dialog组件
==属性==
参数名 | 参数描述 | 参数类型 | 默认值 |
---|---|---|---|
title | 对话框标题 | string | 提示 具名插槽 v-slot:title |
width | 宽度 | string | 50% |
top | 与顶部的距离 | strng | 15vh |
visible | 是否显示dialog(支持sync修饰符) | boolean | false |
==事件==
事件名 | 事件描述 |
---|---|
open | 模态框显示的事件 |
close | 模态框关闭的事件 |
==插槽==
插槽名称 | 插槽描述 |
---|---|
default | dialog的内容 |
title | dialog的标题 v-slot:title |
footer | dialog的底部操作区 具名v-slot:footer |
######vue中动态绑定style方式
(1)对象形式
:style="{ color: activeColor, fontSize: fontSize + 'px' }"
(2)数组形式
:style="[baseStyles, overridingStyles]"
(3)三目运算符
:style="{color:(index==0?conFontColor:'#000')}"
#####vue修饰符
######事件修饰符
.stop 阻止事件继续传播 .prevent 阻止标签默认行为 .capture 使用事件捕获模式,即元素自身触发的事件先在此处处理,然后才交由内部元素进行处理 .self 只当在 event.target 是当前元素自身时触发处理函数 .once 事件将只会触发一次 .passive 告诉浏览器你不想阻止事件的默认行为
.sync
v-model的修饰符
.lazy 转变为在change事件同步输入框的值和数据
.number 自动将用户的输入值转化为数值类型
.trim 自动过滤用户输入的守卫空格
键盘事件的修饰符
.enter .tab .esc .space .up .left .right ....
.ctrl .alt .shift .meta
vue单向数据流
子组件可以使用父组件传递过来的数据,但是不能修改 (props传递过来的数据,子组件不可以修改)
==.sync的使用场景==--语法糖
父组件传递给子组件数据的时候
:money="money"
子组件传递给父组件的事件的时候
@update:money="fn"
我们就可以使用.sync--实际上就是在父组件中,不需要去监听事件,当这个值发生改变的时候,直接进行了赋值-使得代码简便了
子组件触发父组件的事件:this.$emit('update:money',value)[通知父组件的事件一定是[update:propsc传递的值]
<子组件 :momey.sync="money">[不需要再进行监听事件,修改数据]
vue动画
(1)通过添加类名
transition包裹一个元素
可以在元素显示和隐藏的时候加上动画(在这个元素显示和隐藏的时候会添加一些类名)
默认类名 v-enter v-enter-active v-enter-to v-leave v-leave-active v-leave-to
如果在transition 添加name属性
比如<transition name="aa">
类名:aa-enter aa-enter-active aa-enter-to aa-leave aa-leave-active aa-leave-to
(2)通过css实现动画
@keyframes 动画名 { 0% {opacity:0;} 100% {opacity:1;}}
.aa-enter-active{
animation:动画名 时间;
}
.aa-leave-active{
animation:动画名 时间 reverse(执行方向)
}
vue中在样式中添加 scoped:
原理(1)在当前组件模板中的每个元素上面添加了一个随机的属性
(2)给所有的样式添加一个属性选择器
注意:所有在做组件库的时候不要给组件添加scoped,不然处理不了属性(解决办法是scss中::deep less中 /deep/ css中 >>> )
表单相关组件
input框
==属性==
参数名称 | 参数描述 | 参数类型 | 默认值 |
---|---|---|---|
placeholder | 占位符 | string | 无 |
type | 文本框类型text/password | string | text |
disabeld | 禁用 | boolean | false |
clearable | 显示清空按钮 | boolean | false |
show-password | 显示密码切换按钮 | boolean | false |
name | name属性 | string | 无 |
width | 控制input框宽度 | string | 20%/100px |
right | 控制图标位置(越往左值越大) | string | 12% |
iconname | 想显示图标名称 | string | bianji |
==事件==
事件名称 | 事件描述 |
---|---|
blur | 失去焦点事件 |
change | 内容改变事件 |
focus | 获取的焦点事件 |
表单的 v-model语法糖
动态绑定value属性 绑定input事件修改value的值(label有个特性,如果包裹input,会直接绑定input)
开关switch
==属性==
参数名称 | 参数描述 | 参数类型 | 默认值 |
---|---|---|---|
v-model | 双向数据绑定 | 布尔类型 | false |
name | name属性 | string | text |
activeColor | 自定义的激活颜色 | string | |
incativeColor | 自定义的不激活颜色 | string |
用户在使用switc组件的时候,实际和是哪个是当成表单元素来使用的,可能会用到组件的name属性,所以需要在switch组件中添加一个checkbox,当值发生改变的时候,需要设置checkbox的value值
==事件==
事件名称 | 事件描述 |
---|---|
change | change时触发的事件,可以拿到开关目前的布尔值 |
开关组件需要添加个name属性 -表单元素有name属性 用户可能需要操作name属性
radio单选框(有难度)
==属性==
参数名 | 参数名称 | 参数类型 | 默认值 |
---|---|---|---|
v-model | 双向数据绑定 | 布尔类型 | false |
label | 选中的文本(传后台) | 字符串,布尔,数字 | 空 |
name | 表单元素一般有name | 字符串 | 空 |
单选框的值需要多选一,必须要在子组件内input上面添加v-model,绑定的值需要用计算属性的set 和 get
#####radio-group
(可以不用每个radio都添加v-model,直接写一个v-model就可以了)
需要给组件添加个value值 -接收父组件绑定的v-model
还需要出发当前组件的input事件
vue中的provide和inject 可以实现祖先和后代之间的传值
可以在radio-group组件中provide他自己this 在子组件中inject中获取到父组件 (如果没有父组件的话,给他一个默认值)
==注意==
需要修改radio,对group进行判断,如果有值的话,需要更改计算属性中的set和get
checkbox复选框
==属性==
参数名 | 参数名称 | 参数类型 | 默认值 |
---|---|---|---|
v-model | 双向数据绑定 | 布尔类型 | false |
label | 选中的文本(传后台) | 字符串 | 空 |
name | 表单元素一般有name | 字符串 | 空 |
和单选框一样
字体图标组件
==属性==
参数名 | 参数名称 | 参数类型 | 默认值 |
---|---|---|---|
iconname | 字体名称图标 | string | bianji |
fontSize | 字体图标大小 | string | 20px |
color | 字体颜色 | string | #000/black/rgb(255,255,255) |
字体图标名称(iconname) | 样式 | 字体图标名称(iconname) | 样式 |
---|---|---|---|
bianji | 编辑 | gouwucheguanli | 购物车管理 |
gouxuan | 勾选 | zhanghaoshezhi | 账号设置 |
guanbi | 关闭 | mimaguanli | 密码管理 |
tupian | 图片 | liuyanguanli | 留言管理 |
xiazai | 下载 |
如果要修改icon的话,需要用www.iconfont.cn,将需要的图标下载,下载之后更新icon的css,将icon的类名前缀修改成aa-icon-icon名,将路径修改
==事件==
事件名称 | 描述 |
---|---|
click | 点击事件 |
form组件
==属性==
属性名 | 参数名称-类型 | 默认值 |
---|---|---|
model | 绑定的所有数据-对象 | 空 |
form-item组件
属性名 | 参数名称-类型 | 默认值 |
---|---|---|
width | 设置文本的样式 字符串(行内样式) | 80px |
font-size | 字体大小 字符串(行内样式) | 14px |
color | 字体颜色 字符串(行内样式) | black |
label | 文本 字符串 | 无 |
封装组件库
1新建vue项目 选择scss
2目录结构
packages:用于存放所有组件
examples:用于进行测试,把src改成examples
3修改项目的入口文件 vue.config.js 将src改成examples
4packages是打包的文件,字体图标文字也需要打包 -所有组件
5做成vue的插件(install方式)
在packages中新建index.js(整个包的入口)-导出一个对象(中间有install方法)
注册所有的组件
6 打包
打包:
打包成库,要在pack.json中添加一句命令
"lib":"vue-cli-service build --target lib packages/index.js"
执行 npm run lib 就可打包
7git 管理项目
8 npm 发布
使用说明
全局安装组件库
npm i aa-ui
全局导入
import aaUi from 'aa-ui'
import 'aa-ui/lib/aaui.css'
Vue.use(aaUi)
2 years ago