创建一个通用的Table组件

<template> <div class="data-table"> <el-table :data="myTableData" border size="small" @selection-change="selectionChange"> <el-table-column v-if="type == 'selection'" type="selection" label="选择" width="55"> </el-table-column> <!-- 序号 --> <el-table-column v-if="type == 'index'" type="index" label="序号" width="55"> </el-table-column> <!-- 单元格 --> <el-table-column v-for="(item, index) in fieldData" :key="index" :label="item.label" :prop="item.field" :width="item.width" :sortable="item.sortable" :formatter="(row, column, cellValue, index) => formatter(row, column, cellValue, index, item)" /> <!-- 插槽 额外 操作按钮自己控制 --> <slot name="opts"></slot> </el-table> <el-pagination v-if="page" @current-change="pageChange" @size-change="sizeChange" :page-size="pageSize" :page-sizes="pageSizeList" background :layout="pageLayout" :total="myTotal"> </el-pagination> </div> </template> <script> export default{ components: {}, data(){ return { checkboxArr: [], radio: '', formObj: null, tableClassName: '', id: '', successFieldObj: {}, checkTrData: [], // 多选数据 myTableData: this.tableData, myTotal: this.total, // 总条数 myPageSize: this.pageSize, // ,每页条数 } }, props: { // 数据总条数 total: { default: 0, type: Number }, // 表格类型:带索引 选择框 type: { default: '', type: String }, // 字段集合 fieldData: { default: (() => []), type: Array }, // 表格数据集合 tableData: { default: (() => []), type: Array }, // 是否需要分页 page: { default: false, type: Boolean }, // 每页显示条数 pageSize: { default: 5, type: Number }, // 可切换每页条数集合 pageSizeList: { default: (() => [10, 20, 50, 100]), type: Array }, pageLayout: { default: 'sizes, prev, pager, next', type: String } }, mounted: function () { }, watch: { // 监控表格数据修改 从新渲染表格 tableData() { this.myTableData = this.tableData; }, // 监听页面数据总数修改 total() { this.myTotal = this.total; }, // 修改每页条数 pageSize() { this.myPageSize = this.pageSize; } }, methods: { selectionChange(choosetr) { this.checkTrData = choosetr; }, sizeChange(size) { this.$emit('sizeChange', size); }, getChooseData() { return this.checkTrData; }, //分页 pageChange(pageIndex){ this.$emit('pageChange',pageIndex); }, // 格式化处理数据内容 后面日期格式化换成第三方插件 // rowData: row, column, cellValue, index // fieldData 字段信息 formatter(row, column, cellValue, index, fieldData) { //console.log(fieldData.fieldType); if (fieldData.fieldType === 'date') { const date = new Date(Number(cellValue)); return `${date.getFullYear()}-${date.getMonth()+1}-${date.getDate()}`; } return cellValue; } } } </script> <style scoped=""> </style>

<template> <!-- 主机记录 --> <div> <Table :fieldData="fieldData" :tableData="tableData" :page="true" @pageChange="pageChange" @sizeChange="sizeChange" :total="total" > <el-table-column slot="opts" label="操作" width="100"> <template slot-scope="scope"> <el-button type="text" size="small">查看</el-button> </template> </el-table-column> </Table> </div> </template> <script> // 表格组件 import Table from 'component/table' export default{ components: { Table }, data(){ return { total: 0, //总记录数 currentPage:1, //初始页 pagesize:10, // 每页的数据 data:[], tableData: [], fieldData: [ { field: 'title', label: '主机名', width: '' }, { field: 'IP', label: 'IP地址' }, ] } }, props: {}, mounted () { this.$store.commit('updateBreadcrumb', [ { text: '首页', path: '' }, { text: '主机列表', path: '' }, ]); }, created() { this.gethosts(); }, methods: { getChooseData() { //查看选中数据 //console.log( this.$refs['testForm'].getChooseData() , '--getChooseDatar--'); }, pageChange(pageIndex) { console.log("触发分页事件"); console.log(pageIndex); this.currentPage=pageIndex; this.tableData=this.data.slice((this.currentPage-1)*this.pagesize,this.currentPage*this.pagesize);; }, sizeChange(size) { //触发每页显示的条数 console.log("触发了改变每页显示条数"); console.log(size); this.pagesize=size; this.tableData=this.data.slice((this.currentPage-1)*this.pagesize,this.currentPage*this.pagesize); }, gethosts() { return this.$http.getAllHosts({},{notify: false}) .then((data) => { //console.log(data); //console.log(this.pagesize); this.data=data; this.tableData=data.slice((this.currentPage-1)*this.pagesize,this.currentPage*this.pagesize); this.total=data.length; }); } } } </script> <style scoped=""> </style>
实现把列中的数字变成字符串

<el-table :data="myTableData" border size="small" @selection-change="selectionChange"> <el-table-column v-if="type == 'selection'" type="selection" label="选择" width="55"> </el-table-column> <!-- 序号 --> <el-table-column v-if="type == 'index'" type="index" label="序号" width="55"> </el-table-column> <!-- 单元格 --> <el-table-column v-html v-for="(item, index) in fieldData" :key="index" :label="item.label" :prop="item.field" :width="item.width" :sortable="item.sortable" :formatter="(row, column, cellValue, index) =>item.formatter(row, column, cellValue, index, item)" /> <!-- 插槽 额外 操作按钮自己控制 --> <slot name="opts"></slot> </el-table>

// 表格组件 import Table from 'component/table' export default{ components: { Table }, data(){ return { total: 0, //总记录数 currentPage:1, //初始页 pagesize:10, // 每页的数据 data:[], tableData: [], fieldData: [ { field: 'title', label: '主机名', width: '', formatter:function(row, column, cellValue, index, item) { return cellValue; } }, { field: 'IP', label: 'IP地址', formatter:function(row, column, cellValue, index, item) { return cellValue; } }, { field: 'status', label: '状态', formatter:function(row, column, cellValue, index, item) { if(cellValue==0) { return "<el-button type='success'>正常</el-button>"; } else if(cellValue==1) { return "<el-button type='info'>一般告警</el-button>"; } else if(cellValue==2) { return "<el-button type='warning'>告警</el-button>"; } else { return "<el-button type='danger'>异常</el-button>"; } }, }, ] } }
把列中的值转换成相应的html标签
1.不要把需要变成模板的列传递到fieldData集合中
2.在业务表的view中添加模板列即可

<template> <!-- 主机记录 --> <div> <Table :fieldData="fieldData" :tableData="tableData" :page="true" @pageChange="pageChange" @sizeChange="sizeChange" :total="total" > <el-table-column slot="opts" label="状态" prop="status"> <template slot-scope="scope"> <p v-if="scope.row.status=='1'"> <el-button type="success">成功</el-button> </p> <p v-else-if="scope.row.status=='2'"> <el-button type="success">成功</el-button> </p> <p v-else-if="scope.row.status=='3'"> 作废 </p> <p v-else-if="scope.row.status=='4'"> 停用 </p> </template> </el-table-column> <el-table-column slot="opts" label="操作" width="100"> <template slot-scope="scope"> <el-button type="text" size="small">查看</el-button> </template> </el-table-column> </Table> </div> </template>
实现通用分页排序删除过滤表格组件

<template> <div class="data-table"> <el-table :data="myTableData" :default-sort="mysort" border size="small" @selection-change="selectionChange" > <el-table-column v-if="type == 'selection'" type="selection" label="选择" width="55"> </el-table-column> <!-- 序号 --> <el-table-column v-if="type == 'index'" type="index" label="序号" width="55"> </el-table-column> <!-- 单元格 --> <el-table-column v-for="(item, index) in fieldData" :key="index" :label="item.label" :prop="item.field" :width="item.width" :sortable="item.sortable" :formatter="(row, column, cellValue, index) =>formatter(row, column, cellValue, index, item)" /> <!-- 插槽 额外 操作按钮自己控制 --> <slot name="opts"></slot> </el-table> <el-pagination v-if="page" @current-change="pageChange" @size-change="sizeChange" :page-size="pageSize" :page-sizes="pageSizeList" background :layout="pageLayout" :total="myTotal"> </el-pagination> </div> </template> <script> export default{ components: {}, data(){ return { checkboxArr: [], radio: '', formObj: null, tableClassName: '', id: '', successFieldObj: {}, checkTrData: [], // 多选数据multipleSelection myTableData: this.tableData, myTotal: this.total, // 总条数 myPageSize: this.pageSize, // ,每页条数 mysort:this.tableSort //传递的默认排序规则 } }, props: { // 数据总条数 total: { default: 0, type: Number }, // 表格类型:带索引 选择框 type: { default: '', type: String }, // 字段集合 fieldData: { default: (() => []), type: Array }, // 表格数据集合 tableData: { default: (() => []), type: Array }, tableSort: { default:(() => {}), type: Object }, // 是否需要分页 page: { default: false, type: Boolean }, // 每页显示条数 pageSize: { default: 5, type: Number }, // 可切换每页条数集合 pageSizeList: { default: (() => [10, 20, 50, 100]), type: Array }, pageLayout: { default: 'sizes, prev, pager, next', type: String } }, mounted: function () { }, watch: { // 监控表格数据修改 从新渲染表格 tableData() { this.myTableData = this.tableData; }, // 监听页面数据总数修改 total() { this.myTotal = this.total; }, // 修改每页条数 pageSize() { this.myPageSize = this.pageSize; } }, methods: { selectionChange(choosetr) { console.log(choosetr);//选中行的row对象 this.checkTrData=choosetr; }, sizeChange(size) { this.$emit('sizeChange', size); }, getChooseData() { return this.checkTrData; }, //分页 pageChange(pageIndex){ this.$emit('pageChange',pageIndex); }, // 格式化处理数据内容 后面日期格式化换成第三方插件 // rowData: row, column, cellValue, index // fieldData 字段信息 formatter(row, column, cellValue, index, fieldData) { //console.log("formatter"); if (fieldData.fieldType === 'date') { const date = new Date(Number(cellValue)); return `${date.getFullYear()}-${date.getMonth()+1}-${date.getDate()}`; } return cellValue; } } } </script> <style scoped=""> </style>

<template> <!-- 主机记录 --> <div> <el-button type="danger" @click="batchdelete">批量删除</el-button> <el-button type="info" @click="addhost">添加</el-button> <Table ref="hoststable" :fieldData="fieldData" :tableData="tableData" :page="true" @pageChange="pageChange" @sizeChange="sizeChange" :total="total" type="selection" :tableSort="tablSort" > <el-table-column slot="opts" label="状态" prop="status" :filters="[{ text: '成功', value: '1' }, { text: '告警', value: '2' }]" :filter-method="filterTag"> <template slot-scope="scope"> <p v-if="scope.row.status=='1'"> <el-button type="success">成功</el-button> </p> <p v-else-if="scope.row.status=='2'"> <el-button type="info">告警</el-button> </p> <p v-else-if="scope.row.status=='3'"> <el-button type="warning">严重告警</el-button> </p> <p v-else-if="scope.row.status=='4'"> <el-button type="danger">异常</el-button> </p> </template> </el-table-column> <el-table-column slot="opts" label="状态2" prop="status"> <template slot-scope="scope"> <el-tag :type="scope.row.status === 2 ? 'primary' : 'success'" disable-transitions>{{scope.row.status}}</el-tag> </template> </el-table-column> <el-table-column slot="opts" label="功能操作" width="150"> <template slot-scope="scope"> <el-button type="text" size="small" @click="handleEdit(scope.$index, scope.row)">编辑</el-button> <el-button type="text" size="small">操作日志</el-button> <el-button type="text" size="small">删除</el-button> </template> </el-table-column> </Table> </div> </template> <script> // 表格组件 import Table from 'component/table' export default{ components: { Table }, data(){ return { total: 0, //总记录数 currentPage:1, //初始页 pagesize:10, // 每页的数据 data:[], tablSort:{prop:'id', order:'descending'},//默认排序规则 tableData: [], fieldData: [ { field: 'id', label: '编号' }, { field: 'title', label: '主机名', sortable:true //设置可以按这个字段排序 }, { field: 'IP', label: 'IP地址', sortable:true } ] } }, props: {}, mounted () { this.$store.commit('updateBreadcrumb', [ { text: '首页', path: '' }, { text: '资产管理', path: '' }, { text: '主机列表', path: '' } ]); }, created() { this.gethosts(); }, methods: { getChooseData() { //查看选中数据 console.log(this.$refs['hoststable']); console.log(this.$refs['hoststable'].getChooseData()); const rows=this.$refs['hoststable'].getChooseData(); return rows; // if (rows.length>0) // { // rows.forEach(row => { // console.log(row.IP); // }); // } // else // { // console.log("没有选中任何行"); // } }, batchdelete() { const rows=this.getChooseData(); if (rows.length>0) { rows.forEach(row => { console.log(row.IP); }); this.$message({ type: 'sucess', message: "批量删除成功" }); } else { this.$message({ type: 'error', message: "没有选中任何行" }); } }, pageChange(pageIndex) { console.log("触发分页事件"); console.log(pageIndex); this.currentPage=pageIndex; this.tableData=this.data.slice((this.currentPage-1)*this.pagesize,this.currentPage*this.pagesize);; }, sizeChange(size) { //触发每页显示的条数 console.log("触发了改变每页显示条数"); console.log(size); this.pagesize=size; this.tableData=this.data.slice((this.currentPage-1)*this.pagesize,this.currentPage*this.pagesize); }, gethosts() { return this.$http.getAllHosts({},{notify: false}) .then((data) => { //console.log(data); //console.log(this.pagesize); this.data=data; this.tableData=data.slice((this.currentPage-1)*this.pagesize,this.currentPage*this.pagesize); this.total=data.length; }); }, handleEdit(index, row) { console.log(index, row); this.$message({ type: 'success', message: row.id }); }, handleDelete(index, row) { console.log(index, row); }, filterTag(value,row,column) { const property = column['property']; console.log("....过滤开始....."); console.log(value); console.log(row); console.log(column); console.log(".....过滤结束...."); return row.status === value; }, addhost() { this.$router.push('/exec'); //http://127.0.0.1:9000/#/exec //this.$router.push('exec');//http://127.0.0.1:9000/#/host/exec } } } </script> <style scoped=""> </style>
添加一个路由跳转

addhost() { this.$router.push('add'); //http://127.0.0.1:9000/#/host/add //this.$router.push('/add');//http://127.0.0.1:9000/#/add }

import Vue from 'vue'; import Router from 'vue-router'; import Hosts from './index' import HostAdd from './hostAdd' Vue.use(Router); export default [ { path: '/host/list', name: 'hosts', component: Hosts }, { path: '/host/add', name: 'hostAdd', component: HostAdd } ];

<template> <!-- 添加主机记录 --> <div> <el-button type="danger">进入添加主机页面</el-button> </div> </template> <script> export default{ components: { }, data(){ return {} }, props: {}, mounted () { this.$store.commit('updateBreadcrumb', [ { text: '首页', path: '' }, { text: '资产管理', path: '/host/list' }, { text: '添加主机', path: '' } ]); }, created() { }, methods: { } } </script> <style scoped=""> </style>
vue传递属性的两种方式
1.<el-dialog :custom-class="mydailog">
必须在data里面设置相关值
data() {
return {
formLabelWidth:"120px",
mydailog:"mydailog"
}
}
2.<el-dialog custom-class="mydailog"> 不需要在data对象中设置任何键值对
<style> 不能写成 <style scoped> 否则不会生效
.mydailog
{
color:red;
}
</style>
<style>
.mydailog
{
color:red;
}
</style>
vue组件实现自定义css样式

引入custom-class属性 <el-dialog title="添加分组" :visible.sync="centerDialogVisible" width="30%" center custom-class="mydailog"> <el-form> <el-form-item label="分组名称" :label-width="formLabelWidth"> <el-input v-model="input" autocomplete="off"></el-input> </el-form-item> </el-form> <span slot="footer" class="dialog-footer"> <el-button @click="centerDialogVisible =false">取 消</el-button> <el-button type="primary" @click="centerDialogVisible = false">确 定</el-button> </span> </el-dialog>

style标签一定不能加scope属性 否则不会生效 <style> .mydailog { text-align:center; background:red; } </style>
vue实现table等待远程数据加载

<bee-table :data="logList" :column-config="LOG_TABLE_COLUMN" :pageIndex="currentPage1" :pageSize="pageSize" @size-change="handleSizeChange" @current-change="handleCurrentChange" @sort-change="handleSortChange" v-loading="tbflag" :total="total"> <template slot="operation" slot-scope="{scope}"> <el-tooltip class="item" effect="dark" :content="scope.row.jylsh" placement="top-start"> <a @click="showDetail(scope.row.jylsh)"> {{scope.row.jylsh}} </a> </el-tooltip> </template> </bee-table> data(){ return { // 当前页 currentPage1: 1, // 每页条数 pageSize: 10, // 总条数 total: 0, // 主机列表数据 tableData: [], tbflag:false };

getHostMonitorView() { Promise.all([ this.getHostCpuView() ]).then(() => { this.loading = false; }); }, getHostlogs(){ this.tbflag=true; return this.$http.getHostLogs({ "appname":this.appname, "startTime":this.startTtime, "endTime":this.endTime, "hostname":this.selectRowHostName, "pageIndex":this.currentPage1, "pageSize":this.pageSize, "sortColumn":this.sortColumn, "sortType":this.sortType },{notify:true}) .then((data) => { this.logList=data.list; this.total=data.total; }).finally(()=>{ this.tbflag=false; }); }