一款基于 Vue2.6 实现的表单、表格低代码插件,支持查询表单、表单联动、表单显隐、表单异步赋值,动态表格能各项能力。组件文档可能更新不及时,大家可以查看 Release 文档。
-
Release: Release 文档。
- 基于 json 配置化开发表单、表格组件
- 基于 ElementUI 二次封装,无缝对接,属性、事件均和 ElementUI 同步
- rocket-render 更加易用、快速开发
- 安装 rocket-render
yarn add rocket-render -S
# or
npm i rocket-render -S
- rocket-render 依赖 ElementUI,所以需要安装 ElementUI
yarn add element-ui -S
- 本案例需要使用 axios 发送请求,所以也需要安装 axios(插件本身不需要 axios)
yarn add axios -S
- main.js 中全局安装插件
import Vue from 'vue';
import Element from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import RocketRender from 'rocket-render';
import 'rocket-render/lib/rocket-render.css';
Vue.use(Element);
// 可根据公司业务做全局定制
Vue.use(RocketRender, {
size: 'small', // form/table全局尺寸: medium / small / mini
empty: '-', // table列中字段为空时,默认显示内容
inline: 'flex', // 搜索表单全局配置,默认:flex
toolbar: true, // 是否展示工具条,默认:true
align: 'center', // 表格列对齐方式,默认:center
border: true, // 表格是否显示边框,默认:true
pager: true, // 是否显示分页器,默认:true
pageSize: 20, // 全局每页条数,默认:20
emptyText: '暂无数据', // 表格无数据时展示内容,默认:暂无数据
});
- 页面使用组件
<template>
<!-- style 不是必须的,此处为了好看,添加一个默认背景 -->
<div style="background-color: #f1f1f1;padding: 20px;">
<!-- 搜索表单,自带样式,可以自定义进行覆盖,model最好添加sync来同步语法糖 -->
<search-form
:json="form"
:model.sync="queryForm"
@handleQuery="getTableList"
/>
<!-- 列表区域,支撑各种场景的列显示以及自定义列,注意json要添加.sync用来同步对象 -->
<rocket-table
:json.sync="tableJson"
@handleChange="getTableList"
style="margin-top: 20px;padding: 20px;"
/>
</div>
</template>
<script>
import axios from 'axios';
export default {
name: 'index',
data() {
return {
// 表单model对象,用于初始化值和获取表单值
queryForm: {
user_name: 'jack',
user_status: [1, 2],
register_date: '2020-11-20',
login_time: ['2020-11-01', '2020-11-20'],
time_part_start: '03:00',
time_part_end: '05:00',
match: 1,
province: ['Hubei', 'Wuhan'],
use_status: 1,
query_field: 1,
},
// 动态生成查询表单
form: [
{
type: 'text',
model: 'user_name',
label: '用户',
placeholder: '请输入用户名称',
/**
* 所有组件都包含change事件,用于处理自定义业务
* val: 当前字段值
* values:当前表单值
* model: 当前字段
*/
change(val, values, model) {
// 可获取所有值,也可直接重置修改其它字段
values.use_status = 2;
},
/**
* 用来做显隐,判断当前字段是否需要展示
* 支持函数和对象两种写法
* 注意:show只能用在rocket-form中,search-form暂时未支持。
*/
show(values) {
return [1, 3, 4].includes(values.user_type);
},
// 方式二:
show: {
// 当user_type为 1/3/4 其中一个时显示
model: 'user_type',
val: [1, 3, 4],
},
prepend: 'https://',
append: '.com',
},
{
type: 'radio',
label: '使用状态',
placeholder: '请选择使用状态',
model: 'use_status',
options: [
{ label: '在线', value: 1 },
{ label: '离线', value: 2 },
],
},
{
type: 'select',
model: 'user_status',
label: '用户状态',
multiple: true, // 支持多选
filterable: true, // 支持输入过滤
change: this.getSelectList, // 自定义事件,回调接口
width: '260px',
options: [
{ label: '全部', value: 0 },
{ label: '已注销', value: 1 },
{ label: '老用户', value: 2 },
{ label: '新用户', value: 3 },
],
},
{
type: 'select',
model: 'user_list',
label: '用户列表',
options: [],
// 如果接口返回的不是label/value结构,可以使用field进行映射
field: {
label: 'name',
value: 'id',
},
// 异步获取下拉选项值
fetchOptions: async () => {
const res = await axios.get(
'https://www.fastmock.site/mock/f7b55d085be70bdf2bdd62fb3c65081a/api/userList',
);
return res.data;
},
// 或者在mounted中,通过this.form[1].options = [{label:1,value:1}] 动态赋值
},
{
type: 'date',
model: 'register_date',
label: '注册日期',
shortcuts: true,
width: '150px',
change(val, values) {
console.log(val, values);
values.user_name = 'tom';
},
},
{
type: 'daterange',
model: 'login_time',
label: '日期范围',
width: '220px',
shortcuts: true,
// 一般接口需要拆分成两个字段,可以使用export进行拆解,非常实用。
export: ['startTime', 'endTime'],
},
{
type: 'time-select',
label: '注册时段',
model: 'time_part_start',
change: this.handleTime,
pickerOptions: {
start: '00:00',
step: '01:00',
end: '23:00',
},
},
{
type: 'time-select',
label: '-',
model: 'time_part_end',
pickerOptions: {
start: '00:00',
step: '01:00',
end: '23:00',
},
},
{
type: 'cascader',
model: 'province',
label: '省份',
props: {
multiple: true, // 支持多选
},
options: [
{
value: 'Hubei',
label: '湖北',
children: [
{
value: 'Wuhan',
label: '武汉',
disabled: true, // 支持单项禁用
},
{
value: 'Xiangyang',
label: '襄阳',
},
],
},
{
value: 'Beijing',
label: '北京',
children: [
{
value: 'Haidian',
label: '海淀区',
},
{
value: 'ChaoYang',
label: '朝阳',
},
],
},
],
},
{
type: 'checkbox',
model: 'match',
label: '是否匹配',
trueLabel: 1,
falseLabel: 0,
},
{
type: 'switch',
model: 'isCheck',
label: '是否校验',
},
],
tableJson: {
title: '用户列表',
actionList: [{ text: '新增' }],
// 表格列头
columns: [
{
prop: 'selection',
type: 'selection',
label: '选框',
},
{
prop: 'index',
type: 'index',
label: '序号',
},
{
prop: 'uid',
label: '用户ID',
align: 'left',
},
{
prop: 'cname',
label: '用户名称',
align: 'left',
},
{
prop: 'user_img',
label: '头像',
width: 240,
type: 'image',
image: {
type: 'single',
},
},
{
prop: 'use_status',
label: '当前状态',
formatter(row) {
return {
1: '在线',
2: '离线',
}[row.use_status];
},
},
{
prop: 'user_email',
label: '邮箱',
},
{
prop: 'user_status_name',
label: '用户状态',
},
{
prop: 'intrest_name',
label: '兴趣',
width: 70,
},
{
prop: 'register_date',
label: '注册时间',
},
{
type: 'action',
list: [
// 第一种:常规用法,通过text显示按钮名称
{
text: '编辑',
// 默认显示,可不填,一般我们通过permission来做按钮权限,控制显示和隐藏
permission: true,
},
//支持style/class等相关属性,所有el-button支持的属性,都可以添加
{
text: '删除',
permission: true,
style: { color: 'red' },
class: 'txt',
},
// 第二种:支持根据返回值动态显示不同按钮名称
{
prop: 'status', //显示的按钮需要根据此状态动态控制
val: {
2: '启用', // status为2,显示启用
1: {
// status为1,显示禁用,同时设置按钮颜色
text: '禁用',
disabled: true, //按钮禁用
},
},
permission: true, //权限控制,根据后台返回动态设置
},
// 第三种:直接使用函数编程,推荐使用编程
{
text: '添加',
permission: ({ status }) => {
return status == 1;
},
},
],
},
],
data: [],
// 分页对象,此结构目前固定
pagination: {
pageNum: 1,
pageSize: 20,
total: 0,
},
},
};
},
mounted() {
this.getTableList();
},
methods: {
// 首页列表查询,page为子组件传递的页码,默认为1
async getTableList(page = 1) {
this.tableJson.pagination.page = page;
const data = {
...this.queryForm, // 查询表单数据
...this.tableJson.pagination, // 默认分页数据
};
const res = await axios.get(
'https://www.fastmock.site/mock/f7b55d085be70bdf2bdd62fb3c65081a/api/basic/list',
data,
);
this.tableJson.data = res.data.list;
this.tableJson.pagination.total = res.data.total;
},
// 推荐使用fetchOptions方法来动态获取下拉值。
getSelectList(val, values, model) {
console.log(val, values, model);
axios
.get(
'https://www.fastmock.site/mock/f7b55d085be70bdf2bdd62fb3c65081a/api/userList',
)
.then((res) => {
// 动态设置options数组
this.form[3].options = res.data;
});
},
handleTime(val) {
this.form[7].pickerOptions.minTime = val;
// 或者通过$获取每个表单字段进行对象赋值
this.form.$time_part_start.pickerOptions.minTime = val;
},
},
};
</script>