schema-page.md 27 KB

Schema Page 方案页面

根据JSON Schema配置自动生成一个包含搜索、表格、表单、详情功能的页面

6a3e9fa03a9e62888fd3096196dcc68e3e3bb90a/examples/views/docs/component/schema-page.md#">基础用法

schema设置配置项,其中包括filtertableform三个基本schema配置,配置方式分别对应eagle-schema-filtereagle-schema-tableeagle-schema-form,绑定值则分别对应value-filtervalue-tablevalue-form,由于是多个双向绑定的值,所以使用sync修饰符来做双向绑定。

::: snippet 基础示例

<template>
  <eagle-schema-page :schema="schema" :value-filter.sync="filterModel" :value-table.sync="tableModel" :value-form.sync="formModel"></eagle-schema-page>
</template>

<script>
export default {
  data() {
    return {
      schema: {
        filter: {
          items: [
            { is: 'el-input', prop: 'name', label: '姓名' },
          ]
        },
        table: {
          items: [
            { prop: 'name', label: '姓名' },
            { prop: 'age', label: '年龄' },
            { prop: 'address', label: '地址' },
            { prop: 'status', label: '状态', render: (value, row, h) => h('el-tag', { props: { size: 'mini', type: 'info' } }, value) },
          ]
        },
        form: {
          props: { labelWidth: '70px', size: 'small', span: 12 },
          items: [
            { is: 'el-input', prop: 'name', label: '姓名', rules: [{ required: true, message: '请输入姓名' }] },
            { is: 'el-input-number', prop: 'age', label: '年龄', rules: [{ required: true, message: '请输入有效年龄' }] },
            { is: 'el-input', props: { type: 'textarea' }, prop: 'address', label: '住址', span: 24 },
          ]
        },
      },
      filterModel: { name: '', age: '', gender: '', address: '' },
      formModel: { name: '', age: '', address: '' },
      tableModel: [
        { id: '0', name: '李饼', age: 32, address: '地址0', status: '正常' },
        { id: '1', name: '陈拾', age: 20, address: '地址1', status: '正常' },
        { id: '3', name: '王七', age: 26, address: '地址3', status: '正常' },
        { id: '4', name: '崔倍', age: 27, address: '地址4', status: '正常' },
        { id: '5', name: '孙豹', age: 38, address: '地址5', status: '正常' },
      ],
    }
  },
}
</script>

:::

6a3e9fa03a9e62888fd3096196dcc68e3e3bb90a/examples/views/docs/component/schema-page.md#">详情入口

可以通过自定义插槽的方式,在单元格内指定详情入口。由于三个子组件均支持自定义插槽,所以在本组件中使用自定义插槽时需要加上子组件前缀

::: snippet 配置表格中的详情入口可以使用table-cell-插槽。

<template>
  <eagle-schema-page :schema="schema" :value-filter.sync="filterModel" :value-table.sync="tableModel" :value-form.sync="formModel">
    <template #table-cell-name="{ value, row, openDetail }">
      <el-link type="primary" @click="openDetail(row)">{{ value }}</el-link>
    </template>
  </eagle-schema-page>
</template>

