1. 环境准备
-
初始化Vue项目
vue init webpack
-
安装elementUI
npm i element-ui -S
-
运行项目
npm run dev
2. 使用
①:在main.js中引入elementUI组件
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI)
②:创建一个组件
User.vue
③:创建一个路由引入组件
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import User from '@/components/User'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/',
name: 'HelloWorld',
component: HelloWorld
},
{
path: '/user/list',
name: 'User',
component: User
}
]
})
此时开启服务:npm run dev 可以通过localhost:8080/user/list;来访问组件了,但此时还是空的!没有任何内容!
④:在组件中创建一个表格
<template>
<el-table
:data="tableData"
style="width: 100%">
<el-table-column
prop="date"
label="日期"
width="180">
</el-table-column>
<el-table-column
prop="name"
label="姓名"
width="180">
</el-table-column>
<el-table-column
prop="address"
label="地址">
</el-table-column>
</el-table>
</template>
<script>
export default {
data() {
return {
tableData: [{
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
date: '2016-05-04',
name: '王小虎',
address: '上海市普陀区金沙江路 1517 弄'
}, {
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄'
}, {
date: '2016-05-03',
name: '王小虎',
address: '上海市普陀区金沙江路 1516 弄'
}]
}
}
}
</script>
可以看出数据来源tableData
3.Mockjs模拟数据
-
安装mokejs
npm install mockjs
-
新建一个user.js文件,用来模拟后台数据
-
是用commonjs的方式引入
let mock = require("mockjs")
-
模拟数据,具体规则参考官网文档,或者从网上复制
let data = Mock.mock({ "user|30": [{ // 随机生成1到3个数组元素 'name': '@cname', // 中文名称 'id|+1': 88, // 属性值自动加 1,初始值为88 'age|18-28': 0, // 18至28以内随机整数, 0只是用来确定类型 'birthday': '@date("yyyy-MM-dd")', // 日期 'city': '@city(true)', // 中国城市 'color': '@color', // 16进制颜色 }] })
-
-
数据有了,如何返回在表格中展示呢?需要用到axios发送ajax请求,mockjs拦截ajax请求,并把数据返回回去!
-
安装axios
npm install axios --save
-
在main.js中引入
import axios from 'axios'
-
配置全局属性,挂靠在原型上,在任意组件内都可以使用this.$http获得axios对象
Vue.prototype.$http = axios
-
-
发送axios请求来获取数据,写在methods属性内
-
在User.vue组件中引入user.js
import 'user'
发送axios请求
<script> import 'user' export default { data() { return { tableData: [] } }, methods:{ loadList(){ this.$http.post('user/list').then(res=>{ //返回的数据赋值给tableData表格中 this.tableData = res }).catch() } } } </script>
- mockjs拦截ajax请求返回数据
let Mock = require("mockjs") let list = Mock.mock({ "user|30": [{ // 随机生成1到3个数组元素 'name': '@cname', // 中文名称 'id|+1': 88, // 属性值自动加 1,初始值为88 'age|18-28': 0, // 18至28以内随机整数, 0只是用来确定类型 'birthday': '@date("yyyy-MM-dd")', // 日期 'city': '@city(true)', // 中国城市 'color': '@color', // 16进制颜色 }] }) //console.debug(data) Mock.mock('/user/list','post',function (option) { return{ list:list } })
- 什么时候执行loadList函数来获取数据呢,在页面加载完成后,使用mounted函数,它可以在页面渲染完毕后,执行其中的内容!
import User from '../js/user' export default { name:'User', data() { return { tableData: [] } }, methods:{ loadList(){ this.$http.post('user/list').then(res=>{ //返回的数据赋值给tableData表格中 console.debug(res) //this.tableData = res.list }) }, }, mounted(){ //当页面加载完毕的时候发送ajax请求 this.loadList(); } }
-
4. 分页
- 首先准备一个分页条
<div class="block">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage4"
:page-sizes="[100, 200, 300, 400]"
:page-size="100"
layout="total, sizes, prev, pager, next, jumper"
:total="400">
</el-pagination>
</div>
@size-change是绑定了一个改变事件,在页面中如果我们改变了每页的大小,它应该动态的展示相应大小的数据
:是v-blind的简写形式,动态的绑定一个属性,当这个属性发生改变的时候,他也会随着发生改变
- 动态获取分页数据
上面的数据都是写死了,现在要动态的获取数据,怎么做呢?我们知道每页大小和当前页都是可以改变的,此时绑定一个属性,使用data这个函数来返回我们需要的数据!
<div class="block">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[10, 15, 20, 25,30]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total">
</el-pagination>
</div>
data() {
return {
tableData: [],
currentPage:1,
pageSize:10,
total:total,
}
}
data函数返回的是一个json字符串,此时界面就会根据这个绑定的数据来渲染!我们给当前页和页面大小一个默认数据!在loadList这个函数中,它本身就是去获取表格数据,但是现在需要去加分页条件了,把分页的条件传递过去!
loadList(){
this.$http.post('/user/list',{
currentPage:this.currentPage,
pageSize:this.pageSize,
total:this.total}).then(res=>{
this.tableData = res.data.list.user
})
}
一定要使用this,才表示是data中的数据!
- 在拦截到的ajax请求中,对其进行处理!
Mock.mock('/user/list','post',function (option) {
console.debug(result)
let pageData = JSON.parse(option.body);
let begein = (pageData.currentPage-1)*pageData.pageSize;
let end = pageData.currentPage*pageData.pageSize;
return{
list:result.user.slice(begein,end),
total:result.user.length
}
})
分页数据传递过来时是封装在option中的body里的,但是直接取出来是一个字符串,所以要转化未json对象,有了当前页和页面大小,就可以把数组分割成需要的大小并返回回去!
接收到相应的数据时取出来赋值给属性
loadList(){
this.$http.post('/user/list',{
currentPage:this.currentPage,
pageSize:this.pageSize,
}).then(res=>{
//返回的数据赋值给tableData表格中
console.debug(res)
this.tableData = res.data.list
this.total = res.data.total
})
}
handleSizeChange与handleCurrentChange是两个改变事件需要写在方法中,当页面大小发生改变或着当前页发生改变时,应该调用loadList这个函数去重新加载数据!
handleSizeChange(v){
this.pagesize = v;
this.loadList();
},
handleCurrentChange(v){
this.currentPage = v;
this.loadList();
},
5. 删除
5.1 删除单个
- 新建一列,准备两个按钮
<template slot-scope="scope">
<el-button @click="handleClick(scope.row)" type="text" size="small">编辑</el-button>
<el-button @click="delclick(scope.row)" type="text" size="small">删除</el-button>
</template>
-
绑定点击事件,当触发了删除事件时,先给出提示,询问是否确认删除?确认后会把当前行的数据发送出去!并且接收响应的结果展示出来!
询问是否删除使用气泡询问框:
<template slot-scope="scope">
<el-button @click="editclick(scope.row)" type="text" size="small">编辑</el-button>
<el-popconfirm
title="亲,确定要删除我吗?"
confirmButtonText='是的'
cancelButtonText='不用了'
icon="el-icon-info"
iconColor="red"
@onConfirm="delclick(scope.row)"
>
<el-button type="text" size="small " slot="reference">删除</el-button>
</el-popconfirm>
</template>
delclick(v){
//console.debug(v)
this.$http.post('/user/del',v).then(res=>{
if(res.data.success){
const h = this.$createElement;
this.$notify({
title: res.data.message,
message: h('i', { style: 'color: teal'}, v.name+'已被丢弃')
});
}
}).catch()
},
- 数据传递过来后,应该相应一个结果。是删除成功还是失败
Mock.mock('/user/del','post',function(option){
let obj = JSON.parse(option.body);
console.debug(obj.id)
return{
success:true,
message:'删除成功!'
}
})
5.2 删除多个
- 新建一列加上复选框
<el-table-column
type="selection"
width="55">
</el-table-column>
- 在表格中添加选中改变事件来获取选中的行
@selection-change="getSelectedRows"
- data函数中绑定该属性
data() {
return {
tableData: [],
currentPage:1,
pageSize:10,
total:1,
selectRows:[],
}
},
- 获取到选中的行的时候动态改变selectRows的值
getSelectedRows(v){
console.debug(v)
this.selectRows = v;
}
- 添加一个按钮来触发批量删除事件
<el-row>
<el-button @click="batchDel" type="danger" icon="el-icon-delete" size="mini" style="float: left;margin: 5px">
</el-button>
</el-row>
- 触发时传递选中的所有数据,先判断是否选中一行,如果一行都没选中则给出提示!删除成功给出提示!
batchDel(){
if(!this.selectRows.length){
this.$message({
message: '亲,请至少选中一行哦!',
type: 'warning'
});
return;
}
this.$http.post('/user/batchdel',{rows:this.selectRows}).then(res=>{
if(res.data.success){
const h = this.$createElement;
this.$notify({
title: res.data.message,
message: h('i', { style: 'color: teal'}, '这些数据已被丢弃!')
});
}
}).catch()
}
6. 编辑
- 为编辑按钮注册点击事件,点击编辑弹出对话框表单!他会把这行的数据传递过去!
<el-button @click="editclick(scope.row)" type="text" size="small">编辑</el-button>
- 准备一个对话框表单
<el-dialog :title="title" :visible.sync="dialogFormVisible">
<el-form :model="form">
<el-form-item label="姓名">
<el-input v-model="form.name" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="年龄">
<el-input v-model="form.age" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="生日">
<el-input v-model="form.birthday" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="城市">
<el-input v-model="form.city" autocomplete="off"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false">取 消</el-button>
<el-button type="primary" @click="updateSubmit">确 定</el-button>
</div>
</el-dialog>
- 所有的属性我都想要动态的生成数据!在data函数中绑定数据
data() {
return {
tableData: [],
currentPage:1,
pageSize:10,
total:1,
selectRows:[],
title:"",
dialogFormVisible:false,
form:{
name:'',
age:'',
birthday:'',
city:'',
}
}
}
- 使用for in 来遍历对象的属性,使用obj[key]可以取到对象属性对应的值
- 点击编辑,应该弹出表单,回显数据!弹出表单直接使dialogFormVisible的属性为true即可!
- 对象通过属性获取值可以使用object[attribute] = value
editclick(row){
this.dialogFormVisible = true
for(let i in row){
this.form[i] = row[i];
}
},
- 点击确定将数据通过ajax发送出去!最后响应结果
updateSubmit(){
this.$http.post('/user/updata',{form:this.form}).then(res=>{
if(res.data.success){
const h = this.$createElement;
this.$notify({
title: res.data.message,
message: h('i', { style: 'color: teal'}, this.form.name+'修改成功')
});
}
}).catch()
},
7. 高级查询
- 新建高级查询的输入框
<el-form :inline="true" :model="user" class="demo-form-inline">
<el-form-item label="姓名">
<el-input v-model="user.name" placeholder="姓名"></el-input>
</el-form-item>
<el-form-item label="城市">
<el-input v-model="user.name" placeholder="城市"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">查询</el-button>
</el-form-item>
</el-form>
- 动态绑定数据
data() {
return {
tableData: [],
currentPage:1,
pageSize:10,
total:1,
selectRows:[],
title:"",
dialogFormVisible:false,
form:{
name:'',
age:'',
birthday:'',
city:'',
},
user:{
name:'',
city:''
}
}
}
- 点击查询,讲数据发送到后台
methods:{
onSubmit(){
this.$http.post('/user/search',{user:this.user}).then(res=>{
}).catch()
}
8. 添加
- 新建一个添加按钮
<el-form-item>
<el-button type="primary" @click="add">添加</el-button>
</el-form-item>
- 点击添加,弹出对话框表单,使dialogFormVisible的属性为true即可!
add(){
this.dialogFormVisible = true;
this.title = '添加'
}
- 点击提交,讲数据发送到后台,跟修改是一样的!
this.$http.post('/user/updata',{form:this.form}).then(res=>{
if(res.data.success){
const h = this.$createElement;
this.$notify({
title: res.data.message,
message: h('i', { style: 'color: teal'}, this.form.name+'修改成功')
});
}
}).catch()
}