一、基本概念
Vue动态渲染组件是无需编写前端代码的自定义页面展示方案,支持三种加载方式:
- 远程加载:从API获取组件
- 本地文件:从文件加载组件
- 模板字符串:直接编写模板
二、页面级渲染
Builder::vue() - 远程加载
public function customPage()
{
return Builder::vue('/api/component/remote', ['param' => 'value'], ['height' => 400]);
}
Builder::view() - 本地文件
public function customPage()
{
return Builder::view('app/admin/view/custom/page', ['userId' => 1]);
}
// 加载:plugin/{插件名}/app/admin/view/custom/page.vue
Builder::display() - 自动匹配
// OrderController::statusPage()
public function statusPage()
{
return Builder::display();
}
// 自动加载:plugin/{插件名}/app/admin/view/order/status_page.vue
三、表格列Vue组件
addColumnVueRender - 模板渲染
Builder::crud(function($builder) {
$template = <<<'VUE'
<template>
<el-tag :type="statusMap[props.row.status]">{{ props.row.status_text }}</el-tag>
</template>
<script setup>
const props = defineProps(['row', 'index', 'column']);
const statusMap = { 1: 'success', 0: 'danger' };
</script>
VUE;
$builder->addColumnVueRender('status', '状态', $template, ['width' => 100]);
});
addColumnVue - 本地文件
Builder::crud(function($builder) {
$path = base_path('plugin/xbCode/public/vue/rating.vue');
$builder->addColumnVue('rating', '评分', $path, ['width' => 150]);
});
addColumnVueRemote - 远程加载
Builder::crud(function($builder) {
$builder->addColumnVueRemote('actions', '操作', '/api/vue/actions', [
'width' => 200,
'fixed' => 'right'
]);
});
四、表单Vue组件
addRowVueRender - 模板渲染
Builder::form(function($builder) {
$template = <<<'VUE'
<template>
<el-input v-model="localValue" @input="emit('change', localValue)" />
</template>
<script setup>
import { ref } from 'vue';
const props = defineProps(['value']);
const emit = defineEmits(['change']);
const localValue = ref(props.value);
</script>
VUE;
$builder->addRowVueRender('content', '内容', '', $template);
});
addRowVue - 本地文件
Builder::form(function($builder) {
$path = base_path('plugin/xbCode/public/vue/upload.vue');
$builder->addRowVue('files', '文件', '', $path);
});
五、Props数据结构
// 表格列组件
const props = defineProps({
row: Object, // 当前行数据
index: Number, // 行索引
column: Object // 列配置
});
// 表单组件
const props = defineProps({
value: [String, Number, Array, Object], // 字段值
formData: Object, // 表单数据
field: String // 字段名
});
六、事件交互
<script setup>
const emit = defineEmits(['change', 'refresh']);
// 更新值
const handleChange = (val) => emit('change', val);
// 刷新数据
const handleRefresh = () => emit('refresh');
</script>
七、参数对比
| 方法 | 参数 | 说明 |
|---|
| addColumnVueRender | name, label, template, option | 字段名、标题、模板、配置 |
| addColumnVue | name, label, path, option | 字段名、标题、文件路径、配置 |
| addColumnVueRemote | name, label, url, option | 字段名、标题、远程URL、配置 |
| addRowVueRender | field, title, value, template, option | 字段名、标题、值、模板、配置 |
| addRowVue | field, title, value, path, option | 字段名、标题、值、文件路径、配置 |
八、组件类型
| 类型 | 使用场景 |
|---|
| XbRender | 表格列直接渲染 |
| XbRemote | 表格列远程加载 |
| XbFormRender | 表单字段渲染 |
| XbFormRemote | 表单字段远程加载 |
九、推荐方案
| 方法 | 推荐指数 | 适用场景 |
|---|
| addColumnVue | ★★★★★ | 复杂逻辑,需IDE支持 |
| addColumnVueRender | ★★★★☆ | 简单逻辑,快速开发 |
| addColumnVueRemote | ★★★☆☆ | 动态组件,权限控制 |
| Builder::view() | ★★★★★ | 独立页面,易维护 |
| Builder::display() | ★★★★★ | 自动匹配,约定优于配置 |
核心要点:所有Vue组件通过后端PHP定义,前后端完全分离,支持Vue 3 Composition API,优先使用本地文件方式以获得更好的性能和IDE支持。