vue+elementui搭建后台管理界面(8 同步/异步获取数据渲染table)
elementui已经封装好了 el-table 组件,只需要指定 data 数据源即可,因此通常在 vue 实例生命周期的 created 阶段,从数据库获取数据,再将返回的数据绑定到 data
如果后端同学能直接返回前端需要展示的所有数据,那么前端只需要请求一次,多么的和谐,多么完美。
然而凡事皆有例外,比如在已有的table表格增加若干列,而数据从不同的源获取,这时候再修改功能已经完善的接口显然不明智,那么前端使用同步或异步请求来获取数据是比较好的方案。
同步
例如一个文章接口只返回了文章id、作者、内容、创建时间等信息,而前端需要展示作者昵称、签名等,这些信息要从另一个接口获取。
解决方式
- 获取全部文章列表,保存到变量 list
- 对 list 的 author 字段去重后发起请求,此请求返回promise
- promise 链式调用完毕,将 list 绑定到 el-table组件
典型应用: 由promise 链式调用,当全部请求成功后再展示内容,任一步骤失败则请求的数据不完整,视为请求失败。
核心代码
<el-table
v-loading="listLoading"
:data="list"
border
fit
>
<el-table-column label="昵称"
min-width="100"
align="center">
<template slot-scope="scope">
<span v-if="userInfo[scope.row.author]">{{ userInfo[scope.row.author].nickname }}</span>
<span v-else> - </span>
</template>
</el-table-column>
created() {
this.getList()
},
methods: {
getList() {
// 先获取帖子信息,再根据帖子信息查找用户信息和帖子详情
this.listLoading = true // 很重要,在所有数据返回前,页面要一直显示 loading
let list = []
let total = 0
getArticleListApi(this.listQuery)
.then(response => {
list = response.data.items
total = response.data.total
return this.getAuthorInfo(list)
})
.then(() => {
this.list = list
this.total = total
// 这里成功获取了作者信息, loading 结束
this.listLoading = false
})
.catch(err => {
this.listLoading = false
if(err === 'CANCELD_BY_USER'){
return
}
FetchDataNotifyWarning(err, 3)
})
},
// 获取用户信息
getAuthorInfo(list){
// 根据用户ID获取昵称、个性签名、帐号状态等信息
const _this = this
let users = new Set(list.map(v => v.author))
let promises = []
function promiseFunc(id){
return new Promise((resolve, reject) => {
getAccountInfoApi(id)
.then(resp => {
_this.userInfo[id] = resp.data.data
resolve()
})
.catch(err => {
// 忽略可能获取不到用户的错误
resolve()
})
})
}
users.forEach(id => {
if(id){
promises.push(promiseFunc(id))
}
})
return Promise.all(promises)
},
}
异步
典型应用: 先展示所有文章信息,每一行增加一个镜像字段,如: _async_label ,请求成功后更新该字段内容,失败则更新为特定字符,如 '-' 。
核心代码
<el-table-column label="标签"
min-width="100"
align="center">
<template slot-scope="scope">
<span>{{ scope.row._async_label }}</span>
</template>
</el-table-column>
methods: {
getList() {
this.listLoading = true
this.fetchData(this.listQuery)
.then(response => {
let tablist = response.data.items
let total = response.data.total
// 异步显示文章标签
tablist.forEach(item => {
item._async_label = ''
})
this.list = tablist
this.total = total
this.getLabel()
// 这里 loading 结束,页面上可以看到表格了
this.listLoading = false
})
.catch(err => {
this.$notify.warning({
message: err || '未获取到相关信息,请刷新页面或稍候再试',
duration: 3 * 1000,
})
this.listLoading = false
})
},
// 获取 文章标签
getLabel(){
this.list.forEach(item => {
getArticleLabelApi(item.articleId)
.then(resp => {
item._async_label = resp.data.val
})
.catch(()=>{
item._async_label = '-'
})
})
},
}
vue+elementui搭建后台管理界面(8 同步/异步获取数据渲染table)的更多相关文章
- vue+elementui搭建后台管理界面(7 vuex和mockjs的使用)
将权限管理应用到系统,首先做好登录, 点击登录按钮后,触发以下动作 vuex 中的 login 动作,设置 cookie vuex 中的 getuserinfo , 获取权限.用户名.头像等 由于目前 ...
- vue+elementui搭建后台管理界面(2首页)
1 会话存储 使用html5的 sessionStorage 对象临时保存会话 // 保存会话 sessionStorage.setItem('user', username) // 删除会话 ses ...
- vue+elementui搭建后台管理界面
1 会话存储 使用html5的 sessionStorage 对象临时保存会话 // 保存会话 sessionStorage.setItem('user', username) // 删除会话 ses ...
- vue+elementui搭建后台管理界面(1登录)
1 node环境安装 从 node官网下载安装包 2 vue-cli npm install vue-cli -g 3 新建项目 vue init webpack vue-project 可保持默认, ...
- vue+elementui搭建后台管理界面(6登录和菜单权限控制)
不同的权限对应不同的路由(菜单),同时侧边栏也根据权限异步生成,实现登录和鉴权思路如下: 登录:点击登录,服务器验证通过后返回一个 token ,然后存到 cookie,再根据 token 拉取用户权 ...
- vue+elementui搭建后台管理界面(5递归生成侧栏路由)
有一个菜单树,顶层菜单下面有多个子菜单,子菜单下还有子菜单... 这时候就要用递归处理 1 定义多级菜单 修改 src/router/index.js 的 / 路由 { path: '/', redi ...
- vue+elementui搭建后台管理界面(3侧边栏菜单)
上一节搭好了主框架,但是标签页和侧边栏只是分别展示了各自的菜单,如何将二者联动起来? 定义路由规则:当有 children 属性时,从 children 里取出 path 填充到侧边栏,如: { pa ...
- vue+elementui搭建后台管理界面(6登录和菜单权限控制[二])
根据权限计算路由的代码 /** * 通过meta.role判断是否与当前用户权限匹配 * @param roles * @param route */ function hasRoles (roles ...
- vue+elementui搭建后台管理界面(4使用font-awesome)
使用font-awesome npm install --save font-awesome 修改 src/main.js 增加 import 'font-awesome/scss/font-awes ...
随机推荐
- Kali 2019(debian linux)安装MySql5.7.x
Kali 2019(debian linux)安装MySql5.7.x MySQL安装 确认是否安装MySQL 终端输入:mysql 如出现Welcome to the MariaDB monitor ...
- 利用position absolute使div居中
外层DIV{position:realtive}内层DIV{positon:absolute;top:50%;left:50%;margin-top:-100px;margin-left:-150px ...
- 嵌入式应用开发第四阶段-基于rk3399的视频监控系统
一.需求分析 伴随着嵌入式技术.图像处理技术和无线网络传输技术的发展,传统模拟视频监控系统和基于PC的远程视频监控系统由于自身的不足,已经无法满足现代社会应用中不断涌现出来的新需求,于是基于嵌入式技术 ...
- 结对项目(python) 黄浩伟 黄飞越
作者:黄浩伟 黄飞越 一 .Github项目地址: https://github.com/Flying123haha/123.git 二.psp表格: PSP2.1 Personal Softwar ...
- ubuntu 下 VNC Viewer 通过网线连接树莓派的网络设置
1 本机环境 Ubuntu 19.10 Raspberry 3B+ (Raspbian.开启了 vnc 服务) 2 Ubuntu 网络设置 1. Identity 下选择 Mac Address(如: ...
- Ceph添加、删除osd及故障硬盘更换
添加或删除osd均在ceph部署节点的cent用户下的ceph目录进行. 1. 添加osd 当前ceph集群中有如下osd,现在准备新添加osd: (1)选择一个osd节点,添加好新的硬盘: (2)显 ...
- NGINX状态模块的使用
nginx状态模块可以用来查看当前nginx服务器的并发量和总的请求数 启用nginx的状态模块 状态模块需要在编译安装的时候启用. 1.下载nginx源码包 2.安装nginx并启用模块 3.修改n ...
- beta版本——第二次冲刺
第二次冲刺 (1)SCRUM部分☁️ 成员描述: 姓名 唐财伟 完成了哪个任务 搭建Nginx 花了多少时间 3h 还剩余多少时间 0h 遇到什么困难 解决端口冲突,启动报错等问题 这两天解决的进度 ...
- 一套兼容win和Linux的PyTorch训练MNIST的算法代码(CNN)
第一次,调了很久.它本来已经很OK了,同时适用CPU和GPU,且可正常运行的. 为了用于性能测试,主要改了三点: 一,每一批次显示处理时间. 二,本地加载测试数据. 三,兼容LINUX和WIN 本地加 ...
- 聚类------KNN
import numpy as np from math import sqrt import operator as opt def normData(dataSet): maxVals = dat ...