获取数据
首先在 request 下的 api.ts 中添加
//用户列表
export function getUserList(){
return service({
url:'/getUserList',
method:'get',
})
}
//人物列表
export function getRoleList(){
return service({
url:'/getRoleList',
method:'get',
})
}
修正 UserView.vue,分别调用获取用户列表、获取人物列表,然后打印回来数据
export default defineComponent({
name: 'HomeView',
setup(){
const getUser = ()=>{
getUserList().then(res=>{
console.log(res)
})
}
const getRole = ()=>{
getRoleList().then(res=>{
console.log(res)
})
}
onMounted(()=>{
getUser()
getRole()
})
},
components: {},
});
规范数据
type 文件夹下新建 user.ts
export interface ListInt {
id: number,
nickName: string,
userName: string,
role:RoleInt[]
}
interface RoleInt{
role: number,
roleName: string
}
interface SelectDataInt{
role:number,
nickName: string
}
interface RoleListInt {
authority: number[],
roleId: number,
roleName: string
}
export class InitData {
selectData: SelectDataInt = {
role:0,
nickName:''
}
list: ListInt[] = []//接纳用户列表
roleList:RoleListInt[] = []//接纳人物列表
}
页面展现
页面展现和商品列表是差不多的。头部有查找和挑选,能够进行名字查找和人物挑选。其间人物挑选咱们能够依据 Select 选择器 写就能够了。
在获取到用户列表和人物列表后赋值给 data。用于页面的数据展现
在展现用户列表时,人物 role 字段由所以个数组,在 table 中展现时能够依据 Table 表格流体高度 源码中的 插槽 来写
<template #default="scope">
<el-button
type="primary"
size="small"
@click="deleteRow(scope.row)">
Remove
</el-button>
</template>
咱们能够添加 deleteRow 办法打印下 scope.row
的内容,点击按钮
能够看到 scope.row
得到的是这一行的数据。按照这个思路完善代码如下:
<template>
<div>
<el-form :inline="true" :model="selectData" class="demo-form-inline">
<el-form-item label="名字">
<el-input v-model="selectData.nickName" placeholder="请输入名字"/>
</el-form-item>
<el-form-item label="人物">
<el-select v-model="selectData.role" class="m-2" placeholder="请选择" size="large">
<el-option
label="悉数"
:value="0"/>
<el-option
v-for="item in roleList"
:key="item.roleId"
:label="item.roleName"
:value="item.roleId"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">查询</el-button>
</el-form-item>
</el-form>
<el-table :data="list" border style="width: 100%">
<el-table-column prop="id" label="ID" width="180"/>
<el-table-column prop="nickName" label="名字" width="180"/>
<el-table-column prop="introduce" label="人物">
<template #default="scope">
<el-button
v-for="item in scope.row.role"
:key="item.role"
type="link"
size="small">
{{ item.roleName }}
</el-button>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script lang="ts">
import {defineComponent, onMounted, reactive, toRefs} from 'vue';
import {getRoleList, getUserList} from "@/request/api";
import {InitData} from "@/type/user";
export default defineComponent({
name: 'HomeView',
setup() {
const data = reactive(new InitData())
const getUser = () => {
getUserList().then(res => {
data.list = res.data
})
}
const getRole = () => {
getRoleList().then(res => {
data.roleList = res.data
})
}
onMounted(() => {
getUser()
getRole()
})
return {
...toRefs(data),
}
},
components: {},
});
</script>
运转:
用户列表查询
用户列表查询和商品列表查询类似,咱们稍作修正即可
const onSubmit = () => {
let arr: ListInt[] = []
//查询条件是否有值
if (data.selectData.nickName || data.selectData.role) {
if (data.selectData.nickName) {
//将过滤出来的数组赋值给arr
arr = data.list.filter((value) => {
return value.nickName.indexOf(data.selectData.nickName) !== -1
})
}
if (data.selectData.role) {
//将过滤出来的数组赋值给arr
arr = (data.selectData.nickName ? arr : data.list).filter((value) => {
return value.role.find((item)=>{return item.role===data.selectData.role})
})
}
} else {
arr = data.list
}
data.list = arr
}
//监听挑选的两个属性
watch([()=>data.selectData.nickName,()=>data.selectData.role],()=>{
if(data.selectData.nickName == '' || data.selectData.role == 0){
getUser()
}
})
return {
...toRefs(data),
onSubmit,
}
用户列表修正
咱们在列表最终添加修正按钮,点击弹出 Dialog,所以咱们修正 UserView.vue
先在 table 里添加修正按钮
<el-table-column prop="introduce" label="操作">
<template #default="scope">
<el-button
type="primary"
size="small"
@click="changeUser(scope.row)">
修正
</el-button>
</template>
</el-table-column>
然后把 Dialog 自定义内容中第二个对话框的代码复制过来,稍作修正
<el-dialog v-model="isShow" title="修正信息">
<el-form :model="active">
<el-form-item label="名字" label-width="50px">
<el-input v-model="active.nickName" autocomplete="off" />
</el-form-item>
<el-form-item label="人物" label-width="50px">
<el-select multiple v-model="active.role" placeholder="Please select a zone">
<el-option
v-for="item in roleList"
:key="item.roleId"
:label="item.roleName"
:value="item.roleId"
/>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="isShow = false">撤销</el-button>
<el-button type="primary" @click="updateUser">更新</el-button>
</span>
</template>
</el-dialog>
其间 isShow
为是否展现 Dialog,咱们能够在 type 下的 user.ts 中添加一个字段。一起添加 active
字段用来保存选中的对象
interface ActiveInt{
id: number,
nickName: string,
userName: string,
role:number[]
}
export class InitData {
selectData: SelectDataInt = {
role:0,
nickName:''
}
list: ListInt[] = []//接纳用户列表,用于展现
roleList:RoleListInt[] = []//接纳人物列表,用于查找选择器
isShow = false//是否展现Dialog
active:ActiveInt = {//保存选中的对象
id: 0,
nickName: '',
userName: '',
role:[]
}
}
其间 Dialog 中的 :model="active"
为 Dialog 中要显示的数据。咱们点击修正按钮,咱们修正 isShow
的值,让对话框显示出来,一起传入所点击的这一行的数据,赋值给 data.active
,这样当 Dialog 显示出来的时分里边就会填充要修正的数据
const changeUser = (row:ListInt)=>{
console.log(row)
data.active = {
id: row.id,
nickName: row.nickName,
userName: row.userName,
role:row.role.map((value)=>value.role)
}
data.isShow = true
}
return {
......
changeUser
}
能够看到在对 active 赋值时,对 role 的赋值进行了一些处理。因为 active.role 的类型咱们规则的是数字的数组,和咱们传过来的row
中的 role 格局不同,咱们先将 传过来的row
打印下 :
对 row.role
咱们进行了处理,map()
办法回来一个新数组,数组中的元素为原始数组元素调用函数处理的后值。咱们只把 role 回来即可,roleName 咱们暂时不需要
然后咱们对 Dialog 的按钮进行处理,点击更新履行 updateUser 办法
const updateUser = ()=>{
console.log(data.active);
let obj:any = data.list.find((value)=>value.id==data.active.id)
obj.nickName = data.active.nickName
//data.active.role --> [1,2]
//roleList --> roleId --> 1,2
obj.role = data.roleList.filter(value => data.active.role.indexOf(value.roleId) !== -1)
//console.log(obj.role)
data.isShow = false
}
return {
...toRefs(data),
onSubmit,
changeUser,
updateUser
}
最终咱们处理bug,由于更新后 data.list 的 role 结构由 RoleInt 改为了 RoleListInt,所以还需要在展现 Dialog 时对其进行处理,否则修正后,再打开 Dialog 人物这里就展现不出来了
const changeUser = (row:ListInt)=>{
console.log(row)
data.active = {
id: row.id,
nickName: row.nickName,
userName: row.userName,
role:row.role.map((value:any)=>value.role || value.roleId)
}
data.isShow = true
}
最终运转结果: