先上效果圖:
本文包含了具名插槽、作用域插槽、jsx語法三種:
Render.vue(很重要,必須有):
<script>
export default {
name: "FreeRender",
functional: true,
props: {
scope:Object,
render: Function
},
render: (h, ctx) => {
console.log(222,ctx.props.render);// 通過打印會(huì)發(fā)現(xiàn)render函數(shù)會(huì)自動(dòng)用h函數(shù)進(jìn)行包裹
return ctx.props.render ? ctx.props.render( ctx.props.scope) : "";
}
};
</script>
Table.vue文章來源:http://www.zghlxwxcb.cn/news/detail-830787.html
<template>
<div>
<el-table :data="tableData" style="width: 100%"
:stripe="stripe" :border="border" :size="size"
v-loading="loading"
@selection-change="handleSelectionChange"
>
<!-- 是否支持復(fù)選 -->
<el-table-column v-if="isSelection" width="55" type="selection" />
<el-table-column
:prop="item.param"
:label="item.label"
v-for="(item, index) in tableColumns"
:key="index"
:sortable="item.sortable"
:width="item.width"
>
<template slot-scope="scope">
<div v-if="item.render2">
<Render
:scope='scope.row'
:render="item.render2"
>
</Render>
</div>
<slot v-else-if="item.slotName" :name="item.slotName" :row2="scope.row"></slot>
<span v-else>{{scope.row[item.param]}}</span>
</template>
</el-table-column>
<!-- 操作 -->
<el-table-column v-if="tableOperation.label" :label="tableOperation.label">
<template slot-scope="scope">
<slot :name="tableOperation.param" :scope="scope">
<el-button
size="small"
v-for="(item, index) in tableOperation.btnList"
:key="index"
@click="handleClick(scope.row, item.type)">
{{item.label}}
</el-button>
</slot>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import Render from "@/components/Render";
export default {
name: "Table",
props: {
tableColumns: {
type: Array,
required: true,
default: () => {
return []
}
},
tableData: {
type: Array,
required: true,
default: () => {
return []
}
},
tableOperation: {
type: Object,
default: () => {
return {}
}
},
stripe: {
type: Boolean,
default: true
},
border: {
type: Boolean,
default: true
},
size: {
type: String,
default: 'small'
},
loading: {
type: Boolean,
default: false
},
isSelection: {
type: Boolean,
default: false,
}
},
components:{
Render,
},
data() {
return {
h:'',
}
},
methods: {
handleClick(row, type) {
this.$emit('handleClick', row, type)
},
handleSelectionChange(val) {
this.$emit('handleSelectionChange', val)
}
}
使用Table組件文章來源地址http://www.zghlxwxcb.cn/news/detail-830787.html
//html
<Table
:tableData="tableData"
:isSelection="true"
:tableColumns="tableColumns"
:tableOperation="tableOperation"
@handleClick="handleClick"
@handleSelectionChange="handleSelectionChange"
>
<template #infoInput="scope">
<el-input v-model="scope.row2.info"></el-input>
</template>
</Table>
// data & methods
tableData: [
{
date: "2016-05-02",
name: "王小虎",
address: "上海市普陀區(qū)金沙江路 1518 弄",
age: "1",
progress:50,
info:'好好學(xué)習(xí)',
},
{
date: "2016-05-04",
name: "王小虎",
address: "上海市普陀區(qū)金沙江路 1517 弄",
age: "0",
progress:60,
info:'天天向上',
},
{
date: "2016-05-01",
name: "王小虎",
address: "上海市普陀區(qū)金沙江路 1519 弄",
age: "1",
progress:70,
info:'為人名服務(wù)',
},
{
date: "2016-05-03",
name: "王小虎",
address: "上海市普陀區(qū)金沙江路 1516 弄",
age: "1",
progress:80,
info:'為人名服務(wù)2',
},
],
tableColumns: [
{
param: "date",
label: "日期",
width: "100",
},
{
param: "name",
label: "姓名",
width: "100",
},
{
param: "address",
label: "地址",
},
{
param: "age",
label: "性別",
render2: (row) => {
return (
<el-radio-group v-model={row.age}>
<el-radio label={"0"}>男</el-radio>
<el-radio label={"1"}>女</el-radio>
</el-radio-group>
);
},
},
{
param:'progress',
label:'進(jìn)度',
render2:(row)=>{
return(
<el-progress percentage={row.progress}></el-progress>
)
}
},{
param:'info',
label:'信息',
slotName:'infoInput',
}
],
tableOperation: {
label: "操作",
btnList: [
{
label: "刪除",
type: "warning",
param: "del",
type: "del",
},
{
label: "新增",
type: "primary",
param: "add",
type: "add",
},
],
},
handleClick(val, type) {
console.log("val1", val);
console.log("type", type);
},
handleSelectionChange(val) {
console.log("val2", val);
},
到了這里,關(guān)于vue封裝el-table表格組件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!