<script>
export default {
  data() {
    return {
      schema: {
        filter: {
          items: [
            { is: 'el-input', prop: 'name', label: '姓名' },
          ]
        },
        table: {
          items: [
            { prop: 'name', label: '姓名' },
            { prop: 'age', label: '年龄' },
            { prop: 'address', label: '地址' },
            { prop: 'status', label: '状态', render: (value, row, h) => h('el-tag', { props: { size: 'mini', type: 'info' } }, value) },
          ]
        },
        form: {
          props: { labelWidth: '70px', size: 'small', span: 12 },
          items: [
            { is: 'el-input', prop: 'name', label: '姓名', rules: [{ required: true, message: '请输入姓名' }] },
            { is: 'el-input-number', prop: 'age', label: '年龄', rules: [{ required: true, message: '请输入有效年龄' }] },
            { is: 'el-input', props: { type: 'textarea' }, prop: 'address', label: '住址', span: 24 },
          ]
        },
      },
      filterModel: { name: '', age: '', gender: '', address: '' },
      formModel: { name: '', age: '', address: '' },
      tableModel: [
        { id: '0', name: '李饼', age: 32, address: '地址0', status: '正常' },
        { id: '1', name: '陈拾', age: 20, address: '地址1', status: '正常' },
        { id: '3', name: '王七', age: 26, address: '地址3', status: '正常' },
        { id: '4', name: '崔倍', age: 27, address: '地址4', status: '正常' },
        { id: '5', name: '孙豹', age: 38, address: '地址5', status: '正常' },
      ],
    }
  },
}
</script>

:::

6a3e9fa03a9e62888fd3096196dcc68e3e3bb90a/examples/views/docs/component/schema-page.md#">对接接口

本组件预置了增删改查逻辑,因此分别对应api-searchapi-newapi-editapi-getapi-delete五个基本接口。

::: snippet 接口格式为返回一个Promise对象的Function。其中,api-search的执行结果必须是[分页数据, 数据总数]的格式,api-get的执行结果必须与valur-form相对应,api-newapi-editapi-delete保持默认的Promise的resolve或reject逻辑即可,详情见示例。

<template>
  <eagle-schema-page
    :schema="schema"
    :value-filter.sync="filterModel"
    :value-form.sync="formModel"
    :api-search="searchAPI"
    :api-get="getAPI"
    :api-delete="deleteAPI"
    :api-new="newAPI"
    :api-edit="editAPI"
    size="small"
  >
    <template #table-cell-name="{ value, row, openDetail }">
      <el-link type="primary" @click="openDetail(row)">{{ value }}</el-link>
    </template>
  </eagle-schema-page>
</template>

<script>
export default {
  data() {
    return {
      schema: {
        auto: true,
        filter: {
          items: [
            { is: 'el-input', prop: 'name', label: '姓名' },
          ]
        },
        table: {
          items: [
            { prop: 'name', label: '姓名' },
            { prop: 'age', label: '年龄' },
            { prop: 'address', label: '地址' },
            { prop: 'status', label: '状态', render: (value, row, h) => h('el-tag', { props: { size: 'mini', type: 'info' } }, value) },
          ]
        },
        form: {
          props: { labelWidth: '70px', size: 'small', span: 12 },
          items: [
            { is: 'el-input', prop: 'name', label: '姓名', rules: [{ required: true, message: '请输入姓名' }] },
            { is: 'el-input-number', prop: 'age', label: '年龄', rules: [{ required: true, message: '请输入有效年龄' }] },
            { is: 'el-input', props: { type: 'textarea' }, prop: 'address', label: '住址', span: 24 },
          ]
        },
      },
      filterModel: { name: '', age: '', gender: '', address: '' },
      formModel: { name: '', age: '', address: '' },
    }
  },
  methods: {
    searchAPI(params) {
      console.log('search', params);
      return new Promise(resolve => {
        setTimeout(() => {
          const list = [
            { id: '0', name: '李饼', age: 32, address: '地址0', status: '正常' },
            { id: '1', name: '陈拾', age: 20, address: '地址1', status: '正常' },
            { id: '3', name: '王七', age: 26, address: '地址3', status: '正常' },
            { id: '4', name: '崔倍', age: 27, address: '地址4', status: '正常' },
            { id: '5', name: '孙豹', age: 38, address: '地址5', status: '正常' },
          ]
          resolve([list, 37]);
        }, 500);
      });
    },
    getAPI(row) {
      console.log('get', row);
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve({ ...row, name: `[${row.name}]` });
        }, 1500);
      });
    },
    newAPI(model) {
      console.log('new', model);
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve();
        }, 1500);
      });
    },
    editAPI(model) {
      console.log('edit', model);
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          reject();
        }, 1500);
      });
    },
    deleteAPI(selection) {
      console.log('delete', selection);
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve();
        }, 1500);
      });
    }
  }
}
</script>

