@kway/ui v0.0.3
@kway/ui 使用说明
开始
介绍
@kway/ui是基于vue3.0的一套UI组件库,组件库采用CompositionAPI编写支持webpack和vite编译环境。
组件库集成graphql请求,可实现快速原型开发场景 组件库集成pug模版引擎和sass支持
安装
目前属于实验阶段,npm i @kway/ui
使用
只需简单在main.js中进行设置
import { createApp } from 'vue'
import App from './App.vue'
import ui from '@kway/ui' // 引入UI组件库
import '@kway/ui/colors.css' // 引入样式库
createApp(App).use(ui).mount('#app')
布局
@kway/ui统一采用flex布局
通用布局
.fill 自动填充满父级容器
<div class="fill"></div>
.center 在容器内居中显示
<div class="center"></div>
横向布局
.row 容器内横向排列
<div class="row"></div>
.row-center 在容器内横向排列并居中显示
<div class="row-center"></div>
.row-top-left 在容器内横向排列并靠左上方对齐
<div class="row-top-left"></div>
.row-top-center 在容器内横向排列并靠上方居中对齐
<div class="row-top-center"></div>
.row-top-right 在容器内横向排列并靠右上方对齐
<div class="row-top-right"></div>
.row-middle-left 在容器内横向排列并靠左垂直居中对齐
<div class="row-middle-left"></div>
.row-middle-right 在容器内横向排列并靠右垂直居中对齐
<div class="row-middle-right"></div>
.row-bottom-left 在容器内横向排列并靠左下方对齐
<div class="row-bottom-left"></div>
.row-bottom-center 在容器内横向排列并靠下方居中对齐
<div class="row-bottom-center"></div>
.row-bottom-right 在容器内横向排列并靠下方居中对齐
<div class="row-bottom-right"></div>
纵向布局
.col 容器内纵向排列
<div class="col"></div>
.col-center 在容器内纵向排列并居中显示
<div class="col-center"></div>
.col-top-left 在容器内纵向排列并靠左上方对齐
<div class="col-top-left"></div>
.col-top-center 在容器内纵向排列并靠上方居中对齐
<div class="col-top-center"></div>
.col-top-right 在容器内纵向排列并靠右上方对齐
<div class="col-top-right"></div>
.col-middle-left 在容器内纵向排列并靠左垂直居中对齐
<div class="col-middle-left"></div>
.col-middle-right 在容器内纵向排列并靠右垂直居中对齐
<div class="col-middle-right"></div>
.col-bottom-left 在容器内纵向排列并靠左下方对齐
<div class="col-bottom-left"></div>
.col-bottom-center 在容器内纵向排列并靠下方居中对齐
<div class="col-bottom-center"></div>
.col-bottom-right 在容器内纵向排列并靠下方居中对齐
<div class="col-bottom-right"></div>
图标
图标基于iconfont实现,使用图标前需要先设置.ui-icon,如:
<div class="ui-icon icon-query">
图标清单
组件
button 按钮
样式列表
- mini 小号样式
- tiny 超小号样式
- rounded 圆角样式
- circle 圆形样式
- square 方形样式
- success 成功样式
- warning 警告样式
- danger 危险样式
- info 消息样式
- lighten 浅色样式
- darken 深色样式
<button>普通按钮</button>
<button class="mini success"> 小号按钮</button>
<button class="tiny warning"> 超小按钮</button>
<button class="rounded danger">圆角按钮</button>
<button class="circle info ui-icon icon-edit"></button> // 圆形按钮
<button class="square lighten ui-icon icon-delete"></button> // 方形按钮
v-input 输入框组件
组件属性
- modelValue 输入值 双向绑定属性 输入类型 String | Number
- password 是否密码组件 输入类型 Boolean
- placeholder 组件提示信息 输入类型 String
- readonly 组件是否只读 输入类型 Boolean
- multi 组件是否为多项文本 输入类型 Boolean
<v-input v-model="defaultValue" placeholder="填写默认值" password :readonly="false" :multi="false"></v-input>
v-select 选择框组件
组件属性
- items 组件选择项 输入类型 Array<{key:Any,value:String}>
- modelvalue 组件已选择的项 双向绑定属性
- 单选组件输入类型 Any
- 多选选组件输入类型 Array\
- placeholder 组件提示信息 输入类型 String
- readonly 组件是否只读 输入类型 Boolean
- multi 是否多选组件 输入类型 Boolean
- max 组件显示的最大条数 输入类型 Number,具有此属性输入时,组件会有筛选功能
// 单选组件
<script>
...
const singleValue = ref(1)
...
</script>
<template>
<v-select :items="[{key:1,value:'男'},{key:1,value:'女'}]" v-model="singleValue
" :readonly="false" placeholder="选择性别"></v-select>
</template>
//多选组件
<script>
...
const multiValue = ref([1,2])
...
</script>
<template>
<v-select :items="[
{key:1,value:'广东'},
{key:2,value:'湖南'},
{key:3,value:'广西'},
{key:4,value:'浙江'},
{key:5,value:'湖北'},
{key:6,value:'福建'},
{key:7,value:'海南'},
{key:8,value:'河南'},
{key:9,value:'江苏'},
{key:10,value:'安徽'},
{key:11,value:'山东'},
]" v-model="multiValue" :readonly="false" placeholder="选择地区" :multi="true"></v-select>
</template>
v-date 日期选择器组件
组件属性
- modelValue 组件已选择的项 双向绑定属性 输入类型 String 格式为 yyyy-MM-dd
- placeholder 组件提示信息 输入类型 String
- readonly 组件是否只读 输入类型 Boolean
<script>
...
const dateValue = ref('2020-01-04')
...
</script>
<template>
<v-date v-model="dateValue" placeholder="请选择日期" :readonly="false"></v-date>
</template>
v-time 时间选择器组件
组件属性
- modelValue 组件已选择的项 双向绑定属性 输入类型 String 格式为 HH:mm:ss
- placeholder 组件提示信息 输入类型 String
- readonly 组件是否只读 输入类型 Boolean
<script>
...
const timeValue = ref('12:05:59')
...
</script>
<template>
<v-time v-model="timeValue" placeholder="请选择时间" :readonly="false"></v-time>
</template>
v-radio 单选按钮组件
组件属性
- name 单选按钮组名称 输入类型 String
- items 单选按钮组选项 输入类型 Array<{key:Any,value:String}>
- modelValue 选择值 双向绑定属性 Any
<script>
...
const radioValue = ref(1)
...
</script>
<template>
<v-radio name="radio" :items="[{key:0,value:'好'},{key:1,value:'一般'},{key:2,value:'差'}]" v-model="radioValue" :readonly="false"></v-radio>
</template>
v-check 多选按钮组件
组件属性
- name 多选按钮组名称 输入类型 String
- items 多选按钮组选项 输入类型 Array<{key:Any,value:String}>
- modelValue 选择值 双向绑定属性 Array\<Any>
- readonly Boolean
<script>
...
const checkValue = ref([0,1])
...
</script>
<template>
<v-check name="check" :items="[{key:0,value:'好'},{key:1,value:'一般'},{key:2,value:'差'}]" v-model="checkValue" :readonly="false"></v-check>
</template>
v-table 表格组件
组件属性
headers 表头定义 输入类型 Array<{key:String,name:String, width:String,align:String}>
- key 匹配数据项的属性名称
- name 表头字段名称
- width 表格宽度,使用css单位,支持 px rem vw vh pt
- align 列对齐方式 可选值 'left' 'center' 'right'
items 数据项 输入类型 Array\<Object>
插槽
可根据数据项的属性名称定义插槽,实现显示数据项的计算值。 插槽返回item和index,item是数据项的当前对象,index是数据项游标。
<!--插槽定义-->
<template v-slot:数据项的属性名称="{item,index}"> {{index+1}}</template>
<v-table :headers="[{key: 'student_no', name: '学号', width: '30px', align: 'center'},{key: 'name', name: '姓名', align: 'center'}]" :items="[{student_no: '1', name:'张三'},{student_no: '2', name:'李四'}]">
<template v-slot:student_no="{item,index}"> 学号:{{item.student_no}} 序号:{{index+1}}</template>
</v-table>
v-pagination 分页组件
组件属性
- modelValue 当前页 输入类型 Number
- total 页数 输入类型 Number
<script>
...
const page = ref(1)
...
</script>
<template>
<v-pagination v-model="page" :total="10"><v-pagination>
</template>
v-list 列表组件
组件属性
- modelValue 选择项信息 双向绑定属性 输入类型 Array\
- items 数据项 输入类型 Array<{key:String,value:String,image:String}>
- max 显示最大条数 输入类型 Number,具有此属性输入时,组件会有筛选功能
- height 组件高度 输入类型 String,使用 css 单位,支持 px rem vw vh pt
- readonly 组件是否只读 输入类型 Boolean
<script>
...
const listValue = ref(['a01','a02'])
...
</script>
<template>
<v-list v-model="listValue" :items="[{key:'a01',value:'商品1',image:'http://127.0.0.1:1025/images/a01.jpg'},{key:'a02',value:'商品2',image:'http://127.0.0.1:1025/images/a02.jpg'}]" height="300px" :readonly="false"></v-list>
</template>
v-card 卡片组件
组件属性
- width 组件宽度 输入类型 String,使用 css 单位,支持 px rem vw vh pt
- height 组件高度 输入类型 String,使用 css 单位,支持 px rem vw vh pt
插槽
- title 卡片标题
<template v-slot:title>这是标题</template>
- subtitle 卡片二级标题
<template v-slot:subtitle>这是二级标题</template>
- avatar 卡片图片
<template v-slot:avatar><img src="http://127.0.0.1:1025/image/avatar.jpg"/></template>
- actions 卡片操作栏
<template v-slot:actions><button class="mini info rounded">查看</button></template>
- text 卡片内容
<template v-slot:text>这是内容</template>
<v-card width="400px" height="300px">
<template v-slot:avatar><img src="http://127.0.0.1:1025/image/avatar.jpg"/></template>
<template v-slot:title>这是标题</template>
<template v-slot:subtitle>这是二级标题</template>
<template v-slot:text>这是内容</template>
<template v-slot:actions><button class="mini info rounded">查看</button></template>
</v-card>
v-dialog 对话框组件
组件属性
- show 组件是否显示 输入类型 Boolean
- width 组件宽度 fullscreen为false时有效 输入类型 String,使用 css 单位,支持 px rem vw vh pt
- height 组件高度 fullscreen 为 false 时有效 String,使用 css 单位,支持 px rem vw vh pt
- fullscreen 组件全屏显示 输入类型 Boolean
插槽
- title 对话框标题
<template v-slot:title>这是对话框标题</template>
<v-dialog :show="true" width="800px" height="600px" :fullscreen="false">
<template v-slot:title>这是对话框标题</template>
<div>这是对话框内容</div>
</v-dialog>
v-editor 富文本编辑器组件
组件属性
- modelValue 富文本内容 双向绑定属性 输入属性为{html:String} html为富文本的HTML内容
- readonly 编辑器是否只读 输入类型 Boolean
- placeholder 编辑器输入提示信息 输入类型 String
<script>
...
const editorValue = ref({html:'<div>这是富文本</div>'})
...
</script>
<template>
<v-editor v-model="editorValue" placeholder="请输入富文本" :readonly="false"></v-editor>
</template>
v-chart 图表组件
基于echarts扩展的图表组件 组件属性
- modelValue 图表数据 输入类型 Object 参考echarts的option API
- width 图表宽度 输入类型 String,使用 css 单位,支持 px rem vw vh pt
- height 图表高度 输入类型 String,使用 css 单位,支持 px rem vw vh pt
<script>
...
const option = ref({
title: {text: 'ECharts 入门示例'},
legend: {data: ['销量']},
xAxis: {
data: [
'衬衫',
'羊毛衫',
'雪纺衫',
'裤子',
'高跟鞋',
'袜子'
]
},
series: [
{
name: '销量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
}
]
})
...
</script>
<template>
<v-chart width="40vw" height="40vh"
v-model="option"></v-chart>
</template>
v-upload 上传组件
组件属性
- accept 上传文件类型 输入类型 String,取值参考HTML标准
- single 是否上传单个文件 输入属性 Boolean
- modelValue 上传文件内容 双向绑定属性 Array | String
- width 图片文件最大宽度 输入属性Number,仅限图片文件上传时使用,上传图片自动按照最大宽度自动压缩
- height 图片文件最大高度 输入属性 Number,仅限图片文件上传时使用,上传图片自动按照最大高度自动压缩
<script>
...
const uploadValue = ref('1e8228de-7aac-4507-a436-04a85a695fbe')
const {proxy} = getCurrentInstance()
// 把文件上传到服务器
proxy.$upload(uploadValue).then((res)=>{
//res 为上传服务器后返回的值
})
...
<script>
<template>
<v-upload v-model="uploadValue" :single="false" accept="image/*" :width="750" :height="750"></v-upload>
</template>
VUE扩展API
$message 消息框
方法
$message(title:String,text:String):Promise\<Boolean>
参数
- title 消息框标题
- text 消息内容
返回值:Promise\<Boolean> 是否点击了确认按钮
const {proxy} = getCurrentInstance()
proxy.$messsage('标题','内容').then(res=>{
if(res){
// 点击了确认按钮
}else{
// 点击了取消按钮或取消了消息框
}
})
$alert 提示框
方法
$alert(message:String, type:'info'|'success'|'warning'|'wrong'):void
参数
- message 提示小修内容
- type 提示类型,支持'info' 'success' 'warning' 'wrong' 四种类型提示
返回值:无
const {proxy} = getCurrentInstance()
proxy.$alert('信息保存成功','success')
$open 文件选择框
方法
$open(accept:String):Promise\<Blob>
参数
- accept 打开文件类型 输入类型 String,取值参考 HTML 标准
返回值:Promise\<Blob> 所选文件的blob对象
const {proxy} = getCurrentInstance()
proxy.$open('image/jpg,image/png').then(blob=>{
// blob为打开文件的blob对象
})
$session 会话操作
方法
- 创建会话对象
$session.create(key:String,value:Object):void
- 获取会话对象
$session.get(key:String):Object
- 删除会话对象
$session.remove(key:String):void
参数
- 创建会话对象
key 会话对象键
value 会话对象值
- 获取会话对象
key 会话对象键
- 删除会话对象
key 会话对象键
返回值
- 创建会话对象
无返回值
- 获取会话对象
返回会话对象
- 删除会话对象
无返回值
const {proxy} = getCurrentInstance()
// 创建会话
proxy.$session.create('user',{name:'张三'})
// 获取会话
proxy.$session.get('user') // 返回{name:'张三'}
// 删除会话
proxy.$session.remove('user')
会话对象会在浏览器关闭后自动销毁
$key 时间戳
附加用于组件自动监测数据变换自动刷新
<router-view :key="$key()"></router-view>
<v-select :key="$key()"></v-select>
$setToken 设置token
方法
$setToken(token:String):void
参数
- token 口令内容
返回值:无
const {proxy} = getCurrentInstance()
// 设置 token 全局可用,浏览器关闭自动销毁
proxy.$setToken('token:1234567890')
$compresser 图片压缩
方法
$compresser(blob:Blob,width:Number,height:Number):Promise\<Blob>
参数
- blob 图片Blob对象
- width 图片压缩后最大宽度,设置为0时表示不限制
- height 图片压缩后最大高度,设置为 0 时表示不限制
返回值:Promise\<Blob> 返回图片Blob对象
const {proxy} = getCurrentInstance()
proxy.$open('image/*').then(result=>{
proxy.$compresser(result, 750, 0).then(compresse=>{
// compresse为压缩后的图片对象
})
})
$wechat 请求微信接口方法
方法
$wechat(resolver:String, data:Object, method:'GET'|'PUT'|'POST'|'DELETE'|'PATCH'):Promise\<Any>
参数
- resolver 对应服务器的微信接口处理方法
- data 向服务器发送请求对象
- method 向服务器发送的请求方法
返回值:Promise\<Any> 服务器返回的响应对象
const {proxy} = getCurrentInstance()
...
proxy.$wechat('pay',order,'POST').then(res=>{
// 服务器返回的支付验证参数
})
...
$http 请求微信接口方法
方法
$http(url:String,data:Object,headers:Object,responseType:String,method:'GET'|'PUT'|'POST'|'DELETE'|'PATCH'):Promise\<Any>
参数
- url 服务器请求地址
- data 向服务器发送请求对象
- headers 向服务器发送请求头信息
- headers 响应类型,取值'text' 'blob' 'stream'
- method 向服务器发送的请求方法
返回值:Promise\<Any> 服务器返回的响应对象
const {proxy} = getCurrentInstance()
...
proxy.$http(
proxy.$url('/test/code'),
{id:'1'},
{'Content-type': 'application/json;charset=utf-8'},
'blob','POST').then(res=>{
// 服务器返回的Blob对象
})
...
$upload 文件上传
方法 $upload(files:Array<{init:String,result:Blob,state:0|1}>):Promise\<Array\<String>>
参数
- files 待上传文件列表
init 文件初始化指针,文件已上传时有此属性
result 待上传文件Blob对象
state 上传状态,0-未上传 1-已上传,只有在状态为0时才会上传到服务器
返回值:Promise\<Array\<String>> 文件指针数组
const {proxy} = getCurrentInstance()
proxy.$upload([{result:file,state:0}]).then(res=>{
// 对应传入参数,返回上传后的文件指针
})
$attachment 获取文件远程地址
方法
$attachment(id:String):String
参数
- id 文件指针
返回值:String 所映射的服务器文件地址
const {proxy} = getCurrentInstance()
proxy.$attachment('1e8228de-7aac-4507-a436-04a85a695fbe')
基础对象扩展API
Date对象扩展属性
日期格式化
方法
Format(fmt:String):String
参数
- fmt 格式化模版 y-年 M-月 d-日 h-小时 m-分 s-秒 S-毫秒 q-季度
返回值:格式化后的String
new Date().Format('yyyy-MM-dd hh:mm:ss.SSS q')
日期计算器
方法
Calc(year:Number,month:Number,day:Number):Date
参数
- year 计算距离年数,增加为正数,减少为负数,不计算时取值0
- month 计算距离月数,增加为正数,减少为负数,不计算时取值0
- day 计算距离天数,增加为正数,减少为负数,不计算时取值0
返回值:Date 计算后的日期
new Date().Calc(1,2,3) // 计算未来1年零2个月3天
new Date().Calc(0,0,-3) // 计算过去3天
Date 转 String,格式为 yyyy-MM-dd
方法
Date(year?:Number,month?:Number,day?:Number):String
参数
- year 计算距离年数,增加为正数,减少为负数,不计算时取值 0
- month 计算距离月数,增加为正数,减少为负数,不计算时取值 0
- day 计算距离天数,增加为正数,减少为负数,不计算时取值 0
返回值:String 计算后经格式化的日期
new Date().Date(1,0,0) // 返回一年后的今天,按yyyy-MM-dd格式输出
Date 转 String,格式为 yyyy-MM-dd hh:mm:ss
方法
DateTime(year?:Number,month?:Number,day?:Number):String
参数
- year 计算距离年数,增加为正数,减少为负数,不计算时取值 0
- month 计算距离月数,增加为正数,减少为负数,不计算时取值 0
- day 计算距离天数,增加为正数,减少为负数,不计算时取值 0
返回值:String 计算后经格式化的日期时间
new Date().DateTime(1,0,0) // 返回一年后的今天,按yyyy-MM-dd hh:mm:ss格式输出
Date 转 String,格式为 hh:mm:ss
方法
Time():String
参数:无
返回值:String 经格式化的时间
new Date().Time() // 返回当前时间,按hh:mm:ss格式输出
月数计算器
方法
MonthDiff(reference:String):Number
参数
- reference 对比日期时间,支持yyyy-MM-dd hh:mm:ss格式或yyyy-MM-dd格式,参数为空时与当前日期时间比较
返回值: Number 相隔月数
// 计算2020年1月10日距离今天有多少月
new Date('2020-01-10').MonthDiff()
// 计算2020年1月10日距离2020年5月30日有多少月
new Date('2020-01-10').MonthDiff('2020-05-30')
String对象扩展属性
等位前补零
方法
prefix(digit:Number):String
参数
- digit 数位
返回值:String 补零后的字符串
'1'.prefix(5) // 返回00001
base64字符串转Blob对象
方法
blob():Blob
参数:无
返回值:Blob 返回base64生成的Blob对象
[base64字符串].blob()
Base64生成浏览器内置URL
方法
url():String
参数:无
返回值:String 返回base64生成浏览器内置的URL
[base64字符串].url() // 返回格式 blob:http://[域名/ip]:[端口]/[文件指针]
发起Graphql请求
方法
graphql(args:Object):Promise\<Any>
参数
- args 发送graphql请求参数
返回值:Promise\<Any> graphql服务器响应的对象
const query = `query@users.list>>UserInput->(page size length data{name age mobile gender area})`
query.graphql({page:1,size:10}).then(user=>{
// user
})
- graphql查询采用gqlx语法,语法结构:
- query/mutation@服务端解决器名称.服务端执行方法名称>>输入类型->返回格式
Number 对象扩展属性
千位分隔格式化,并保留两位小数
方法
thou():String
参数:无
返回值:String,格式化后的字符串
console.info(1000.thou()) // 输出:1,000.00
Array对象扩展属性
数组分组
方法
GroupBy(c:Function):Object
参数
- c 分组方法,方法返回值为String,作为分组依据
返回值:Object 分组对象
const goods = [
{category:'A',name:'商品 1'},
{category:'A',name:'商品 2'},
{category:'A',name:'商品 3'},
{category:'B',name:'商品 4'},
{category:'B',name:'商品 5'},
{category:'B',name:'商品 6'}
]
const group = goods.GroupBy(item=>item.category)
/**
group的值为
{
A: [
{category:'A',name:'商品 1'},
{category:'A',name:'商品 2'},
{category:'A',name:'商品 3'}
]
B: [
{category:'B',name:'商品 4'},
{category:'B',name:'商品 5'},
{category:'B',name:'商品 6'}
]
}
*/