vue-data-tables
Version:
A simple, customizable and pageable table, based on vue2 and element-ui.
148 lines (124 loc) • 3.27 kB
JavaScript
import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import {DataTables, DataTablesServer} from '@/index'
Vue.use(ElementUI)
Vue.use(DataTables)
Vue.use(DataTablesServer)
let id = 0
const createElm = function() {
const elm = document.createElement('div')
elm.id = 'app' + ++id
document.body.appendChild(elm)
return elm
}
/**
* 回收 vm
* @param {Object} vm
*/
exports.destroyVM = function(vm) {
vm.$el &&
vm.$el.parentNode &&
vm.$el.parentNode.removeChild(vm.$el)
}
/**
* 创建一个 Vue 的实例对象
* @param {Object|String} Compo 组件配置,可直接传 template
* @param {Boolean=false} mounted 是否添加到 DOM 上
* @return {Object} vm
*/
exports.createVue = function(Compo, mounted = false) {
if (Object.prototype.toString.call(Compo) === '[object String]') {
Compo = { template: Compo }
}
return new Vue(Compo).$mount(mounted === false ? null : createElm())
}
/**
* 创建一个测试组件实例
* @link http://vuejs.org/guide/unit-testing.html#Writing-Testable-Components
* @param {Object} Compo - 组件对象
* @param {Object} propsData - props 数据
* @param {Boolean=false} mounted - 是否添加到 DOM 上
* @return {Object} vm
*/
exports.createTest = function(Compo, propsData = {}, mounted = false) {
if (propsData === true || propsData === false) {
mounted = propsData
propsData = {}
}
const elm = createElm()
const Ctor = Vue.extend(Compo)
return new Ctor({ propsData }).$mount(mounted === false ? null : elm)
}
/**
* 触发一个事件
* mouseenter, mouseleave, mouseover, keyup, change, click 等
* @param {Element} elm
* @param {String} name
* @param {*} opts
*/
exports.triggerEvent = function(elm, name, ...opts) {
let eventName
if (/^mouse|click/.test(name)) {
eventName = 'MouseEvents'
} else if (/^key/.test(name)) {
eventName = 'KeyboardEvent'
} else {
eventName = 'HTMLEvents'
}
const evt = document.createEvent(eventName)
evt.initEvent(name, ...opts)
elm.dispatchEvent
? elm.dispatchEvent(evt)
: elm.fireEvent('on' + name, evt)
return elm
}
/**
* 触发 “mouseup” 和 “mousedown” 事件
* @param {Element} elm
* @param {*} opts
*/
exports.triggerClick = function(elm, ...opts) {
exports.triggerEvent(elm, 'mousedown', ...opts)
exports.triggerEvent(elm, 'mouseup', ...opts)
return elm
}
exports.sleep = function(time = 200) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve()
}, time)
})
}
exports.waitForVMready = function(vm) {
return new Promise(function(resolve) {
vm.$nextTick(_ => {
resolve()
})
})
}
let getTable = function(el) {
return el.querySelector('.el-table')
}
let getHead = function(el) {
return el.querySelector('thead')
}
let getBody = function(el) {
return el.querySelector('tbody')
}
let getRows = function(el) {
return el.querySelectorAll('tr')
}
exports.getTableItems = function(el) {
let table = getTable(el);
let head = getHead(table);
let body = getBody(table);
let rows = getRows(body);
return {table, head, body, rows}
}
exports = Object.assign(exports, {
getTable,
getHead,
getRows,
getBody
})