:::

6a3e9fa03a9e62888fd3096196dcc68e3e3bb90a/examples/views/docs/component/schema-page.md#">详情接口

由于可能出现详情与表单不同的情况,因此本组件提供了value-detail属性和api-detail接口可独立维护详情页面,若详情表单项也不同,则可以在schema中配置detail来设置。

::: snippet 若没有详情绑定值属性和接口,则默认以表单的值为准。

<template>
  <eagle-schema-page
    :schema="schema"
    :value-filter.sync="filterModel"
    :value-form.sync="formModel"
    :value-detail.sync="detailModel"
    :api-search="searchAPI"
    :api-get="getAPI"
    :api-detail="detailAPI"
    :api-delete="deleteAPI"
    :api-new="newAPI"
    :api-edit="editAPI"
  >
    <template #table-cell-name="{ value, row, openDetail }">
      <el-link type="primary" @click="openDetail(row)">{{ value }}</el-link>
    </template>
    <template #detail-packages="{ value }">
      <el-tag v-for="item in value" size="mini" type="info" style="margin-right: 10px">{{ item }}</el-tag>
    </template>
  </eagle-schema-page>
</template>

<script>
export default {
  data() {
    return {
      schema: {
        auto: true,
        filter: {
          items: [
            { is: 'el-input', prop: 'name', label: '姓名' },
          ]
        },
        table: {
          items: [
            { prop: 'name', label: '姓名' },
            { prop: 'age', label: '年龄' },
            { prop: 'address', label: '地址' },
            { prop: 'status', label: '状态', render: (value, row, h) => h('el-tag', { props: { size: 'mini', type: 'info' } }, value) },
          ]
        },
        form: {
          props: { labelWidth: '70px', size: 'small', span: 12 },
          items: [
            { is: 'el-input', prop: 'name', label: '姓名', rules: [{ required: true, message: '请输入姓名' }] },
            { is: 'el-input-number', prop: 'age', label: '年龄', rules: [{ required: true, message: '请输入有效年龄' }] },
            { is: 'el-input', props: { type: 'textarea' }, prop: 'address', label: '住址', span: 24 },
          ]
        },
        detail: {
          props: { labelWidth: '70px', size: 'small', span: 12 },
          items: [
            { prop: 'name', label: '姓名' },
            { prop: 'age', label: '年龄' },
            { props: { type: 'textarea' }, prop: 'address', label: '住址' },
            { prop: 'packages', label: '包裹', span: 24 }
          ]
        }
      },
      filterModel: { name: '', age: '', gender: '', address: '' },
      formModel: { name: '', age: '', address: '' },
      detailModel: { name: '', age: '', address: '', packages: [] },
    }
  },
  methods: {
    searchAPI(params) {
      console.log('search', params);
      return new Promise(resolve => {
        setTimeout(() => {
          const list = [
            { id: '0', name: '李饼', age: 32, address: '地址0', status: '正常' },
            { id: '1', name: '陈拾', age: 20, address: '地址1', status: '正常' },
            { id: '3', name: '王七', age: 26, address: '地址3', status: '正常' },
            { id: '4', name: '崔倍', age: 27, address: '地址4', status: '正常' },
            { id: '5', name: '孙豹', age: 38, address: '地址5', status: '正常' },
          ]
          resolve([list, 37]);
        }, 500);
      });
    },
    getAPI(row) {
      console.log('get', row);
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve({ ...row, name: `[${row.name}]` });
        }, 1500);
      });
    },
    detailAPI(row) {
      console.log('detail', row);
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve({ ...row, packages: ['手机', '电脑'], address: '上海市青浦区华新镇纪鹤公路1988号' });
        }, 1500);
      });
    },
    newAPI(model) {
      console.log('new', model);
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve();
        }, 1500);
      });
    },
    editAPI(model) {
      console.log('edit', model);
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          reject();
        }, 1500);
      });
    },
    deleteAPI(selection) {
      console.log('delete', selection);
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve();
        }, 1500);
      });
    }
  }
}
</script>

