分享一款自己写的table组件  用起来还算简单好用   (先介绍使用方法(ts版本的))

引入组件不多说

import jTable from '../comp/comp/table/table.vue';//table
@Component({
components: {
jTable,
},
})

页面使用

 <j-table ref = "jtable"  :tableOpt = "tableOpt"></j-table>

重点!!!!

表格的配置

tableOpt:object = {
/**
* @desc 表格数据来源请求(ajax地址)
*/
getUrl:function(){
return "/api/gettable"
},
/**
* @description 页码配置
* @example
* index : number 开始页码
* pageSize : number 每页多少条
* indexKey : string 后台接口接受开始页码的key名
* pageSizeKey : string 后台接口接受每页多少条的key名
*/
pageOption:{
index:5 ,
pageSize:1,
indexKey:"index",
pageSizeKey:"pageSize"
},
/**
* @description 数据处理函数 用于处理后台返回的数据 需要返回一个json
* data : array 包含一个json的数组,数据源
* index : number 当前页码
* total : number 总条数码
* totalPage : number 总页码数
*/
dataHandle(data:any){
return {
data:data.rows,
index:data.index,
total:data.total,
totalPage:data.totalPage,
}
},
/**
* @description 表格中每一列的名字和需要取key值
*/
titleMap:[
{
name:"名字",
key:"name",
},
{
name:"年龄",
key:"age"
},
{
name:"手机号",
key:"phone"
},
{
name:"年份",
key:"year",
},
{
name:"月份",
key:"month",
},
{
name:"月份",
key:"month",
},
{
name:"日",
key:"day",
},
{
name:"t",
key:"t",
},
{
name:"z",
key:"z",
}
],
/**
* @description 表格按钮
* val : string 按钮文字
* callback : function 按钮回掉函数(包含整行数据)
* type : 按钮的类型 详情看button组件
* threed 按钮是否是3d的
* text 按钮是否是文字形的
*/
actions:[
{
val:"操作1",
callback:this.ccc,
type:"primary",
threed : false,
text:false,
},
{
val:"操作2",
callback:this.ddd,
type:"primary",
threed : true,
text:false,
},
{
val:"操作3",
callback:this.ddd,
type:"warning",
threed : true,
text:true,
}
] }

就是这么简单  不过需要引入我的button组件   稍后补充下button组件的使用 感觉秒杀element使用

接下来上table代码

