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 ...
随机推荐
- Oracle与SQL Server等数据库的区别
Oracle与SQL Server等数据库的区别 在Oracle中提倡使用一个连接 Oracle处理多个并发语句使用一个连接,大大提升系统能支持的并发量 Oracle运行在32为单进程平台上SGA和P ...
- js删除对象里的某一个属性
var a={"id":1,"name":"danlis"}; //添加属性 a.age=18; console.log(a); //结果: ...
- python之路第一天
2018-07-11星期三 创建自己的博客(博客园): 登陆 我的博客 随笔:所有人在博客中都能看见的文章 文章:别人看不见,只能URL访问--我把网页地址发给你,你才能看到 日志:别人看不到,URL ...
- Flask入门很轻松 (一)
转载请在文章开头附上原文链接地址:https://www.cnblogs.com/Sunzz/p/10956837.html Flask诞生于2010年,是Armin ronacher(人名)用 Py ...
- 数据库开发-pymysql详解
数据库开发-pymysql详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Python支持的MySQL驱动 1>.什么是驱动 与MySQL通信就是典型的CS模式.Se ...
- Good Numbers(HDU5447+唯一分解)
题目链接 传送门 题面 题意 首先定义对于\(k\)的好数\(u\):如果\(u\leq k\)且\(u\)的所有质因子与\(k\)的质因子一样则称\(u\)对于\(k\)是一个好数. 现给你两个数\ ...
- oracle plsql 实现apriori算法
对apriori关联关系算法研究了一段时间,网上能搜到的例子,大部分是python写的,数据集长得像下面这样: [[I1,I2,I5],[I2,I4],[I2,I3],[I1,I2,I4],[I1,I ...
- 【Servlet】基于Jsp的微信Oauth2认证
作者:yongh701 挂载到微信服务器上的应用程序,能够通过微信Oauth2认证,能够抓取到用户的微信信息,当然,你首先要通过微信的帐号资质审核. 一.基本思想 二.基本过程 1.登陆微信的公众平台 ...
- django-签名加密模块It's dangerous--加密token
https://juejin.im/entry/56b30250df0eea0054375e1d 安装 pip install itsdangerous 使用 from itsdangerous im ...
- Haskell语言学习笔记(94)Enum Bounded
Enum class Enum a where succ, pred :: a -> a toEnum :: Int -> a fromEnum :: a -> Int enumFr ...