vue3-low-req
Version:
前端js 组件库,快捷开发、组件封装
420 lines (381 loc) • 11.8 kB
Markdown
Vue3 Low Req 组件库使用文档
Vue3 Low Req 是一个基于 Vue 3 的组件库,主要用于快速构建具有数据请求和分页功能的列表组件。
安装
bash
npm install vue3-low-req
快速开始
全局注册
javascript
import { createApp } from 'vue'
import App from './App.vue'
import Vue3LowReq from 'vue3-low-req'
import 'vue3-low-req/dist/style.css'
const app = createApp(App)
app.use(Vue3LowReq)
app.mount('#app')
使用前先初始化
javascript
import {queryList,queryBox,initRequest}from 'vue3-low-req'
//最好在项目初始化完毕就调用此方法
initRequest(null,(data)=>{ // 请求拦截 例如 success 就把data放入 返回 这里是放入queryList的数据,
//注意 return 的 数据结构最好是这样 {data:[] ,total:0} 可以不包含 total 但是必须要data
return data //{data:[] ,total:0}
},{ //这个参数为config 参数可选 不填直接有默认
// 配置 分页字段名 , 下面是默认的 , 可自定义
pageFieldName:{
pageNumber:'pageNumber',
pageSize:'pageSize',
total:'total',
data:'data'
},
isAutoBotomPageSelect:true, //是否默认开启底部分页选择 组件 , 默认true 就是 如果数据带 total 分页总条数 就会自动开启分页
})
局部导入
javascript
import { low-queryList, low-queryParent, low-pagination, low-queryBox } from 'vue3-low-req'
import 'vue3-low-req/dist/style.css'
组件说明
1.low-queryParent 组件
queryParent 组件是query 的父组件 提供了数据请求和分页的核心功能。
基本用法
vue
<template>
<low-queryParent req-url="/api/data">
<template #default="{ data, page, changePage, changePageSize }">
<!-- 使用获取到的数据 -->
<div v-if="Array.isArray(data)">
<div v-for="item in data" :key="item.id">
{{ item }}
</div>
</div>
</template>
<!-- 自定义分页 -->
<template #pagination="{ pagination, changePage, changePageSize }">
<div class="custom-pagination">
<button @click="changePage(pagination.currentPage - 1)">上一页</button>
<span>第 {{ pagination.currentPage }} 页</span>
<button @click="changePage(pagination.currentPage + 1)">下一页</button>
</div>
</template>
</low-queryParent>
</template>
<script setup>
</script>
Props
暂时无法在飞书文档外展示此内容
Events
暂时无法在飞书文档外展示此内容
Ref调用
暂时无法在飞书文档外展示此内容
//一般例如 需要修改 data 里面数据 只需要这样 , 即可自动 双向绑定刷新到 template 里面
const data = queryBoxRef.value.parent.getRespData()
data.collect_task_status = "2"
Slots
default
默认插槽,提供以下作用域属性:
- data: 从请求获取的数据
- page: 分页信息对象
- changePage(page): 切换页面的方法
- changePageSize(size): 更改每页显示数量的方法
pagination
分页插槽,提供以下作用域属性:
- pagination: 分页信息对象
- changePage(page): 切换页面的方法
- changePageSize(size): 更改每页显示数量的方法
-
2. low-queryList 组件
queryList 组件是一个完整的列表组件,提供了数据请求、分页和列表展示功能。
基本用法
vue
<template>
<low-queryList
req-url="/api/users"
req-method="get"
:req-data="{ status: 'active' }" />
</template>
<script setup>
import { lowQueryList } from 'vue3-low-req'
</script>
自定义列表项
vue
<template>
<low-queryList req-url="/api/users">
<template #default="{ item, data, index }">
<div class="custom-item">
<h3>{{ item.name }}</h3>
<p>{{ item.email }}</p>
</div>
</template>
</low-queryList>
</template>
Props
拥有 low-queryParent 的全部参数功能, 其他参数 转到 low-queryParent 组件查看
暂时无法在飞书文档外展示此内容
Slots
default
默认插槽,提供以下作用域属性:
- item: 当前列表项数据
- data: 完整的响应数据
- index: 当前项索引
ref使用父组件
ref.value.parent.函数()
3. low-queryBox 组件
queryBox 组件是一个通用的数据容器组件,适用于展示卡片式数据。card-class参数不传即普通div , 参数参考样式说明里面的 .card 的css
基本用法
vue
<template>
<low-queryBox
req-url="/api/data"
card-class="card-base"
@get-data="handleData">
<template #default="{ data }">
<div class="card-header">标题</div>
<div class="card-body">{{ data }}</div>
</template>
</low-queryBox>
</template>
<script setup>
const handleData = (data, pagination) => {
console.log('获取到数据:', data, pagination)
}
</script>
Props
拥有 low-queryParent 的全部参数功能, 其他参数 转到 queryParent 组件
暂时无法在飞书文档外展示此内容
Events
暂时无法在飞书文档外展示此内容
ref使用父组件
ref.value.parent.函数()
Slots
default
默认插槽,提供以下作用域属性:
- data: 从请求获取的数据
4. low-dataDic 数据字典组件
概述
LowDataDic 是一个用于显示数据字典值的 Vue 组件。它可以根据传入的字典代码和值,异步获取并显示对应的字典名称。
使用前 需要初始化
/**
* 初始化数据字典
*/
initDataDic(async (code)=>{
const resp = await asynDataDicItems(code)
console.log('initDataDic',resp)
return resp
//return的数据结构如下 为数组
// [{name:'0',value:'1'},{name:'1',value:'2'}]
})
使用方法
vue
<template>
<lowDataDic code="dict_code" value="dict_value" />
</template>
<script setup>
import { lowDataDic } from 'path/to/component'
</script>
Props
暂时无法在飞书文档外展示此内容
示例
基础用法
vue
<template>
<div>
<!-- 显示性别为1对应的名称(如"男") -->
<lowDataDic code="gender" value="1" />
<!-- 显示状态为0对应的名称(如"禁用") -->
<lowDataDic code="status" value="0" />
</div>
</template>
在列表中使用
vue
<template>
<div v-for="item in userList" :key="item.id">
<p>用户名: {{ item.name }}</p>
<p>性别: <lowDataDic code="gender" :value="item.gender" /></p>
<p>状态: <lowDataDic code="user_status" :value="item.status" /></p>
</div>
</template>
工作原理
1. 组件接收 code 和 value 两个参数
2. 在组件挂载时,调用 dataDic.getDataDicName(code, value) 方法获取字典名称
3. 异步获取到名称后,将其显示在组件中
注意事项
1. 该组件依赖于 ../js/dataDic 模块,确保该模块正确配置并可访问
2. 字典数据的获取是异步的,组件会在数据加载完成后自动更新显示
3. 如果传入的字典代码或值不存在,组件可能显示空字符串或默认值
5. low-pagination 组件(默认应用上面组件有分页时自动出现,一般不单独使用因为网上一大把)
Pagination 组件是一个独立的分页控件。
基本用法
vue
<template>
<low-pagination
:pagination="paginationData"
:change-page="handleChangePage"
:change-page-size="handleChangePageSize" />
</template>
<script setup>
import { reactive } from 'vue'
const paginationData = reactive({
currentPage: 1,
pageSize: 10,
total: 100,
totalPages: 10
})
const handleChangePage = (page) => {
console.log('切换到第', page, '页')
}
const handleChangePageSize = (size) => {
console.log('每页显示', size, '条')
}
</script>
Props
暂时无法在飞书文档外展示此内容
高级用法(必选)
自定义请求处理
如果需要自定义请求处理,可以使用提供的请求工具函数:
javascript
import { initRequest, setRequest, setRequestConfig } from 'vue3-low-req'
// 设置请求配置 如自定义的axios Request 请忽略这一步
setRequestConfig('https://api.example.com', {
timeout: 10000
})
// 初始化请求配置 可自定义request 也就是 axios对象 反之 使用默认的 需要设置 config
initRequest(customRequest, (data) => {
// 数据过滤处理
return data.result
})
数据过滤函数
可以使用 dataFilterFunc 属性对请求返回的数据进行处理:
vue
<template>
<queryParent
req-url="/api/data"
:data-filter-func="filterData">
<template #default="{ data }">
{{ data }}
</template>
</queryParent>
</template>
<script setup>
import { queryParent } from 'vue3-low-req'
const filterData = (responseData) => {
// 对响应数据进行处理
return responseData.items || []
}
</script>
完整示例
vue
<template>
<div class="vue3-low-req">
<h2>用户列表</h2>
<queryList req-url="/api/users" req-method="get" :req-data="{ department: 'IT' }">
<template #default="{ item, index }">
<div class="user-card">
<img :src="item.avatar" :alt="item.name" />
<div class="user-info">
<h3>{{ item.name }}</h3>
<p>{{ item.email }}</p>
<p>{{ item.department }}</p>
</div>
</div>
</template>
</queryList>
<queryBox req-url="/api/statistics" card-class="card-base mt-10" @get-data="handleStats">
<template #default="{ data }">
<div class="card-header">统计信息</div>
<div class="card-body">
<div class="stats-grid">
<div class="stat-item">
<div class="stat-value">{{ data.userCount }}</div>
<div class="stat-label">用户总数</div>
</div>
<div class="stat-item">
<div class="stat-value">{{ data.activeCount }}</div>
<div class="stat-label">活跃用户</div>
</div>
</div>
</div>
</template>
</queryBox>
</div>
</template>
<script setup>
import { queryList, queryBox } from 'vue3-low-req'
const handleStats = (data, pagination) => {
console.log('统计信息:', data)
}
</script>
<style scoped>
.user-card {
display: flex;
border: 1px solid #eee;
padding: 16px;
margin-bottom: 16px;
border-radius: 8px;
}
.user-card img {
width: 50px;
height: 50px;
border-radius: 50%;
margin-right: 16px;
}
.user-info h3 {
margin: 0 0 8px 0;
}
.stats-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
}
.stat-item {
text-align: center;
}
.stat-value {
font-size: 24px;
font-weight: bold;
color: #4f628c;
}
.stat-label {
font-size: 14px;
color: #666;
}
</style>
注意事项
1. 仅支持 GET 和 POST 请求方法
2. 确保请求返回的数据格式兼容组件要求
3. 如果需要自定义样式,可以覆盖默认的 CSS 类名
常见问题
如何处理请求错误?
组件会自动显示错误信息,您也可以通过插槽自定义错误显示方式。
如何自定义分页样式?
通过 pagination 插槽可以完全自定义分页控件的外观和行为。
如何在请求中添加认证信息?
可以通过自定义请求处理函数来添加认证头信息:
javascript
import { initRequest } from 'vue3-low-req'
import axios from 'axios'
const customRequest = axios.create({
baseURL: 'https://api.example.com',
headers: {
'Authorization': `Bearer ${getToken()}`
}
})
initRequest(customRequest)
//在手机端上有时会遇到下滑滚动 加载更多的 场景 这样即可解决
<template>
<low-queryBox
req-url="/ebss/collectTask/appList"
:defPageSize="5"
isPage
:req-data="query"
ref="queryBoxAppListRef"
@getData="e=>{listData.push(...e.data)}"
@pageLastNotice="toast('已经到底')"
></low-queryBox>
<div class="item" v-for="(item,index) in listData">
{{item}}
</div>
</template>
<script setup>
import {ref} from 'vue'
const listData = ref([])
</script>