<template>
<div>
<table class = "j-table-box" cellspacing="0" cellpadding="0">
<table-header :titleMap = "state.titleMap" :actions = "state.actions"></table-header>
<table-body :data = "state.tableRows" :titleMap = "state.titleMap" :actions = "state.actions"></table-body>
</table>
<table-page :page = "state.tableInfo" :pkey = "$data.__key"></table-page>
</div>
</template>
<script lang="ts">
/**
* tableoptions interface
*/
interface tableOpt {
getUrl:Function;
pageOption:{
indexKey:string;
index:number;
pageSizeKey:string;
pageSize:number;
};
dataHandle:Function,
titleMap:number[],
actions:number[], }
/**
* tableArr interface
*/
interface tableArr {
data:number[],
total:number,
index:number
totalPage:number,
} import { Vue, Component,Prop, Provide,} from 'vue-property-decorator';
import tableHeader from "./tableHeader.vue";
import tableBody from "./tableBody.vue";
import tablePage from "./tablePage.vue";
import Fetch from "../../tool/fetch";
import Key from "../../tool/compConfig" function settableData(data:tableArr,that: any):void{
that.state.tableRows = data.data;
that.state.tableInfo.total = data.total;
that.state.tableInfo.totalPage = data.totalPage;
that.state.tableInfo.index = data.index;
}
@Component({
components:{
tableHeader,
tableBody,
tablePage
}, }) export default class jTable extends Vue{
@Prop() tableOpt !:tableOpt;
state = {
tableInfo : {
pageSize:this.tableOpt.pageOption.pageSize,
index:this.tableOpt.pageOption.index,
total:0,
totalPage:0,
},
actions:this.tableOpt.actions ? this.tableOpt.actions : [],
tableRows : [],
titleMap:this.tableOpt.titleMap,
}
__key :number = Key.getKey(); mounted(){
var _this = this;
this.$_event.$on(this.$data.__key+"TABLEEVENT",function(tag:any,...other:any[]):void{
if(!tag){
return ;
}
if(tag == "prePage"){
_this.renderTable(other[0]);
}
if(tag == "nextPage"){
_this.renderTable(other[0]);
}
if(tag == "appointPage"){
_this.renderTable(other[0]);
}
})
this.renderTable();
}
beforeDestroy(){
this.$_event.$off("TABLEEVENT")
}
/**
* @params {number} index 获取的页码
*/
renderTable(index?:number):void{
if(!index){
index = this.state.tableInfo.index
}
if(this.tableOpt.getUrl()){ Fetch.getFetch(this.tableOpt.getUrl(),{
[this.tableOpt.pageOption.indexKey]:index,
[this.tableOpt.pageOption.pageSizeKey]:this.state.tableInfo.pageSize
}).then((data:any) => {
let array = this.tableOpt.dataHandle(data);
settableData(array,this);
console.log(this,111);
})
.catch(error => {
console.log(error,2222);
})
}
}
/**
* @description 获取当前页数
*/
getCurrentPage(){
return this.state.tableInfo.index
}
/**
* 获取当前页数据
*/
getCurrentPageData(){
return this.state.tableRows
} }
</script>
<style lang="scss">
.j-table-box{
width:100%;
} </style>
<template>
<tbody class = "j-table-body">
<tr v-for = "(row,rowKey) in data" :key = "rowKey">
<td v-if = "actions.length > 0">
<j-button v-for = "(config,index) in actions"
:key = "index"
inline
:type = "config.type?config.type:'default'"
:threed = "config.threed ? config.threed:false"
:text = "config.text ? config.text:false"
@click = "config.callback ? config.callback(row) : ''">
{{config.val ? config.val : '操作'}} </j-Button>
</td>
<td v-for = "(title,titleKey) in titleMap" :key = "titleKey">
{{ row[title.key] }}
</td>
</tr> </tbody>
</template> <script lang = "ts">
import { Vue, Component,Prop, Provide,} from 'vue-property-decorator';
import jButton from "../button/button.vue";
@Component({
components:{
jButton
}
})
export default class jTableBody extends Vue{
@Prop({default:[]}) data ?:number[];
@Prop({default:[]}) titleMap ?:number[];
@Prop({default:[]}) actions ?:number[];
}
</script>
<style scoped>
.j-table-body tr td {
border:1px solid #aeaeae;
text-align: center;
}
</style>
<template>
<thead class = "j-table-header">
<tr>
<th v-if = "actions.length > 0">操作</th>
<th v-for = "(title,titleKey) in titleMap" :key = "titleKey">
{{ title.name }}
</th> </tr>
</thead>
</template> <script lang = "ts">
import { Vue, Component,Prop, Provide,} from 'vue-property-decorator';
@Component({ })
export default class jTableHeader extends Vue{
@Prop({default:[]}) titleMap ?: number[];
@Prop({default:[],type:Array}) actions ?:number[];
}
</script> <style scoped> .j-table-header tr th {
border:1px solid #aeaeae;
text-align: center;
}
</style>
<template>
<div class = "j-table-page">
<ul class = "page-box">
<template v-if = "page.totalPage<=8"> <li class="page-btn"
v-for = "(index,key) in page.totalPage"
:class = "parseInt(page.index) == parseInt(index)?'current':'normal'"
:key = "key"
@click = "getPage(index)">
{{ index }} </li>
</template>
<template v-if = "page.totalPage > 8">
<li class="page-btn"
v-for = "(index,key) in 2"
:class = "parseInt(page.index) == parseInt(index)?'current':'normal'"
:key = "'table_footer_start' + key"
@click = "getPage(index)">
{{ parseInt(index) }}
</li> <li class = "page-btn-ellipsis"
v-show = 'page.index > 3'
v-hover = "'<'"
@click = "prePages(page.index-3)"> ... </li> <li class="page-btn normal"
v-if = "parseInt(page.index)-1>3 && parseInt(page.index)-1<= page.totalPage-2"
@click = "getPage(page.index-1)">
{{
page.index-1
}}
</li>
<li class="page-btn current"
v-if = "parseInt(page.index)>2 && parseInt(page.index)<= page.totalPage-2"
@click = "getPage(page.index)">
{{
page.index
}}
</li> <li class="page-btn normal"
v-if = "parseInt(page.index)+1 <= page.totalPage-2 && parseInt(page.index)+1 > 2"
@click = "getPage(page.index+1)">
{{
page.index+1
}}
</li> <li class = "page-btn-ellipsis"
v-show = 'parseInt(page.totalPage -3) > parseInt(page.index)'
v-hover = "'>'"
@click = "nextPages(page.index+3)"> ... </li> <li class="page-btn"
v-for = "(index,key) in [1,0]"
:class = "parseInt(page.totalPage) - parseInt(index) == page.index?'current':'normal'"
:key = "'table_footer_last' + key"
@click = "getPage(page.totalPage - index)">
{{ parseInt(page.totalPage) - parseInt(index) }}
</li>
</template> </ul>
</div>
</template> <script lang = "ts"> import { Vue, Component,Prop} from 'vue-property-decorator';
@Component({ })
export default class jTablePage extends Vue{
@Prop({default:[]}) page?:number[];
@Prop({}) pkey?:number[]; myThis:any = this;
nextPages(page:number):void{
this.$_event.$emit(this.pkey + "TABLEEVENT","nextPage",page);
}
prePages(page:number):void{
this.$_event.$emit(this.pkey + "TABLEEVENT","prePage",page);
}
getPage(page:number):void{
this.$_event.$emit(this.pkey + "TABLEEVENT","appointPage",page);
}
}
</script> <style scoped>
.j-table-page{
width:100%;
text-align: center;
padding-top:10px;
}
.j-table-page .page-box{
width:50%;
text-align:center;
margin:0 auto;
}
.j-table-page .page-box .page-btn-ellipsis{
display:inline-block;
list-style: none;
margin-left: 10px;
margin-right: 10px;
vertical-align: top;
cursor:pointer;
}
.j-table-page .page-box .page-btn{
width:30px;
height:30px;
background:#efefef;
box-shadow: 0px 0px 3px #aeaeae;
border-radius:5px;
display:inline-block;
list-style: none;
line-height: 30px;
margin-left:5px;
}
.j-table-page .page-box .page-btn:hover{
background:#e5e5e5;
cursor:pointer;
}
.page-btn.current{
background:rgb(141, 141, 240)!important;
color:#fff;
}
</style>
<template>
<div :class = "{'j__box__inline':inline}">
<button class = "j__btn" :class = "[
type ? 'j__button__'+type : 'j__button__default',
{
'j__button__text':text,
'j__button__circle':circle,
'j__button__3D':threed
}, ]" v-on="$listeners">
<slot/>
</button>
</div>
</template> <script lang="ts">
import { Vue,Component,Prop,Provide } from "vue-property-decorator";
@Component({})
export default class jButton extends Vue {
@Prop() type ?:string;
@Prop({default:false,type:Boolean}) inline ?: boolean;
@Prop({default:false,type:Boolean}) text ?: boolean;
@Prop({default:false,type:Boolean}) circle ?: boolean;
@Prop({default:false,type:Boolean}) threed ?: boolean; }
</script> <style scoped>
.j__box__inline{
display:inline;
margin-left:5px;
margin-right:5px;
}
.j__btn {
cursor: pointer; /* 鼠标移入按钮范围时出现手势 */
outline: none; /* 不显示轮廓线 */
font-size: 12px; /* 字体大小 */
border:1px solid #efefef;
box-sizing:border-box;
padding:5px 10px;
border-radius: 3px;
}
.j__button__3D{
transition-duration: .3s;
margin-top:10px;
margin-bottom:10px;
}
.j__button__default {
background:#fff;
color:#333;
}
.j__button__default:hover {
background:#efefef;
color:#444;
} .j__button__default.j__button__3D{
border:none!important;
-webkit-box-shadow: 0 7px 0 #dbe5ec, 0 8px 3px rgba(0, 0, 0, 0.3);
box-shadow: 0 7px 0 #dbe5ec, 0 8px 3px rgba(0, 0, 0, 0.3);
}
.j__button__default.j__button__3D:active{
transform: translate(0,5px);
-webkit-box-shadow: 0 0 0 #dbe5ec, 0 0 0 rgba(0, 0, 0, 0.3);
box-shadow: 0 0 0 #dbe5ec, 0 0 0 rgba(0, 0, 0, 0.3);
}
.j__button__text.j__button__default:hover{
color:#999!important;
}
.j__button__text.j__button__3D.j__button__default{
border:none!important;
-webkit-box-shadow: 0 0 0 #7b7d85, 0 0 0 rgba(0, 0, 0, 0.3);
box-shadow: 0 0 0 #7b7d85, 0 0 0 rgba(0, 0, 0, 0.3);
}
.j__button__text.j__button__3D.j__button__default:hover{
border:none!important;
-webkit-box-shadow: 0 0 0 #7b7d85, 0 0 0 rgba(0, 0, 0, 0.3);
box-shadow: 0 0 0 #7b7d85, 0 0 0 rgba(0, 0, 0, 0.3);
}
.j__button__text.j__button__3D.j__button__default:active{
transform: translate(0)!important;
border:none!important;
-webkit-box-shadow: 0 0 0 #7b7d85, 0 0 0 rgba(0, 0, 0, 0.3);
box-shadow: 0 0 0 #7b7d85, 0 0 0 rgba(0, 0, 0, 0.3);
} .j__button__primary {
background:#069af4;
color:#fff;
}
.j__button__primary:hover {
background:#47b0f7;
color:#fff;
}
.j__button__primary.j__button__3D{
border:none!important;
-webkit-box-shadow: 0 7px 0 #0880d7, 0 8px 3px rgba(0, 0, 0, 0.3);
box-shadow: 0 7px 0 #0880d7, 0 8px 3px rgba(0, 0, 0, 0.3);
}
.j__button__text.j__button__primary:hover{
color:#069af4!important;
}
.j__button__text.j__button__3D.j__button__primary{
transform: translate(0)!important;
border:none!important;
-webkit-box-shadow: 0 0 0 #7b7d85, 0 0 0 rgba(0, 0, 0, 0.3);
box-shadow: 0 0 0 #7b7d85, 0 0 0 rgba(0, 0, 0, 0.3);
} .j__button__primary.j__button__3D:hover{
background:#1194e6;
}
.j__button__primary.j__button__3D:active{
transform: translate(0,5px);
-webkit-box-shadow: 0 0 0 #0880d7, 0 0 0 rgba(0, 0, 0, 0.3);
box-shadow: 0 0 0 #0880d7, 0 0 0 rgba(0, 0, 0, 0.3);
} .j__button__success {
background:#a4de47;
color:#fff;
}
.j__button__success:hover {
background:#b8e56c;
color:#fff;
} .j__button__success.j__button__3D{
border:none!important;
-webkit-box-shadow: 0 7px 0 #84b91f, 0 8px 3px rgba(0, 0, 0, 0.3);
box-shadow: 0 7px 0 #84b91f, 0 8px 3px rgba(0, 0, 0, 0.3);
}
.j__button__success.j__button__3D:hover{
background:rgb(146, 204, 53);
}
.j__button__success.j__button__3D:active{ transform: translate(0,5px);
-webkit-box-shadow: 0 0 0 #84b91f, 0 0 0 rgba(0, 0, 0, 0.3);
box-shadow: 0 0 0 #84b91f, 0 0 0 rgba(0, 0, 0, 0.3);
}
.j__button__text.j__button__success:hover{
color:#a4de47!important;
}
.j__button__text.j__button__3D.j__button__success{
transform: translate(0)!important;
border:none!important;
-webkit-box-shadow: 0 0 0 #7b7d85, 0 0 0 rgba(0, 0, 0, 0.3);
box-shadow: 0 0 0 #7b7d85, 0 0 0 rgba(0, 0, 0, 0.3);
} .j__button__warning {
background:#ffae2d;
color:#fff;
} .j__button__warning:hover {
background:#ffc056;
color:#fff;
}
.j__button__warning.j__button__3D{
border:none!important;
-webkit-box-shadow: 0 7px 0 #e59501, 0 8px 3px rgba(0, 0, 0, 0.3);
box-shadow: 0 7px 0 #e59501, 0 8px 3px rgba(0, 0, 0, 0.3);
}
.j__button__warning.j__button__3D:active{
transform: translate(0,5px);
-webkit-box-shadow: 0 0 0 #e59501, 0 0 0 rgba(0, 0, 0, 0.3);
box-shadow: 0 0 0 #e59501, 0 0 0 rgba(0, 0, 0, 0.3);
}
.j__button__warning.j__button__3D:hover{
background:#f8a621;
}
.j__button__text.j__button__warning:hover{
color:#ffae2d!important;
}
.j__button__text.j__button__3D.j__button__warning{
transform: translate(0)!important;
border:none!important;
-webkit-box-shadow: 0 0 0 #7b7d85, 0 0 0 rgba(0, 0, 0, 0.3);
box-shadow: 0 0 0 #7b7d85, 0 0 0 rgba(0, 0, 0, 0.3);
} .j__button__danger {
background:#ff4356;
color:#fff;
}
.j__button__danger:hover {
background:#ff7680;
color:#fff;
}
.j__button__danger.j__button__3D{
border:none!important;
-webkit-box-shadow: 0 7px 0 #ff1022, 0 8px 3px rgba(0, 0, 0, 0.3);
box-shadow: 0 7px 0 #ff1022, 0 8px 3px rgba(0, 0, 0, 0.3);
}
.j__button__danger.j__button__3D:active{
transform: translate(0,5px);
-webkit-box-shadow: 0 0 0 #ff1022, 0 0 0 rgba(0, 0, 0, 0.3);
box-shadow: 0 0 0 #ff1022, 0 0 0 rgba(0, 0, 0, 0.3);
}
.j__button__danger.j__button__3D:hover{
background:#ea3c4d;
}
.j__button__text.j__button__danger:hover{
color:#ff4356!important;
}
.j__button__text.j__button__3D.j__button__danger{
border:none!important;
transform: translate(0)!important;
-webkit-box-shadow: 0 0 0 #7b7d85, 0 0 0 rgba(0, 0, 0, 0.3);
box-shadow: 0 0 0 #7b7d85, 0 0 0 rgba(0, 0, 0, 0.3);
} .j__button__info {
background:#909399;
color:#fff;
}
.j__button__info:hover {
background:#a6a9ad;
color:#fff;
}
.j__button__info.j__button__3D {
border:none!important;
-webkit-box-shadow: 0 7px 0 #7b7d85, 0 8px 3px rgba(0, 0, 0, 0.3);
box-shadow: 0 7px 0 #7b7d85, 0 8px 3px rgba(0, 0, 0, 0.3);
}
.j__button__info.j__button__3D:hover{
background:#85888b;
}
.j__button__info.j__button__3D:active{
transform: translate(0,5px);
-webkit-box-shadow: 0 0 0 #8a8c92, 0 0 0 rgba(0, 0, 0, 0.3);
box-shadow: 0 0 0 #8a8c92, 0 0 0 rgba(0, 0, 0, 0.3);
}
.j__button__text.j__button__info:hover{
color:#909399!important;
}
.j__button__text.j__button__3D.j__button__info{
border:none!important;
transform: translate(0)!important;
-webkit-box-shadow: 0 0 0 #7b7d85, 0 0 0 rgba(0, 0, 0, 0.3);
box-shadow: 0 0 0 #7b7d85, 0 0 0 rgba(0, 0, 0, 0.3);
} .j__button__remind {
background:#7672e6;
color:#fff;
}
.j__button__remind:hover {
background:#a49eee;
color:#fff;
}
.j__button__remind.j__button__3D{
border:none!important;
-webkit-box-shadow: 0 7px 0 #5246e2, 0 8px 3px rgba(0, 0, 0, 0.3);
box-shadow: 0 7px 0 #5246e2, 0 8px 3px rgba(0, 0, 0, 0.3);
}
.j__button__remind.j__button__3D:hover{
background:#6560ec;
}
.j__button__remind.j__button__3D:active{
transform: translate(0,5px);
-webkit-box-shadow: 0 0 0 #5246e2, 0 0 0 rgba(0, 0, 0, 0.3);
box-shadow: 0 0 0 #5246e2, 0 0 0 rgba(0, 0, 0, 0.3);
}
.j__button__text.j__button__remind:hover{
color:#7672e6!important;
}
.j__button__text.j__button__3D.j__button__remind{
border:none!important;
transform: translate(0)!important;
-webkit-box-shadow: 0 0 0 #7b7d85, 0 0 0 rgba(0, 0, 0, 0.3);
box-shadow: 0 0 0 #7b7d85, 0 0 0 rgba(0, 0, 0, 0.3);
} /* border类 */
.j__button__text{
border: 0px solid transparent!important;
background:transparent!important;
color:#333!important;
margin:0!important;
padding:0!important;
} /* border radius 类 */
.j__button__circle{
border-radius:17px;
} </style>

