分享一款自己写的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. 单元测试 - tox 使用

    1. 问题一 $ tox -e pep8 -- testdemo.server pep8 installed: alembic==,amqp==,appdirs==,Babel==,beautiful ...

  2. 关于jQuery获取不到动态添加的元素节点的问题

    遇到问题: 当我获取 $("#art-list")页面元素后去在后面追加标签的时候(append),在下面用 $(selector) 获取刚刚添加的标签,发现怎么都获取不到. 问题 ...

  3. 关于IDEA中@Autowired 注解报错~图文

    例如鼠标放上去会报错如下: Could not autowire. No beans of 'StudentMapper' type found. less... (Ctrl+F1) Inspecti ...

  4. Struts2.5以上版本There is no Action mapped for namespace [/] and action name [userAction_login] associated with context path []

    分析:Struts2在2.5版本后添加strict-method-invocation(严格方法访问),默认为true,不能使用动态方法调用功能,故需设为false struts.xml设置如下: & ...

  5. 文件上传 MIME类型检测

    简介 MIME(Multipurpose Internet Mail Extensions)多用途网络邮件扩展类型,可被称为Media type或Content type, 它设定某种类型的文件当被浏 ...

  6. 如何在通过脚手架create-react-app 创建的react项目中配置 less

    首先感慨下 自己竟然有半年没登账户 ,干嘛去啦? 从刚接触vue 接手做两次版本之后 又让我这个小菜鸡 开始开发react项目,连react生命周期还没搞明白的时候 就开始进行第一版本的开发了,第一个 ...

  7. Educational Codeforces Round 77 比赛总结

    比赛情况 我太菜了 A题 加减乘除不会 B题 二元一次方程不会 C题 gcd不会 就会一个D题二分答案大水题,本来想比赛最后一分钟来一个绝杀,结果 Wrong Answer on test 4 比赛总 ...

  8. Python修炼之路-异常

    异常处理 在程序出现bug时一般不会将错误信息直接显示给用户,而是可以自定义显示内容或处理. 常见异常 AttributeError # 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性 ...

  9. 移动UI控件Telerik UI for Xamarin发布R2 2019|引入Map控件

    Telerik UI for Xamarin是一个构建跨平台移动应用程序的原生UI.Telerik UI for Xamarin使用Xamarin.Forms技术,它可以让开发人员从一个单一的共享C# ...

  10. 【UOJ#450】[集训队作业2018] 复读机

    题目链接 题目描述 群里有\(k\)个不同的复读机.为了庆祝平安夜的到来,在接下来的\(n\)秒内,它们每秒钟都会选出一位优秀的复读机进行复读.非常滑稽的是,一个复读机只有总共复读了\(d\)的倍数次 ...