:::

6a3e9fa03a9e62888fd3096196dcc68e3e3bb90a/examples/views/docs/component/schema-page.md#">自定义弹窗

除了本组件内置的neweditdetail三种弹出框模式之外,还可以通过任意插槽打开任意自定义弹出框。也支持重新定义原有的三种弹框,同时也需要重新自定义表单校验和提交等逻辑。

::: snippet 插槽提供openDialog打开弹出框方法,参数类型为(type: 弹出框类型, title: 弹出框标题, config: 弹出框配置),弹出框主体通过dialog-插槽定义。closeDialog为关闭弹出框。

<template>
  <eagle-schema-page :schema="schema" :value-table.sync="tableModel">
    <template #action-button="{ size, openDialog }">
      <el-button :size="size" @click="openDialog('bill', '账单', { width: '70%' })">账单</el-button>
    </template>
    <template #operation-button="{ openDialog, row }">
      <el-button type="text" @click="openDialog('load', `配置-${row.name}`, { width: '400px' })">配载</el-button>
    </template>
    <template #table-cell-name="{ value, row, openDetail }">
      <el-link type="primary" @click="openDetail(row)">{{ value }}</el-link>
    </template>
    <template #dialog-bill="{ closeDialog }">
      <eagle-schema-table v-model="billData" :schema="billSchema"></eagle-schema-table>
      <div style="text-align: center; margin-top: 20px">
        <el-button plain @click="closeDialog">关闭</el-button>
      </div>
    </template>
    <template #dialog-load="{ closeDialog }">
      <el-alert title="这里是一段自定义信息" type="error" show-icon style="margin-bottom: 20px"></el-alert>
      <eagle-schema-form v-model="loadModel" :schema="loadSchema"></eagle-schema-form>
      <el-button type="primary" @click="closeDialog">关闭弹出框</el-button>
    </template>
    <template #dialog-new="{ closeDialog }">
      <el-alert title="这里是自定义新增弹窗" type="success" show-icon style="margin-bottom: 20px"></el-alert>
      <el-button plain @click="closeDialog">关闭</el-button>
    </template>
    <template #dialog-edit="{ closeDialog }">
      <el-alert title="这里是自定义编辑弹窗" type="warning" show-icon style="margin-bottom: 20px"></el-alert>
      <el-button plain @click="closeDialog">关闭</el-button>
    </template>
    <template #dialog-detail="{ closeDialog }">
      <el-alert title="这里是自定义详情弹窗" type="info" show-icon style="margin-bottom: 20px"></el-alert>
      <el-button plain @click="closeDialog">关闭</el-button>
    </template>
  </eagle-schema-page>
</template>