需要公用 js 文件    

页面全局需要

import event from "./comp/tool/event";
 Vue.use(event);

这是注册全局this.$event指令用于跨组件通信

    /**
* @description eventbus事件
* @author jinzz
* created by 2018/05/25
* !!!取消事件订阅必须跟事件订阅成对出现,否则会重复订阅,对javascript性能造成不必要的浪费。因此B组件销毁前需取消当前事件订阅。
* @param {any} event 第一个参数是事件对象,第二个参数是接收到消息信息,可以是任意类型,更多参数也可以留作扩展,使用...运算符方便更多操作
* @method $on 事件订阅, 监听当前实例上的自定义事件。https://cn.vuejs.org/v2/api/#vm-on
* @method $off 取消事件订阅,移除自定义事件监听器。 https://cn.vuejs.org/v2/api/#vm-off https://github.com/vuejs/vue/issues/3399
* @method $emit 事件广播, 触发当前实例上的事件。 https://cn.vuejs.org/v2/api/#vm-emit
* @method $once 事件订阅, 监听一个自定义事件,但是只触发一次,在第一次触发之后移除监听器。 https://cn.vuejs.org/v2/api/#vm-once
*/
export default {
install:function(Vue:any){
const eventHub = new Vue()
Vue.prototype.$_event = { $on (...event:any[]) {
eventHub.$on(...event)
},
$off (...event:any[]) {
eventHub.$off(...event)
},
$once (...event:any[]) {
eventHub.$emit(...event)
},
$emit (...event:any[]) {
eventHub.$emit(...event)
}
}
}
}

