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 ...
随机推荐
- 英语Petrolaeum原油
Petrolaeum (英语单词) Petrolaeum是一个英语单词,名词,翻译为石油. 中文名:石油 外文名:petrolaeum,petroleum 目录 1 含义 2 例句 含义 petrol ...
- 11g包dbms_parallel_execute在海量数据处理过程中的应用
11g包dbms_parallel_execute在海量数据处理过程中的应用 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也 ...
- 小米8seroot后更改hosts文件记录
1.先备份原有文件,在设置中有个备份与恢复,可以备份,备份后链接电脑,传电脑上 2.下载开发版miui,安装 3.解bl锁,先到官网申请,按照提示操作. 4.备份文件传到手机,恢复文件 5.获得roo ...
- centos8 网络配置
目录 centos8已经发布了,下载了一个体验一下,新安装好的centos8默认网卡是没有启动的,安装好后需要先配置网络.在/etc/sysconfig/network-scripts目录下存放着网卡 ...
- 如何用 DHCP + DNS + Web 实现一个网络架构
为什么?为什么?为什么在浏览器里输入www.baidu.com就可以访问百度搜索,而输入pan.baidu.com就可以访问百度网盘,它是怎么实现的? 实验原理简介 在Internet中,计算机之间通 ...
- 【Docker】docker安装mysql
一.下载镜像并运行容器 docker run -p 3306:3306 --name mymysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs ...
- Tarjan算法分解强连通分量(附详细参考文章)
Tarjan算法分解强连通分量 算法思路: 算法通过dfs遍历整个连通分量,并在遍历过程中给每个点打上两个记号:一个是时间戳,即首次访问到节点i的时刻,另一个是节点u的某一个祖先被访问的最早时刻. 时 ...
- selenium常用的API(五)获取title、刷新、前进和后退
获取网页title的属性值 #encoding=utf-8 from selenium import webdriver import unittest import time class Visit ...
- Spring Boot-初学01 -使用Spring Initializer快速创建Spring Boot项目 -@RestController+spEL -实现简单SpringBoot的Web页面
1.IDEA:使用 Spring Initializer快速创建项目 IDE都支持使用Spring的项目创建向导快速创建一个Spring Boot项目: 选择我们需要的模块:向导会联网创建Spring ...
- git和bootstrap
在linux系统中某种类型的服务有没有启动:ps -ef|grep 对应的服务名称 然后修改gitlab中的两个配置文件的信息 一般情况下是先创建组,然后在创建项目 常见的协议有http协议 ss ...