<script>
export default {
  data() {
    return {
      schema: {
        filter: {
          items: [
            { is: 'el-input', prop: 'name', label: '姓名' },
          ]
        },
        table: {
          items: [
            { prop: 'name', label: '姓名' },
            { prop: 'age', label: '年龄' },
            { prop: 'address', label: '地址' },
            { prop: 'status', label: '状态', render: (value, row, h) => h('el-tag', { props: { size: 'mini', type: 'info' } }, value) },
          ]
        },
        form: {
          props: { labelWidth: '70px', size: 'small', span: 12 },
          items: [
            { is: 'el-input', prop: 'name', label: '姓名', rules: [{ required: true, message: '请输入姓名' }] },
            { is: 'el-input-number', prop: 'age', label: '年龄', rules: [{ required: true, message: '请输入有效年龄' }] },
            { is: 'el-input', props: { type: 'textarea' }, prop: 'address', label: '住址', span: 24 },
          ]
        },
        operation: { width: 120 }
      },
      tableModel: [
        { id: '0', name: '李饼', age: 32, address: '地址0', status: '正常' },
        { id: '1', name: '陈拾', age: 20, address: '地址1', status: '正常' },
        { id: '3', name: '王七', age: 26, address: '地址3', status: '正常' },
        { id: '4', name: '崔倍', age: 27, address: '地址4', status: '正常' },
        { id: '5', name: '孙豹', age: 38, address: '地址5', status: '正常' },
      ],
      loadModel: {
        name: '',
        count: 1,
        packages: []
      },
      loadSchema: {
        props: { 'label-width': '70px', size: 'small' },
        items: [
          { is: 'el-input', prop: 'name', label: '名称' },
          { is: 'el-input-number', prop: 'count', label: '数量' },
          {
            is: 'el-checkbox-group',
            prop: 'packages',
            label: '包裹',
            children: [
              { is: 'el-checkbox', props: { label: '零食' } },
              { is: 'el-checkbox', props: { label: '手机' } },
              { is: 'el-checkbox', props: { label: '电脑' } },
            ],
          },
        ]
      },
      billData: [
        { billno: 'B20210401000001', amount: '18750' },
        { billno: 'B20210401000002', amount: '637' },
      ],
      billSchema: {
        items: [
          { label: '单号', prop: 'billno' },
          { label: '金额', prop: 'amount' },
        ]
      }
    }
  },
}
</script>

:::

6a3e9fa03a9e62888fd3096196dcc68e3e3bb90a/examples/views/docs/component/schema-page.md#">弹窗类型

弹出框组件默认为el-dialog,使用自定义弹窗时,可以设置为el-drawer

::: snippet 通过openDialog的config参数配置is: 'el-drawer'即可改为抽屉式弹窗,dialog-xxx-footer可以设置抽屉固定的footer

<template>
  <eagle-schema-page :schema="schema" :value-table.sync="tableModel">
    <template #action-button="{ size, openDialog }">
      <el-button :size="size" @click="openDialog('bill', '账单', { is: 'el-drawer', width: '70%' })">账单</el-button>
    </template>
    <template #operation-button="{ openDialog, row }">
      <el-button type="text" @click="openDialog('load', `配置-${row.name}`, { is: 'el-drawer', width: '400px' })">配载</el-button>
    </template>
    <template #table-cell-name="{ value, row, openDetail }">
      <el-link type="primary" @click="openDetail(row)">{{ value }}</el-link>
    </template>
    <template #dialog-bill="{ closeDialog }">
      <div style="background: #f5f5f5; height: 90vh; display: flex; align-items: center; justify-content: center">一段很长的内容</div>
      <eagle-schema-table v-model="billData" :schema="billSchema"></eagle-schema-table>
    </template>
    <template #dialog-bill-footer="{ closeDialog }">
      <el-button plain @click="closeDialog">关闭</el-button>
    </template>
    <template #dialog-load="{ closeDialog }">
      <el-alert title="这里是一段自定义信息" type="error" show-icon style="margin-bottom: 20px"></el-alert>
      <eagle-schema-form v-model="loadModel" :schema="loadSchema"></eagle-schema-form>
      <el-button type="primary" @click="closeDialog">关闭弹出框</el-button>
    </template>
  </eagle-schema-page>
</template>