需要fetch.ts(用于ajax请求(我只写了get请求的,因为自己写着玩的,自己写的接口  所以只写了get))

import Q from "q";
interface jsonType {
[key: string]: string
}
let defer = Q.defer();
let _active = {
jsonToString(d:jsonType){
var result = ""
for (let name in <object>d) {
if (typeof d[name] != 'function') {
result += "&" + name + "=" + encodeURIComponent(d[name]);
}
}
return result.substring(1)
}
}
// var _publishurl:string = "http://10.112.7.77:3000"
// var _publishurl:string = "http://192.168.1.108:3000"
var _publishurl:string = "http://172.20.10.2:3000" const getFetch = (url:string,params?:any)=> {
return new Promise ((resolve,reject) => {
let headers = {
'Content-Type': 'application/json; charset=UTF-8'
};
let _opt = {
method:"get",
headers:headers
}
fetch(_publishurl + url + "?" + _active.jsonToString(params),_opt)
.then((response) => {
return response.json();
})
.then((data) => {
resolve(data);
})
.catch((error) => {
reject(error);
})
}) }
export default {
getFetch,
}

最后还需要一个compConfig用于生成独立的key,保证页面多个组件不会找错

let __key:number = -1;

export default {
getKey(){
__key++;
return __key;
}
}

