更新记录
3.0.8(2023-12-05) 下载此版本
- 更新iconfont图标
3.0.7(2023-11-21) 下载此版本
- hf-form-cascader 修改defaultProps的bug
3.0.6(2023-11-21) 下载此版本
- hf-form-cascader 修改defaultProps的bug
平台兼容性
Vue2 | Vue3 |
---|---|
√ | × |
App | 快应用 | 微信小程序 | 支付宝小程序 | 百度小程序 | 字节小程序 | QQ小程序 |
---|---|---|---|---|---|---|
HBuilderX 3.1.0 app-vue | × | √ | × | × | × | × |
钉钉小程序 | 快手小程序 | 飞书小程序 | 京东小程序 |
---|---|---|---|
× | × | × | × |
H5-Safari | Android Browser | 微信浏览器(Android) | QQ浏览器(Android) | Chrome | IE | Edge | Firefox | PC-Safari |
---|---|---|---|---|---|---|---|---|
√ | √ | √ | √ | √ | × | × | × | √ |
hf-ui
基于 uview-ui 2.0 封装的组件,供项目使用
基本用法
./plugin/hf-ui.js
import Vue from 'vue';
import hfui from '@/uni_modules/hf-ui';
import { loadDictOptions } from './loadData.js';
import { queryPathByIds } from '@/api/index.js';
import configService from '@/common/service/config.service.js';
import store from '@/store/index.js';
Vue.use(hfui);
// 设置处理函数
hfui.setUtils({
/**
* 获取字典
*/
loadDictOptions,
/**
* 获取资源绝对路径
* @param {String} val 相对路径 以','分隔
*/
async getAbsPath(val) {
if (!val) return [];
const res = await queryPathByIds({
ids: val
});
if (!Array.isArray(res.result)) {
return [];
}
return res.result.map(item => {
const idx = item.fullPath.indexOf('/scpsmip/');
if(idx != -1) {
item.fullPath = 'https://www.i-hengfeng.com:48080/io' + item.fullPath.slice(idx);
}
return {
url: item.fullPath,
name: item.attachmentName
};
});
},
/**
* 图片上传
* @param {String} path 文件临时路径
* @param {String} name 文件名
* @return {Promise}
*/
uploadFile({ path, name }) {
return new Promise((resolve, reject) => {
const token = store.state.user.token;
let a = uni.uploadFile({
url: configService.apiUrl + configService.apiPrefix + '/base/baseAttachment/upload',
filePath: path,
name: 'file',
header: {
[configService.tokenName]: token,
},
formData: {
attachmentName: name
},
success: (res) => {
if (res.statusCode !== 200) {
return reject();
}
const data = JSON.parse(res.data);
if (!data.success) {
return reject();
}
resolve({
url: data.message, // 图片绝对路径
path: data.result.id // 相对路径
});
},
fail: (err) => {
reject();
}
});
})
},
});
main.js
import './plugin/hf-ui.js'
表单组件
表单组件基于公共mixin,公共参数/插槽:
props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
label | 左侧提示文字 | String | ||
prop | 表单域model对象的属性名 | String | ||
value | 绑定的值 | String|Number | ||
disabled | 是否禁用 | Boolean | false | true|false |
placeholder | 占位符 | String | ||
required | 是否显示左边的"*"号(仅展示) | Boolean | false | true|false |
labelPosition | label的位置 | String | left | left|top |
borderBottom | 是否显示下边框 | Boolean | true | true|false |
slot
名称 | 说明 |
---|---|
说明
- 重写了label样式的组件
- hf-form-select
- hf-form-checkbox
- hf-form-upload
- 表单校验的错误提示位置:
- 默认:内容区域底部(margin-left: labelWidth)
- 左侧:多选checkbox、图片上传upload、头像avatar、文本域textarea(margin-left: 0;)
hf-form-input 输入框
示例
<hf-form-input
v-model="model.name"
label="姓名"
prop="name"
:required="!disabled"
:disabled="disabled"
placeholder="请输入"
></hf-form-input>
export default {
data() {
return {
model: {
name: ''
},
disabled: false
};
}
}
props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
type | 输入框类型,见uview的u-input组件文档 | String | text | text|number|idcard|digit|password |
password | 是否密码类型 | Boolean | false | true|false |
hf-form-textarea 文本域
示例
<hf-form-textarea
v-model="model.introduction"
label="简介"
prop="introduction"
:required="!disabled"
:disabled="disabled"
placeholder="请输入"
:maxlength="500"
count
></hf-form-textarea>
export default {
data() {
return {
model: {
introduction: ''
},
disabled: false
};
}
}
props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
labelPosition | label的位置 | String | top | left|top |
maxlength | 最大输入长度 | String|Number | 140 | |
textAlign | 文字对齐方式 | String | right | left|center|right |
border | 边框类型,surround-四周边框,none-无边框,bottom-底部边框 | String | none | surround|none|bottom |
count | 是否显示统计字数 | Boolean | false | true|false |
height | 输入框高度 | String|Number | 70 |
slots
名称 | 说明 |
---|---|
label | 左侧提示文字 |
hf-form-datetime 时间日期选择器
示例1
<hf-form-datetime
v-model="model.birthday"
label="生日"
prop="birthday"
:required="!disabled"
:disabled="disabled"
placeholder="请选择"
mode="date"
></hf-form-datetime>
export default {
data() {
return {
model: {
birthday: ''
},
disabled: false
};
}
}
示例2
自定义展示部分
<hf-form-datetime v-model="startTime" mode="date">
<template v-slot:display-section="{ valueName }">{{ valueName || '开始时间' }}</template>
</hf-form-datetime>
props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
mode | 展示格式 | String | datetime | datetime|date|time|year-month |
minDate | 可选的最小时间(时间戳毫秒) | Number | 默认为前50年 | |
maxDate | 可选的最大时间(时间戳毫秒) | Number | 默认为后十年 |
scoped-slot
名称 | 说明 | 参数 |
---|---|---|
display-section | 展示部分 | {valueName: '选中的选项名', visible: '是否显示弹窗'} |
hf-form-radio 单选框
示例
<hf-form-radio
v-model="model.gender"
label="性别"
prop="gender"
:required="!disabled"
:disabled="disabled"
dict-code="GENDER"
></hf-form-radio>
<hf-form-radio
v-model="model.sex"
label="性别"
prop="sex"
:required="!disabled"
:disabled="disabled"
:options="options"
></hf-form-radio>
export default {
data() {
return {
model: {
gender: '',
sex: '1'
},
disabled: false,
options: [
{ value: '1', label: '男' },
{ value: '2', label: '女' },
]
};
}
}
props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
dictCode | 字典code | String | ||
options | 选项 | Array | [] | |
keyName | 控制显示的字段 | String | label | |
keyValue | 控制取值的字段 | String | value | |
keyDisabled | 控制禁用的字段 | String | disabled |
hf-form-checkbox 复选框
示例
<u-form :model="model">
<hf-form-checkbox
v-model="model.str"
label="多选"
placeholder="请选择"
:options="options"
></hf-form-checkbox>
</u-form>
export default {
data() {
return {
model: {
str: '3,5'
},
options: [
{ value: '1', label: '吕布吕奉先' },
{ value: '2', label: '赵云赵子龙' },
{ value: '3', label: '典韦' },
{ value: '4', label: '关羽关云长' },
{ value: '5', label: '马超马孟起' },
]
};
}
}
props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
dictCode | 字典code | String | ||
options | 选项 | Array | [] | |
keyName | 控制显示的字段 | String | label | |
keyValue | 控制取值的字段 | String | value | |
keyDisabled | 控制禁用的字段 | String | disabled | |
separator | 选项分隔符 | String | , | |
labelPosition | label的位置 | String | top | left|top |
mode | 弹出方向 | String | bottom | bottom|right |
search | 是否显示搜索 (仅mode='right'有效) | Boolean | false | true|false |
pinyin | 是否拼音搜索 (仅mode='right'有效) | Boolean | false | true|false |
slots
名称 | 说明 |
---|---|
label | 左侧提示文字 |
scoped-slot
名称 | 说明 | 参数 |
---|---|---|
check-list | 选择的列表 | {list: '选中的数组'} |
item | 列表项 | {item: 'options列表项'} |
hf-form-select 列表选择器
示例1
- 通过
dict-code
传入字典code - 通过
options
传入选项
<hf-form-select
v-model="model.gender"
label="性别"
prop="gender"
:required="!disabled"
:disabled="disabled"
placeholder="请选择"
dict-code="GENDER"
></hf-form-select>
<hf-form-select
v-model="model.sex"
label="性别"
prop="sex"
:required="!disabled"
:disabled="disabled"
placeholder="请选择"
:options="options"
></hf-form-select>
<script>
export default {
data() {
return {
model: {
gender: '',
sex: '1'
},
disabled: false,
options: [
{ value: '1', label: '男' },
{ value: '2', label: '女' },
]
};
}
}
</script>
示例2
- 右侧弹出框:
mode="right"
- 前端搜索:
search
- 多选:
multiple
<hf-form-select
v-model="model.interest"
label="兴趣爱好"
prop="interest"
:disabled="disabled"
placeholder="请选择"
:options="options"
mode="right"
search
multiple
></hf-form-select>
<script>
export default {
data() {
return {
model: {
interest: ''
},
disabled: false,
options: [
{ value: '1', label: '羽毛球' },
{ value: '2', label: '跑步' },
{ value: '3', label: '爬山' },
]
};
}
}
</script>
props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
dictCode | 字典code | String | ||
options | 选项 | Array | [] | |
showAll | 是否添加选项:“全部” | Boolean | false | true|false |
mode | 弹出方向 | String | bottom | bottom|right |
search | 是否显示搜索 (仅mode='right'有效) | Boolean | false | true|false |
pinyin | 是否拼音搜索 (仅mode='right'有效) | Boolean | false | true|false |
multiple | 是否多选 (仅mode='right'有效) | Boolean | false | true|false |
keyName | 控制显示的字段 | String | label | |
keyValue | 控制取值的字段 | String | value | |
keyDisabled | 控制禁用的字段 (仅mode='right'有效) | String | disabled | |
separator | 选项分隔符 (仅mode='right'有效) | String | , |
说明:
- 优先级:
dictCode
>options
slots
名称 | 说明 |
---|---|
label | 左侧提示文字 |
right | 右侧自定义内容 |
scoped-slot
名称 | 说明 | 参数 |
---|---|---|
display-section | 展示部分 | {valueName: '选中的选项名', visible: '是否显示弹窗'} |
item | 列表项 | {item: 'options列表项'} |
hf-form-tselect 多列..
???
hf-form-multi-column 多列选择器 ..
hf-form-autocomplete 列表选择器
同hf-form-select
,数据通过fetchList
从外部获取
- 初始为空,输入关键字搜索后,显示列表
- 直接显示搜索列表,可输入关键字搜索 (通过 trigger-on-show 控制)
- 不可搜索 直接显示列表
示例1
<hf-form-autocomplete
v-model="model.buildingId"
label="建筑物地址"
prop="buildingId"
:required="!disabled"
:disabled="disabled"
placeholder="网格名称+道路+门楼牌+小区+幢号"
:fetchList="getBuildingList"
search
defaultItem="defaultBuilding"></hf-form-autocomplete>
export default {
data() {
return {
model: {
buildingId: '',
detailAddress: ''
},
disabled: false
};
},
computed: {
defaultBuilding() {
return {
label: this.model.detailAddress,
value: this.model.buildingId
};
}
},
methods: {
async getBuildingList(param, pagination) {
const res = await baBuildingList({ // 建筑物地址 列表
...param,
...pagination
});
if (res.result && Array.isArray(res.result.records)) {
return {
total: res.result.total,
records: res.result.records.map(item => ({
value: item.id,
label: item.detailAddress
}))
};
}
},
}
}
示例2
<hf-form-autocomplete
v-model="model.articleId"
label="分页文章列表"
prop="articleId"
:disabled="disabled"
placeholder="请选择"
:fetch-list="fetchArticleList"
key-name="title"
key-value="id"
search
>
<template v-slot:item="{ item }">
<u-text :text="item.title" bold></u-text>
<u-text :text="item.content" type="info"></u-text>
</template>
</hf-form-autocomplete>
export default {
data() {
return {
model: {
articleId: ''
}
}
},
methods: {
async fetchArticleList(param, pagination) {
// param = { keyword: '搜索关键字' }, pagination = { pageNo: 1, pageSize: 20 }
const records = [];
for (let i = 0; i < pagination.pageSize; i++) {
const id = (pagination.pageNo - 1) * pagination.pageSize + i + 1;
records.push({ id, title: `文章${id}`, content: '文章内容文章内容文章内容...' });
}
return {
total: 160,
records
};
},
}
}
props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
fetchList | 获取数据的函数,返回promise {total: 0, records: []} | Function | ||
limit | 分页每页条数 0-不分页 | Number | 20 | |
search | 是否显示搜索 | Boolean | false | true|false |
triggerOnShow | 是否在展开弹框 显示列表 | Boolean | true | true|false |
keyName | 控制显示的字段 | String | label | |
keyValue | 控制取值的字段 | String | value | |
defaultItem | 默认选中回填的对象 | Object | {} |
scoped-slot
名称 | 说明 | 参数 |
---|---|---|
item | 自定义选项的内容 | {item: 选项} |
hf-form-area 省市县
示例
<hf-form-area
v-model="model.str1"
label="最后一级"
placeholder="请选择"
></hf-form-area>
<hf-form-area
v-model="model.str2"
label="全路径"
placeholder="请选择"
full-path
></hf-form-area>
export default {
data() {
return {
model: {
str1: '350403',
str2: '350000,350400,350403'
}
};
}
}
props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
level | 级数,默认显示 省市县 三级行政区划 | Number | 3 | 1|2|3 |
fullPath | 是否全路径 | Boolean | false | true|false |
separator | 分隔符 | String | , | |
textSeparator | 分隔符,显示文字的中文符 | String | / |
hf-form-cascader 级联选择
级联选择
示例
<hf-form-cascader
v-model="model.cascader"
label="区域"
prop="cascader"
:required="!disabled"
:disabled="disabled"
placeholder="请选择"
:options="options"
></hf-form-cascader>
<hf-form-cascader
v-model="model.cascader2"
label="任意一级可选择"
:options="options"
select-parent
></hf-form-cascader>
export default {
data() {
return {
model: {
cascader: ''
},
disabled: false,
options: [{
value: '1',
text: '一级 1',
children: [{
value: '1-1',
text: '二级 1-1',
children: [{
value: '1-1-1',
text: '三级 1-1-1',
children: [{
value: '1-1-1-1',
text: '四级 1-1-1-1'
}]
}]
}, {
value: '1-2',
text: '二级 1-2',
}]
}, {
value: '2',
text: '一级 2',
children: [{
value: '2-1',
text: '二级 2-1'
}]
}
]
};
}
}
props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
options | 选项 | Array | [] | |
showAllLevels | 是否显示选中值的完整路径 | Boolean | false | true|false |
selectParent | 是否可以选父级 | Boolean | false | true|false |
separator | 分隔符 | String | / | |
defaultProps | 配置选项,同hf-cascader-picker.defaultProps | Object | {} | |
visibleItemCount | 每列中可见选项数量 | Number | 5 |
scoped-slot
名称 | 说明 | 参数 |
---|---|---|
display-section | 展示部分 | {valueName: '选中的选项名', visible: '是否显示弹窗'} |
hf-form-tree 树形组件
树形组件 + 右侧弹框 + 搜索
示例1
<hf-form-tree
v-model="model.key1"
label="多选"
placeholder="请选择"
:options="options"
:default-props="defaultProps"
multiple
></hf-form-tree>
<hf-form-tree
v-model="model.key2"
label="多选 可选父节点"
placeholder="请选择"
:options="options"
:default-props="defaultProps"
multiple
select-parent
></hf-form-tree>
<hf-form-tree
v-model="model.key3"
label="多选 可选父节点 父子不互相关联"
placeholder="请选择"
:options="options"
:default-props="defaultProps"
multiple
select-parent
select-strictly
labelPosition="top"
></hf-form-tree>
<hf-form-tree
v-model="model.key4"
label="单选"
placeholder="请选择"
:options="options"
:default-props="defaultProps"
search
pinyin
></hf-form-tree>
export default {
data() {
return {
model: {
key1: '1-1-1-1,1-1-1-3',
key2: '1-1-1-2',
key3: '1,1-1-1-2',
key4: '1-1-1-2',
},
defaultProps: {
text: 'text',
value: 'value',
children: 'children'
},
options: [{
value: '1',
text: '一级 1',
children: [{
value: '1-1',
text: '二级 1-1',
children: [{
value: '1-1-1',
text: '三级 1-1-1',
children: [
{ value: '1-1-1-1', text: '四级 1-1-1-1' },
{ value: '1-1-1-2', text: '四级 1-1-1-2' },
{ value: '1-1-1-3', text: '四级 1-1-1-3' },
]
}
]
}, {
value: '1-2',
text: '二级 1-2',
children: [
{ value: '1-2-1', text: '三级 1-2-1' },
{ value: '1-2-2', text: '三级 1-2-2' },
]
}
]
}, {
value: '2',
text: '一级 2',
children: [{
value: '2-1',
text: '二级 2-1'
}, {
value: '2-2',
text: '二级 2-2',
children: [
{ value: '2-2-1', text: '三级 2-2-1' },
{ value: '2-2-2', text: '三级 2-2-2' },
]
},
]
}
]
};
},
methods: {
confirm() {
console.log('--- 打印 --->', uni.$u.deepClone(this.model));
//
},
}
}
示例2
<hf-form-tree
v-model="model.key1"
label="任务下派"
placeholder="请选择"
:options="options"
:default-props="defaultProps"
multiple
select-parent
select-strictly
last-icon="people"
last-icon-color="#CCCCCC"
></hf-form-tree>
export default {
data() {
return {
model: {
key1: '1,1-1-1-1,1-1-3,1-2-2-1',
},
defaultProps: {
text: 'text',
value: 'value',
children: 'children',
noShowLastIcon: 'noShowLastIcon'
},
options: [{
value: '1',
text: '鼓楼区',
children: [{
value: '1-1',
text: '社区名称',
children: [{
value: '1-1-1',
text: '第一网格',
children: [
{ value: '1-1-1-1', text: '刘一' },
{ value: '1-1-1-2', text: '陈二' },
]
}, {
value: '1-1-2',
text: '第二网格',
children: [
{ value: '1-1-2-1', text: '张三' },
{ value: '1-1-2-2', text: '李四' },
{ value: '1-1-2-3', text: '王五' },
]
}, {
value: '1-1-3',
text: '第三网格',
children: [
{ value: '1-1-3-1', text: '赵六' },
{ value: '1-1-3-2', text: '孙七' },
{ value: '1-1-3-3', text: '周八' },
]
}
]
}, {
value: '1-2',
text: '社区名称',
children: [{
value: '1-2-1',
text: '第四网格',
children: [
{ value: '1-2-1-1', text: '吴九' },
{ value: '1-2-1-2', text: '郑十' },
]
}, {
value: '1-2-2',
text: '第五网格',
children: [
{ value: '1-2-2-1', text: '张三丰' },
{ value: '1-2-2-2', text: '张三丰' },
]
},
]
}, {
value: '1-3',
text: '社区名称(叶子节点 不显示icon)',
noShowLastIcon: true
}
]
}, {
value: '2',
text: '台江区',
children: [{
value: '2-1',
text: '社区名称',
children: [
{ value: '2-1-1', text: '第一网格', noShowLastIcon: true },
{ value: '2-1-2', text: '第二网格', noShowLastIcon: true },
{ value: '2-1-3', text: '第三网格', noShowLastIcon: true }
]
},
]
}
]
};
},
}
props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
options | 数据 | Array | ||
multiple | 是否多选 | Boolean | false | true|false |
defaultProps | 选项默认配置,同hf-tree.defaultProps | Object | ||
search | 是否显示搜索 | Boolean | false | true|false |
pinyin | 是否拼音搜索 | Boolean | false | true|false |
showAllLevels | 是否显示选中值的完整路径 | Boolean | false | true|false |
selectParent | 是否可以选父级 | Boolean | false | true|false |
selectStrictly | 在多选的情况下 是否严格遵循父子不互相关联的做法 | Boolean | false | true|false |
separator | 多选选项值的分隔符 | String | , | |
textSeparator | 选项名的分隔符 | String | / | |
lastIcon | 没有子集的icon | String | ||
lastIconColor | 没有子集的icon颜色 | String |
注意:
- defaultProps:同
hf-tree.defaultProps
hf-form-location 定位
示例
<hf-form-location label="地点" prop="location" disabled initialize-location v-model="model.location" :latitude.sync="model.latitude" :longitude.sync="model.longitude" placeholder="请选择"></hf-form-location>
export default {
data() {
return {
model: {
location: '',
latitude: '',
longitude: ''
},
disabled: false
};
}
}
props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
latitude | 纬度 | String|Number | ||
longitude | 经度 | String|Number | ||
initializeLocation | 是否初始化位置信息 详情、修改 不主动获取定位 | Boolean | false | true|false |
coordinateSystem | 经纬度坐标系 | String |
coordinateSystem 默认值为中间件
hf-middleware
配置的coordinateSystem
hf-form-upload 文件上传
文件选择 + 文件上传
示例
<u-form ref="uForm" :model="model" :rules="rules">
<hf-form-upload
v-model="model.image"
label="图片"
prop="image"
:required="!disabled"
:disabled="disabled"
accept="image"
:max-count="3"
biz-path="image"
:max-size="maxSize"
></hf-form-upload>
<hf-form-upload
v-model="model.video"
label="视频"
prop="video"
:required="!disabled"
:disabled="disabled"
accept="video"
:max-count="1"
biz-path="video"
:max-size="maxSize"
></hf-form-upload>
<hf-form-upload
v-model="model.media"
label="图片和视频"
prop="media"
:required="!disabled"
:disabled="disabled"
accept="media"
:max-count="3"
biz-path="media"
:max-size="maxSize"
></hf-form-upload>
<hf-form-upload
v-model="model.file"
label="文件"
prop="file"
:required="!disabled"
:disabled="disabled"
accept="file"
:max-count="9"
biz-path="file"
:max-size="maxSize"
></hf-form-upload>
</u-form>
export default {
data() {
return {
model: {
image: '',
video: '',
media: '',
file: ''
},
rules: {
//
},
disabled: false,
maxSize: 5 * 1024 * 1024, // 5M
};
}
}
props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
labelPosition | label的位置 | String | top | left|top |
accept | 接受的文件类型 | String | image | image|video|media |
maxCount | 最大选择图片的数量 | Number | 9 | |
bizPath | 控制文件上传的业务路径 | String | 'temp' | |
maxSize | 选择单个文件的最大大小,单位B(byte),默认10M | String|Number | 10 1024 1024 | |
maxDuration | 拍摄视频最长拍摄时间,单位秒 | Number | 60 | |
uploading | 是否上传中,支持 .sync 修饰符 | Boolean | false | true|false |
uploadingText | 文件上传中提示 | String | 文件上传中,请稍后再试 |
slots
名称 | 说明 |
---|---|
tip | 左侧提示文字左侧的提示文字... |
hf-form-avatar 头像
头像选择、头像上传组件,点击头像,可重新选择头像
示例
<hf-form-avatar
v-model="model.picPath"
label="头像"
prop="picPath"
:required="!disabled"
:disabled="disabled"
></hf-form-avatar>
export default {
data() {
return {
disabled: false,
model: {
picPath: ''
}
};
}
}
props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
uploading | 是否上传中,支持 .sync 修饰符 | Boolean | false | true|false |
显示组件
hf-icon 图标
示例
<hf-icon name="location-fill" color="primary" size="24"></hf-icon>
props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
name | 图标名称,对应iconfont(Font Class) | String | ||
color | 图标颜色,可配置主题颜色(primary/info...) | String | color['u-content-color'] | |
size | 图标字体大小,单位默认px | String|Number | 16px | |
bold | 是否显示粗体 | Boolean | false | true|false |
customFamily | Font Family | String | hf | |
customPrefix | 自定义字体图标库 前缀 | String | hf | |
stop | 是否阻止事件传播 | Boolean | false | true|false |
events
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击图标时触发 | - |
hf-search 搜索
示例
<hf-search v-model="keyword" placeholder="请输入关键词"></hf-search>
export default {
data() {
return {
keyword: ''
};
}
}
props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
value | 输入值 | String | ||
placeholder | 占位符 | String | ||
bgColor | 搜索框背景颜色 | String | #fff | |
shape | 搜索框形状 | String | square | round|square |
hf-radio 单选
示例
<hf-radio v-model="value" :options="options"></hf-radio>
export default {
data() {
return {
value: '',
options: [{label: '选项1', value: '1'}, {label: '选项2', value: '2'}]
};
}
}
props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
value | 绑定值 | String | ||
mode | 展示方式 | String | radio | radio|text|btn |
options | 选项 | Array | [] | |
keyName | 控制显示的字段 | String | label | |
keyValue | 控制取值的字段 | String | value | |
keyDisabled | 控制禁用的字段 | String | disabled |
hf-cascader-picker 级联选择
嵌入页面的多列级联选择,多层级数据的选择。
何时使用:需要从一组相关联的数据集合进行选择,例如省市区,公司层级,事物分类等。
重复点击已选择的选项,为反选。
示例
<hf-cascader-picker v-model="value" :options="options"></hf-cascader-picker>
export default {
data() {
return {
value: '',
options: [{
"value": "1-0",
"text": "大连监所",
"children": [{
"value": "1-1",
"text": "第一看守所",
"children": [{
"value": "1-1-1",
"text": "一层",
"children": [{
"value": "1-1-1-1",
"text": "一层101",
"children": []
}]
}]
}, {
"value": "1-2",
"text": "第三看守所",
"children": []
}]
}]
};
}
}
props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
value | 绑定值 | String | ||
options | 选项 | Array | [] | |
visibleItemCount | 每列中可见选项数量 | Number | 5 | |
itemHeight | 单个选项高度 | Number | 44 | |
defaultProps | 配置选项 | Object | {} | |
selectParent | 是否可以选父级 | Boolean | false | true|false |
defaultProps Options
默认值:{ text: 'text', value: 'value', children: 'children' }
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
text | 选项的标签 | String | text |
value | 选项值 | String | value |
children | 子集 | String | children |
disabled | 是否禁用指定节点 | String | disabled |
hf-datetime-picker 嵌入页面的日期选择器
逻辑从<u-picker>
和<u-datetime-picker>
拷贝粘贴(版本: 2.0.34)
参数和<u-datetime-picker>
一致(可能部分没有复制 没有实现)
示例
<hf-datetime-picker mode="date" v-model="date"></hf-datetime-picker>
hf-datetime-range 嵌入页面的日期范围选择器
基于<hf-datetime-picker>
<hf-datetime-range v-model="date" mode="date" placeholder></hf-datetime-range>
props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
value | 绑定值 | Array | [] | |
mode | 展示格式 | String | date | datetime|date|time|year-month |
placeholder | 未选择开始结束时间前 是否显示一个占位高度 进行展位 | Boolean | false | true|false |
hf-upload 文件上传
示例
参考
<hf-form-upload>
、<hf-form-avatar>
props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
value | 绑定值 | String | ||
accept | 接受的文件类型 | String | image | image|video|media|file |
maxCount | 最大选择图片的数量 | Number | 9 | |
separator | 分隔符 | String | , | |
bizPath | 控制文件上传的业务路径 | String | 'temp' | |
maxSize | 选择单个文件的最大大小,单位B(byte),默认不限制 | String|Number | Number.MAX_VALUE | |
maxDuration | 拍摄视频最长拍摄时间,单位秒 | Number | 60 | |
disableNoShowBtn | 禁用状态,是否不显示选择文件按钮 | Boolean | false | true|false |
useBeforeRead | 是否开启读取前的处理函数 | Boolean | false | true|false |
beforeRead | 读取前的处理函数 | Function | ||
useBeforePreview | 是否开启预览前的处理函数 | Boolean | false | true|false |
beforePreview | 预览前的处理函数 | Function | ||
uploading | 是否上传中,支持 .sync 修饰符 | Boolean | false | true|false |
uploadingText | 文件上传中提示 | String | 文件上传中,请稍后再试 |
accept 合法值
值 | 说明 |
---|---|
image | 图片 |
video | 视频 |
media | 图片或视频 |
file | 文件(未实现预览) |
说明:
- 如果需要pdf文件预览,需要配置页面:
uni_modules/hf-ui/pages/preview/preview
!!!- 逻辑从
<u-upload>
拷贝粘贴,参数和<u-upload>
一致(可能部分没有复制 没有实现)- 文件上传中,不允许新增、删除文件,可能会导致数据错乱,∴ 文件上传结束后,才能进行其他操作
hf-preview 附件预览
附件预览,样式同hf-upload
示例
<hf-preview :value="info.attachmentList"></hf-preview>
export default {
data() {
return {
info: {
// 文件上传保存的值, 后端保存的文件id, 逗号',' 分隔
attachmentList: '1658666945588277249,1658667005730402306'
}
};
}
}
props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
value | 绑定值 | String | ||
width | 预览文件区域宽度,单位rpx,不能是百分比,或者auto | String|Number | 80 | |
height | 预览文件区域高度,单位rpx,不能是百分比,或者auto | String|Number | 80 | |
separator | 分隔符 | String | , | |
imageMode | 预览图片的裁剪模式,和image组件的mode属性一致 | String | aspectFill |
hf-list
列表页面公共组件
可自定义上下固定区域
示例
<hf-list ref="hfList" :fetch-list="getList">
<template #top>
<hf-search v-model="searchForm.keyword" placeholder="请输入关键字" @search="refreshList"></hf-search>
</template>
<template v-slot:item="{ item }">
<u-cell :title="item.name" :label="item.orgName" is-link></u-cell>
</template>
</hf-list>
export default {
data() {
return {
searchForm: {
keyword: ''
}
};
},
onShow() {
this.refreshList();
},
onPullDownRefresh() {
this.refreshList();
},
methods: {
refreshList() {
this.$refs.hfList && this.$refs.hfList.getList(true);
},
async getList(pagination) {
const res = await list({
name: this.searchForm.keyword,
...pagination
});
if (!(res.result && Array.isArray(res.result.records))) return;
const data = res.result;
return {
total: data.total,
records: data.records.map(item => {
return {
id: item.id,
name: item.name,
orgName: item.adminCodeName
};
})
};
}
}
}
props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
fetchList | 获取数据的函数 | Function | ||
limit | 分页每页条数 0-不分页 | Number | 10 | |
listStyle | u-list 样式 | Object | ||
emptyText | 空提示文字 | String | ||
rowKey | 唯一标识字段,作为key | String | id | |
initNoFetchList | 初始化是否不获取数据 | Boolean | false | true|false |
注意:
- fetchList:返回promise {total: 0, records: []}
hf-list-only
列表滚动组件,包含缺省提示
示例1:H5
弹性布局的纵向布局,上下可自定义内容,hf-list-only
剩余高度撑开
<template>
<view class="page">
<hf-search v-model="searchForm.keyword" placeholder="请输入关键字" @search="refreshList"></hf-search>
<hf-list-only
ref="hfList"
:fetch-list="fetchList"
>
<template v-slot:item="{ item }">
<u-cell :title="item.title" :label="item.content"></u-cell>
</template>
</hf-list-only>
</view>
</template>
<script>
export default {
data() {
return {
searchForm: {
keyword: ''
}
};
},
onShow() {
this.refreshList();
},
onPullDownRefresh() {
this.refreshList();
},
methods: {
refreshList() {
this.$refs.hfList && this.$refs.hfList.getList(true);
},
fetchList(pagination) {
const params = {
keyword: this.searchForm.keyword,
...pagination
}
const records = [];
for (let i = 0; i < pagination.pageSize; i++) {
const id = (pagination.pageNo - 1) * pagination.pageSize + i + 1;
records.push({ id, title: `文章${id}`, content: '文章内容文章内容文章内容...' });
}
return {
total: 160,
records
};
}
}
}
</script>
<style lang="scss" scoped>
.page {
height: 100vh;
display: flex;
flex-direction: column;
}
</style>
示例2:小程序
相比 示例1:H5 添加代码
- 添加样式:
<hf-list-only style="flex: 1; height: 0;" ...>
∵ 微信小程序 多一层 ∴ 手动设置高度撑开 - 生命周期
mounted
手动设置fetch-list
:this.$refs.hfList.setFetchList(this.fetchList);
∵ props传入函数, 组件内调用,微信小程序 this指向当前组件实例hf-list-only
∴ 父组件调用setFetchList
手动传入函数,组件内调用,this
指向父级
<template>
<view class="page">
<hf-search v-model="searchForm.keyword" placeholder="请输入关键字" @search="refreshList"></hf-search>
<hf-list-only
ref="hfList"
:fetch-list="fetchList"
style="flex: 1; height: 0;"
>
<template v-slot:item="{ item }">
<u-cell :title="item.title" :label="item.content"></u-cell>
</template>
</hf-list-only>
</view>
</template>
<script>
export default {
data() {
return {
searchForm: {
keyword: ''
}
};
},
mounted() {
this.$refs.hfList.setFetchList(this.fetchList);
},
onShow() {
this.refreshList();
},
onPullDownRefresh() {
this.refreshList();
},
methods: {
refreshList() {
this.$refs.hfList && this.$refs.hfList.getList(true);
},
fetchList(pagination) {
const params = {
keyword: this.searchForm.keyword,
...pagination
}
const records = [];
for (let i = 0; i < pagination.pageSize; i++) {
const id = (pagination.pageNo - 1) * pagination.pageSize + i + 1;
records.push({ id, title: `文章${id}`, content: '文章内容文章内容文章内容...' });
}
return {
total: 160,
records
};
}
}
}
</script>
<style lang="scss" scoped>
.page {
height: 100vh;
display: flex;
flex-direction: column;
}
</style>
说明:
通过ref调用组件setFetchList
方法,只能放mount生命周期之后
组件内部created
生命周期钩子函数,调用防抖返回的getList
方法,因为防抖500ms时延,所以...阴差阳错...外部手动调用setFetchList
设置fetchList
之后,组件内部再初次调用getList
调用父组件传入的fetchList
方法。
hf-tree 树形组件
树型选择器 + 仿elementUI 点击父节点多选
参考:树形选择器 https://ext.dcloud.net.cn/plugin?id=702
示例
<view style="padding: 20rpx 20rpx 0; color: #999;">多选</view>
<hf-tree ref="hfTree1" :value="model.key1" :options="options" :defaultProps="defaultProps" multiple></hf-tree>
<view style="padding: 20rpx 20rpx 0; color: #999;">多选 可选父节点</view>
<hf-tree ref="hfTree2" :value="model.key2" :options="options" :defaultProps="defaultProps" multiple select-parent></hf-tree>
<view style="padding: 20rpx 20rpx 0; color: #999;">多选 可选父节点 父子不互相关联</view>
<hf-tree ref="hfTree3" :value="model.key3" :options="options" :defaultProps="defaultProps" multiple select-parent select-strictly></hf-tree>
<view style="padding: 20rpx 20rpx 0; color: #999;">单选</view>
<hf-tree ref="hfTree4" :value="model.key4" :options="options" :defaultProps="defaultProps"></hf-tree>
<view class="btns">
<u-button @click="confirm">打印</u-button>
</view>
export default {
data() {
return {
model: {
key1: ['1-1-1-1', '1-1-1-3'],
key2: ['1-1-1-2'],
key3: ['1', '1-1-1-2'],
key4: '1-1-1-2',
},
defaultProps: {
text: 'text',
value: 'value',
children: 'children'
},
options: [{
value: '1',
text: '一级 1',
children: [{
value: '1-1',
text: '二级 1-1',
children: [{
value: '1-1-1',
text: '三级 1-1-1',
children: [
{ value: '1-1-1-1', text: '四级 1-1-1-1' },
{ value: '1-1-1-2', text: '四级 1-1-1-2' },
{ value: '1-1-1-3', text: '四级 1-1-1-3' },
]
}
]
}, {
value: '1-2',
text: '二级 1-2',
children: [
{ value: '1-2-1', text: '三级 1-2-1' },
{ value: '1-2-2', text: '三级 1-2-2' },
]
}
]
}, {
value: '2',
text: '一级 2',
children: [{
value: '2-1',
text: '二级 2-1'
}, {
value: '2-2',
text: '二级 2-2',
children: [
{ value: '2-2-1', text: '三级 2-2-1' },
{ value: '2-2-2', text: '三级 2-2-2' },
]
},
]
}
]
};
},
methods: {
confirm() {
// [{value: '1-1-1-1', text: '四级 1-1-1-1'}, {value: '1-1-1-3', text: '二级 1-1-1-3'}]
console.log('--- hfTree1 --->', this.$refs.hfTree1.confirm());
// [{value: '1-1-1-2', text: '四级 1-1-1-2'}]
console.log('--- hfTree2 --->', this.$refs.hfTree2.confirm());
// [{value: '1', text: '一级 1', children: Array(2)}, {value: '1-1-1-2', text: '四级 1-1-1-2'}]
console.log('--- hfTree3 --->', this.$refs.hfTree3.confirm());
// [{value: '1-1-1-2', text: '四级 1-1-1-2'}]
console.log('--- hfTree4 --->', this.$refs.hfTree4.confirm());
},
}
}
props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
value | 绑定值 | Array|String|Number | ||
options | 数据 | Array | ||
defaultProps | 选项默认配置,具体看下表 | Object | 看下表 | |
multiple | 是否多选 | Boolean | false | true|false |
selectParent | 是否可以选父级 | Boolean | false | true|false |
selectStrictly | 在多选的情况下 是否严格遵循父子不互相关联的做法 | Boolean | false | true|false |
foldAll | 折叠所有子集 | Boolean | false | true|false |
border | 是否有分割线(未实现) | Boolean | false | true|false |
expandLevel1 | 是否展开第一级 | Boolean | false | true|false |
noShowCheckbox | 不显示右侧单选多选框,不影响点击选择 | Boolean | false | true|false |
disabled | 是否禁用 | Boolean | false | true|false |
filterable | 是否可搜索 | Boolean | false | true|false |
filterText | 搜索词 | String | ||
filterKeys | 可搜索字段 | Array | ||
pinyin | 是否拼音搜索 | Boolean | false | true|false |
confirmColor | 单选多选框颜色 | String | color['u-primary'] | |
lastIcon | 没有子集的icon | String | ||
lastIconColor | 没有子集的icon颜色 | String |
defaultProps Options
默认值:{ text: 'text', value: 'value', children: 'children', noShowLastIcon: 'noShowLastIcon' }
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
text | 选项的标签 | String | text |
value | 选项值 | String | value |
children | 子集 | String | children |
disabled | 是否禁用指定节点 | String | disabled |
noShowLastIcon | 叶子节点是否不显示lastIcon | String | showLastIcon |
注意:
- 配了
lastIcon
,默认最后一级显示icon;节点数据可配置noShowLastIcon
,标识最后一级是否不显示icon
slot
名称 | 说明 |
---|---|
— | 自定义树节点的内容,参数为 { node, data } |
hf-dropdown 下拉菜单
向下展开菜单,同时可切换多个选项卡
示例
<hf-dropdown>
<hf-dropdown-item v-model="model.value1" title="距离" :options="options1"></hf-dropdown-item>
<hf-dropdown-item v-model="model.value2" title="温度" :options="options2"></hf-dropdown-item>
</hf-dropdown>
export default {
data() {
return {
model: {
value1: '',
value2: ''
},
options1: [
{ label: '选项1', value: '1' },
{ label: '选项2', value: '2' },
{ label: '选项3', value: '3' },
],
options2: [
{ label: '选项1', value: '1' },
{ label: '选项2', value: '2' },
{ label: '选项3', value: '3' },
{ label: '选项4', value: '4' },
{ label: '选项5', value: '5' },
]
};
}
}
dropdown props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
closeOnClickOverlay | 点击遮罩是否关闭菜单 | Boolean | true | true|false |
closeOnClickSelf | 点击当前激活标题是否关闭菜单 | Boolean | true | true|false |
duration | 过渡时间 | Number|String | 300 | |
height | 标题菜单的高度 | Number|String | 80rpx | |
borderBottom | 是否显示下边框 | Boolean | false | true|false |
titleSize | 标题的字体大小 | Number|String | 15px | |
borderRadius | 下拉出来的内容部分的圆角值 | Number|String | 0 | |
menuIcon | 菜单右侧的icon图标 | String | arrow-down | |
menuIconSize | 菜单右侧图标的大小 | Number|String | 14px | |
noShowOptionsName | 是否不显示选择的选项名 (默认false: 显示选择的选项名) |
Boolean | false |
dropdown events
事件名 | 说明 | 回调参数 |
---|---|---|
open | 下拉菜单被打开时触发 | (index) - 当前被打开菜单的索引 |
close | 下拉菜单被关闭时触发 | (index) - 当前被关闭菜单的索引 |
dropdown-item props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
value | 当前选中项的value值 | Number|String|Array | ||
title | 菜单项标题 | String|Number | ||
options | 选项数据,如果传入了默认slot,此参数无效 | Array | [] | |
disabled | 是否禁用此菜单项 | Boolean | false | true|false |
height | 下拉弹窗的高度 | Number|String | auto | |
keyName | 控制显示的字段 | String | label | |
keyValue | 控制取值的字段 | String | value | |
keyDisabled | 控制禁用的字段 | String | disabled |
dropdown-item slots
名称 | 说明 |
---|---|
- | 自定义选项卡内容 |
dropdown-item events
事件名 | 说明 | 回调参数 |
---|---|---|
change | 每个u-dropdown-item 均有此回调,点击某个options 选项时触发 |
(value) - 点击项绑定的value 属性值 |
dropdown-item methods
组件内部方法,需要通过ref
调用
方法名 | 参数 | 说明 |
---|---|---|
highlight | (index) | index为需要设置高亮的菜单项的索引(从0开始),不写表示清空内部的高亮 |
说明
-
弹框选择的两种规范
- 点击【取消】,忽略用户操作,以上一次点击【完成】的结果为准。
- 点击【取消】,保留当前操作选项,不做清空处理。
按第一种规范