<script>
export default {
  data() {
    return {
      schema: {
        filter: {
          items: [
            { is: 'el-input', prop: 'name', label: '姓名' },
          ]
        },
        table: {
          items: [
            { prop: 'name', label: '姓名' },
            { prop: 'age', label: '年龄' },
            { prop: 'address', label: '地址' },
            { prop: 'status', label: '状态', render: (value, row, h) => h('el-tag', { props: { size: 'mini', type: 'info' } }, value) },
          ]
        },
        form: {
          props: { labelWidth: '70px', size: 'small', span: 12 },
          items: [
            { is: 'el-input', prop: 'name', label: '姓名', rules: [{ required: true, message: '请输入姓名' }] },
            { is: 'el-input-number', prop: 'age', label: '年龄', rules: [{ required: true, message: '请输入有效年龄' }] },
            { is: 'el-input', props: { type: 'textarea' }, prop: 'address', label: '住址', span: 24 },
          ]
        },
        operation: { width: 120 }
      },
      tableModel: [
        { id: '0', name: '李饼', age: 32, address: '地址0', status: '正常' },
        { id: '1', name: '陈拾', age: 20, address: '地址1', status: '正常' },
        { id: '3', name: '王七', age: 26, address: '地址3', status: '正常' },
        { id: '4', name: '崔倍', age: 27, address: '地址4', status: '正常' },
        { id: '5', name: '孙豹', age: 38, address: '地址5', status: '正常' },
      ],
      loadModel: {
        name: '',
        count: 1,
        packages: []
      },
      loadSchema: {
        props: { 'label-width': '70px', size: 'small' },
        items: [
          { is: 'el-input', prop: 'name', label: '名称' },
          { is: 'el-input-number', prop: 'count', label: '数量' },
          {
            is: 'el-checkbox-group',
            prop: 'packages',
            label: '包裹',
            children: [
              { is: 'el-checkbox', props: { label: '零食' } },
              { is: 'el-checkbox', props: { label: '手机' } },
              { is: 'el-checkbox', props: { label: '电脑' } },
            ],
          },
        ]
      },
      billData: [
        { billno: 'B20210401000001', amount: '18750' },
        { billno: 'B20210401000002', amount: '637' },
      ],
      billSchema: {
        items: [
          { label: '单号', prop: 'billno' },
          { label: '金额', prop: 'amount' },
        ]
      }
    }
  },
}
</script>

:::

6a3e9fa03a9e62888fd3096196dcc68e3e3bb90a/examples/views/docs/component/schema-page.md#">按钮权限

本组件不包含自定义业务逻辑,因此配置项不包含权限判断,如果需要按钮的权限判断,可以通过action插槽和operation插槽将渲染逻辑暴露在视图模板中,然后进行自定义判断。

::: snippet 本示例项目中没有v-permission等自定义权限指令,使用时根据实际情况在对应的按钮加上判断即可

<template>
  <eagle-schema-page :schema="schema" :value-filter.sync="filterModel" :value-table.sync="tableModel" :value-form.sync="formModel">
    <template #action="{ size, selection, openNew, onDeleteMultiple }">
      <el-button :size="size" type="primary" @click="openNew">新增</el-button>
      <el-button :size="size" plain :disabled="selection.length === 0" @click="onDeleteMultiple(selection)">删除</el-button>
    </template>
    <template #operation="{ openEdit, onDelete }">
      <el-table-column label="操作" width="90" align="center">
        <template #default="{ row, column, $index }">
          <div class="eagle-schema-page__table-operation">
            <el-button type="text" icon="el-icon-edit" title="编辑" @click="openEdit(row)"></el-button>
            <el-popconfirm confirm-button-text="确定" cancel-button-text="取消" title="确定删除吗?" placement="top" @confirm="onDelete([row])">
              <el-button slot="reference" type="text" icon="el-icon-delete" title="删除"></el-button>
            </el-popconfirm>
          </div>
        </template>
      </el-table-column>
    </template>
  </eagle-schema-page>
</template>