到这基本就可以了

下面简单介绍button组件吧

使用方法:

inline :行内

circle : 圆角

threed : 3d
type : 类型
可选值

  default 
  primary
  success 
  warning
  danger
  info
  remind
text : 文字
 
event事件 : 支持所有vue支持的
<j-button inline circle threed @click = "ccc" text>

补充 : table组件暴露出来的函数功能

获取当前页码

this.$refs.jtable.getCurrentPage()
获取当前页数据
this.$refs['jtable'].getCurrentPageData()
 
本人qq:421217189 又不明白的可以联系我

vue 表格组件分享的更多相关文章

  1. 打通前后端全栈开发node+vue进阶【课程学习系统项目实战详细讲解】(3):用户添加/修改/删除 vue表格组件 vue分页组件

    第三章 建议学习时间8小时      总项目预计10章 学习方式:详细阅读,并手动实现相关代码(如果没有node和vue基础,请学习前面的vue和node基础博客[共10章] 演示地址:后台:demo ...

  2. vue 表格组件 有事件交互(二)

    04==>v-if下面可以嵌套 同级的 v-if 和v-node如下若是第一个v-if没有下面的就不可能显示出来的. <span v-if="!single" @cli ...

  3. 封装Vue Element的table表格组件

    上周分享了几篇关于React组件封装方面的博文,这周就来分享几篇关于Vue组件封装方面的博文,也好让大家能更好地了解React和Vue在组件封装方面的区别. 在封装Vue组件时,我依旧会交叉使用函数式 ...

  4. vue实现简单表格组件

    本来想这一周做一个关于vuex的总结的,但是由于朋友反应说还不知道如何用vue去写一个组件,所以在此写写一篇文章来说明下如何去写vue页面或者组件.vue的核心思想就是组件,什么是组件呢?按照我的理解 ...

  5. 手把手教你用Vue造轮子(3):开发可排序的表格组件

    前言 最近闰土大叔跟Vue干上了,没办法,公司业务驱动,不用Vue没招啊,leader尝到了前后端分离带来的好处,除非你离职,哈哈哈,当然,那是不可能的,对于我这种要攒钱买房子的人来说.那还说什么呢, ...

  6. vue+element 使用Export2Excel导出表格组件

    下载表格组件是根据我自己的业务需求来封装的 使用的是vue中 xlsx 的插件,需要安装新的依赖及配置 仅供参考 不保证和你百分百匹配 安装依赖 npm install -S file-saver x ...

  7. Vue + Element-ui实现后台管理系统(5)---封装一个Form表单组件和Table表格组件

    封装一个Form表单组件和Table组件 有关后台管理系统之前写过四遍博客,看这篇之前最好先看下这四篇博客.另外这里只展示关键部分代码,项目代码放在github上: mall-manage-syste ...

  8. 封装Vue Element的可编辑table表格组件

    前一段时间,有博友在我那篇封装Vue Element的table表格组件的博文下边留言说有没有那种"表格行内编辑"的封装组件,我当时说我没有封装过这样的组件,因为一直以来在实际开发 ...

  9. vue实用组件——表格

    之前用了一下vue-bootstrap,感觉里面的表格组件特别好用,但是如果仅仅为了使用表格就引入bootstrap,似乎有点不划算.所以自己就试着实现了一下bootstrap里面表格的部分功能,目前 ...

随机推荐

  1. linux复习4:文件和目录

    7一.linux文件 1.linux文件的扩展名:文件扩展名是文件名最后一个点之后的部分,下面列出了其中一部分 (1)压缩文件和归档文件 压缩和归档的文件扩展名及其含义如下. .bz2:使用bzip2 ...

  2. 初探html-17 表单

    HTML 表单和输入 HTML 表单用于收集不同类型的用户输入. 在线实例 <form action=""> First name: <input type=&q ...

  3. 一、bif

    缩进是python的灵魂,缩进可以使python的代码整洁,有层次. python是脚本语言,就是为了简单方便以辅助科学运算,因此python有许多bif,build in function 全部都是 ...

  4. [SCOI2016]幸运数字(线性基,倍增)

    [SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作 ...

  5. Codeforces 919 行+列前缀和 树上记忆化搜索(树形DP)

    A B C #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) ...

  6. 【gin-vue-admin】 使用go和vue 快速搭建一个项目模板

    gin-vue-admin gin+vue开源快速项目模板 项目地址:https://github.com/piexlmax/gin-vue-admin 增加了 micro-service-test分 ...

  7. idea 新手入门配置

    1.配置新建类时,创建者信息 2.配置svn 1. 在idea中不显示无用的内容,配置如下  .hprof;.iml;.pyc;.pyo;.rbc;.yarb;~;.DS_Store;.git;.hg ...

  8. SpringBoot 1.x 之入门

    1 SpringBoot简介 SpringBoot简化Spring应用开发,约定大于配置,去繁从简,just run就能创建一个独立的,产品级别的应用. 背景: J2EE笨重的开发.繁多的配置.低下的 ...

  9. container_of机制

    #include <stdio.h> #include <stdlib.h> /* 计算成员变量首部相对于结构变量首部的偏移量 */ #define offsetof(TYPE ...

  10. maven项目解决pom.xml头部 http://maven.apache.org/xsd/maven-4.0.0.xsd报错的问题

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_36611526/article/d ...