查
1.布局
2.定义api
3.导入api
4.进入页面就调用api
5.获取数据
6.存储并渲染
7.与分页建立关联
a.请求参数值要与分页组件绑定
b.total值存储并绑定到分页组件
c.页码改变与页容量改变都要请求api
1.布局
<template>
<div>
<el-card>
<el-form :inline="true" :model="form" class="demo-form-inline" ref="form">
<el-form-item label="学科编号">
<el-input v-model="form.rid" ></el-input>
</el-form-item>
</el-form>
</el-card>
<el-card>
// :data="list"作为绑定数据使用
<el-table :data="list" style="width: 100%">
<el-table-column prop="id" label="序号"></el-table-column>
<el-table-column label="操作" width="120px">
<template v-slot="{ row }">
<!-- 接口传入过来,row当前数据 -->
<el-button type="text" @click="editEvent(row)">编辑</el-button>
<el-button type="text">启用</el-button>
<el-button type="text" @click="deleteEvent(row)">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
<Add ref="add" @getData="getData" />
</div>
</template>
定义接口参数
data () {
return {
// list: [{}],写死
list: [],
form: {
id: '',
rid: '',
name: '',
short_name: '',
username: '',
create_time: '',
intro: ''
}
}
},
补充
<el-form :inline="true" :model="form" :rules=rules ref="form" >
<el-formitem prop="rid">
<input v-model="form.remark"/>
/*
:inline="true"为封装的表单样式
prop="xxx" 渲染数据使用
ref="form" 操作组件时使用 $refs.form
:model="form" 对应 input里的v-model="form.xxx" xxx名称必须与接口数据名称对应
例:
:rules= rules 为表单验证,
在data里写规则
data(){return{
rules{name:[{required:true,message:'必填'}]}
}
*/
2.定义api
// 查
export const subjectList = (params) => {
return request({
url: '/subject/list',
params
})
}
//接口关系很大,有时候一些效果,怎么都没有反应,往往就是接口出问题了
3.导入api
import { subjectList, subjectRemove } from '@/api/subject'
4.进入页面就调用api
async created () {
await this.getData()
},
methods:{
// 查
async getData () {
const res = await subjectList(this.form)
//打印数据,看是否调用成功
console.log('学科列表',res)
}
}
5.获取数据
6.存储并渲染
//通过prop渲染
<el-table :data="list" style="width: 100%">
<el-table-column prop="id" label="序号"></el-table-column>
<el-table-column prop="rid" label="学科编号"></el-table-column>
<el-table-column prop="name" label="学科名称"></el-table-column>
<el-table-column prop="short_name" label="学科简称"></el-table-column>
<el-table-column prop="username" label="创建者"></el-table-column>
<el-table-column prop="create_time" label="创建日期"></el-table-column>
<el-table-column prop="status" label="状态"></el-table-column>
</el-table>
methods:{
// 查
async getData () {
const res = await subjectList(this.form)
this.list = res.data.items
}
}
7.与分页建立关联
<!-- 分页 -->
<div class="page">
<el-pagination
:current-page.sync="form.page"
:page-sizes="[1, 10, 20, 50, 100, 200, 300]"
:page-size.sync="form.limit"
layout="total,sizes,prev,pager,next,jumper"
//total 总条目数
:total="total"
@size-change="getData"
@current-change="getData"
/>
</div>
// 查
async getData () {
const res = await subjectList(this.form)
...
// 存储分页total
this.total = res.data.pagination.total
// 打印数据
console.log('学科列表', res)
//打印分页数据
// console.log('分页total', this.total)
},
改
1.点击修改打开弹框
// 改
<index>
async editEvent (row) {
// row-->接收数据
// 打开弹框
this.$refs.add.isShow = true
// 打印看是否有数据
console.log('row', row)
},
2.回显数据-(用持久化方法)
<index>
// 改
async editEvent (row) {
// row-->接收数据
// 打印看是否有数据
// console.log('row', row)
//简单数据回显 -->拿到子组件里的form数据
// this.$refs.add.form = row
// 深拷贝方法数据回显 -->让其于子类的数据切断关联 -->也可用插件完成
this.$refs.add.form = JSON.parse(JSON.stringify(row))
3.在新增弹框组件中定义一个mode值用于区分场景
4.新增与编辑弹框都要修改mode值
<add>
data () {
return {
// 区分场景 是新增还是编辑 add:新增 edit:编辑,
mode: '',
}
},
<inde>
// 增
addEveent () {
this.$refs.add.mode = 'add'
},
// 改
async editEvent (row) {
this.$refs.add.mode = 'edit'
}
5.调用标题
<Add>
<el-dialog :title="{add:'新增部门',edit:'编辑部门'}[mode]" >
6.表单验证调整
<Add>
async submit(){
// 先进行表单验证
this.$refs.form.validate()
}
7.定义修改api
// 改
export const subjectEdit = (params) => {
return request({
url: '/subject/edit',
method: 'put',
params
})
}
8.导入修改api
import { ..., subjectRemove } from '@/api/subject'
9.确定点击事件中分场景调用api
10.调用成功(关闭弹框,清空表单数据与验证,提示,刷新父级数据)
<Add>
methods: {
async submit () {
// 先进行表单验证
this.$refs.form.validate()
// 分场景调用api
if (this.mode === 'add') {
...
}
} else if (this.mode === 'edit') {
//调用‘改’接口
await subjectEdit(this.form)
//传递给父的数据
this.$emit('getData', this.form)
//调用成功提示
this.$message.success('编辑成功', '提示')
}
//关闭弹框
this.isShow = false
//刷新父级数据
this.$parent.getData()
}
}
11.补充
问题:点击‘编辑’后再点新增,表单的数据仍然存在
解决
<Add>
<el-dialog
...
@close="closeEvent"
// 关闭事件
closeEvent () {
//重置表单
this.$refs.form.resetFields()
//初始化
this.form = {
id: '',
rid: '',
name: '',
short_name: '',
username: '',
create_time: '',
intro: ''
}
}
接口
后端相关接口: 规范
增:post,删:delete 改:全量put,部分:patch 查:get
删
1.点击删除弹窗确定框
// 删
async deleteEvent () {
await this.$confirm('确认删除吗?')
},
2,定义删除api
// 删
export const subjectRemove = (data) => {
return request({
url: `/subject/remove/${data.id}`,
method: 'post',
data
})
}
3.导入删除api
import {..,subjectRemove } from '@/api/subject'
4,点击确定框,确定调用删除api
5.调用成功(提示,刷新列表数据)
<template v-slot="{ row }">
<el-button type="text" @click="deleteEvent(row)">删除</el-button>
</template>
async deleteEvent (row) {
await this.$confirm('确认删除吗?')
await subjectRemove({ id: row.id })
//提示
this.$message.success('删除成功')
// 刷新数据
await this.getData()
},
补充:接口与定义的方法代码,具体看后端给的接口要求
增
增:
1:创建新增弹框组件
2:在父组件导入注册使用
3:点击新增打开弹框
4:完成弹框布局
5:完成弹框内的表单验证
6:定义新增api
7:导入新增api
8:点击确定在表单验证通过后调用api
9:调用成功:
a:关闭弹框
b:清空表单内容
c:提示
d:刷新父级列表数据
1:创建新增弹框组件
<template>
<div>
>
<el-dialog
//点击弹框操作
:visible.sync="isShow"
//弹框大小
label-width="600px"
//新增-编辑-的区分值
:title="{add:'新增部门',edit:'编辑部门'}[mode]"
//关闭弹框时的方法
@close="closeEvent"
>
<el-form :inline="true" :model="form" class="demo-form-inline" ref="form" :rules=rules>
<el-form-item label="备注" prop="rid">
<el-input v-model="form.remark"></el-input>
</el-form-item>
</el-form>
//按钮最好包裹在div里,方便改样式
<div style="text-align:center">
<el-button @click="isShow=false">取消</el-button>
<el-button type="success" @click="submit">确定</el-button>
</div>
</el-dialog>
</div>
</template>
补充
<el-form :inline="true" :model="form" :rules=rules ref="form" >
<el-formitem prop="rid">
<input v-model="form.remark"/>
/*
:inline="true"为封装的表单样式
prop="xxx" 渲染数据使用
ref="form" 操作组件时使用 $refs.form
:model="form" 对应 input里的v-model="form.xxx" xxx名称必须与接口数据名称对应
例:
:rules= rules 为表单验证,
在data里写规则
data(){return{
rules{name:[{required:true,message:'必填'}]}
}
*/
2:在父组件(index)导入注册使用
<Add ref="add" @getData="getData" />
3:点击新增打开弹框
<el-button type="success" @click="addEveent">新增学科</el-button>
// 增
addEveent () {
this.$refs.add.isShow = true
},
4:完成弹框布局
5:完成弹框内的表单验证
form: {
id: '',
rid: '',
name: '',
short_name: '',
username: '',
create_time: '',
intro: ''
},
rules: {
rid: [{ required: true, message: '请输入学科编号', trigger: '必填' }],
name: [{ required: true, message: '请输入学科名称', trigger: '必填' }]
}
6:定义新增api
// 增
export const subjectAdd = (data) => {
return request({
url: 'subject/add',
method: 'post',
data
})
}
7:导入新增api
import { subjectAdd} from '@/api/subject'
8:点击确定在表单验证通过后调用api
9:调用成功:
a:关闭弹框
b:清空表单内容
c:提示
d:刷新父级列表数据
<Add>
<div style="text-align:center">
<el-button @click="isShow=false">取消</el-button>
<el-button type="success" @click="submit">确定</el-button>
</div>
async submit(){
// 先进行表单验证
this.$refs.form.validate()
//调用接口
await subjectAdd(this.form)
// 提示
this.$message.success('新增成功', '提示')
// 传递给父组件,对父组件进行修改
this.$emit('getData', this.form)
// 调用父组件方法-进行列表重新渲染
this.$parent.getData()
}
其它操作
搜索
// 调用'查'的接口即可
async serachEvent () {
await this.getData()
},
清除
// 清除
//让值初始化即可。
clearEvent () {
this.form = {
id: '',
rid: '',
name: '',
short_name: '',
username: '',
create_time: '',
intro: ''
}
}
状态
1.拉取枚举文件constant,放到api里
2.导入index
import employeesData from '@/api/constant/employees'
//data里定义数据
employeesData: '' // 无法直接使用,需要再定义一次
3.利用element-ui选择器进行for循环
<el-select placeholder="请选择">
<el-option>
</el-option>