<script>
export default {
  data() {
    return {
      schema: {
        filter: {
          items: [
            { is: 'el-input', prop: 'name', label: '姓名' },
          ]
        },
        table: {
          items: [
            { prop: 'name', label: '姓名' },
            { prop: 'age', label: '年龄' },
            { prop: 'address', label: '地址' },
            { prop: 'status', label: '状态', render: (value, row, h) => h('el-tag', { props: { size: 'mini', type: 'info' } }, value) },
          ]
        },
        form: {
          props: { labelWidth: '70px', size: 'small', span: 12 },
          items: [
            { is: 'el-input', prop: 'name', label: '姓名', rules: [{ required: true, message: '请输入姓名' }] },
            { is: 'el-input-number', prop: 'age', label: '年龄', rules: [{ required: true, message: '请输入有效年龄' }] },
            { is: 'el-input', props: { type: 'textarea' }, prop: 'address', label: '住址', span: 24 },
          ]
        },
      },
      filterModel: { name: '', age: '', gender: '', address: '' },
      formModel: { name: '', age: '', address: '' },
      tableModel: [
        { id: '0', name: '李饼', age: 32, address: '地址0', status: '正常' },
        { id: '1', name: '陈拾', age: 20, address: '地址1', status: '正常' },
        { id: '3', name: '王七', age: 26, address: '地址3', status: '正常' },
        { id: '4', name: '崔倍', age: 27, address: '地址4', status: '正常' },
        { id: '5', name: '孙豹', age: 38, address: '地址5', status: '正常' },
      ],
    }
  },
}
</script>

:::

6a3e9fa03a9e62888fd3096196dcc68e3e3bb90a/examples/views/docs/component/schema-page.md#">静态表格

设置datagrid将组建转化为静态表格,即不包含增删改查API的可编辑表格,不分页。

::: snippet 基本参数和基础用法相同

<template>
  <eagle-schema-page :schema="schema" :value-table.sync="tableModel" :value-form.sync="formModel" datagrid :tips="false"></eagle-schema-page>
</template>

<script>
export default {
  data() {
    return {
      schema: {
        filter: false,
        table: {
          items: [
            { prop: 'name', label: '姓名' },
            { prop: 'age', label: '年龄' },
            { prop: 'address', label: '地址' },
            { prop: 'status', label: '状态', render: (value, row, h) => h('el-tag', { props: { size: 'mini', type: 'info' } }, value) },
          ]
        },
        form: {
          props: { labelWidth: '70px', size: 'small', span: 12 },
          items: [
            { is: 'el-input', prop: 'name', label: '姓名', rules: [{ required: true, message: '请输入姓名' }] },
            { is: 'el-input-number', prop: 'age', label: '年龄', rules: [{ required: true, message: '请输入有效年龄' }] },
            { is: 'el-input', props: { type: 'textarea' }, prop: 'address', label: '住址', span: 24 },
          ]
        },
      },
      formModel: { name: '', age: '', address: '' },
      tableModel: [
        { id: '0', name: '李饼', age: 32, address: '地址0', status: '正常' },
        { id: '1', name: '陈拾', age: 20, address: '地址1', status: '正常' },
        { id: '3', name: '王七', age: 26, address: '地址3', status: '正常' },
        { id: '4', name: '崔倍', age: 27, address: '地址4', status: '正常' },
        { id: '5', name: '孙豹', age: 38, address: '地址5', status: '正常' },
      ],
    }
  },
}
</script>

:::

API

Attribute 属性

参数|说明|类型|可选值|默认值 -|-|-|-|- schema | JSON Schema配置项列表 | Array | - | []

Schema 参数

参数|说明|类型|可选值|默认值 -|-|-|-|- filter | 搜索表单,false表示不显示,Object表示Schema | Object, Boolean | - | false action | 操作栏显示状态 | Boolean | - | true table | 表格,false表示不显示,Object表示Schema | Object, Boolean | - | false operation | 操作列,false表示不显示,Object表示操作栏配置 | Object, Boolean | - | {} pagination | 分页器,false表示不显示,Object表示分页器配置 | Object, Boolean | - | {} form | 表单,false表示不显示,Object表示Schema | Object, Boolean | - | false action | 表单 | Boolean | - | true selection | 可选择 | Boolean | - | true