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 ...
 
随机推荐
- JAVA基础之事务
			
世界万事无简单一说, 每个事情基本上由多个小的事情来完成.有的事情会存在若小的事情不能同时完成的情况就取消所有的小的事情,直至都完成达到预期的效果才算完成!这样就用到了事务操作.在所有的sql语句完成 ...
 - 有价证券secuerity英语
			
证券业 证券业是为证券投资活动服务的专门行业.各国定义的证券业范围略有不同.按照美国的 “产业分类标准”,证券业由证券经纪公司.证券交易所和有关的商品经纪集团组成.证券业在世界各国都是一个小的产业部门 ...
 - EXPORT_SYMBOL
			
EXPORT_SYMBOL只出现在2.6内核中,在2.4内核默认的非static函数和变量都会自动导入到kernel 空间 作用 EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开, ...
 - Spring+Velocity+Mybatis入门(step by step)
			
一.开发工具 开发过程中使用的操作系统是OS X,关于软件安装的问题请大家移步高效的Mac环境设置. 本文是我对自己学习过程的一个回顾,应该还有不少问题待改进,例如目录的设置.编码习惯和配置文件的处理 ...
 - python文字转语音
			
使用百度接口 接口地址 https://ai.baidu.com/docs#/TTS-Online-Python-SDK/top 安装接口 pip install baidu-aip from aip ...
 - Linux指令(时间日期类)
			
date指令-显示当前日期 基本语法: 1)date (功能描述:显示当前时间) 2)date +%Y (功能描述:显示当前年份) 3)date +%m (功能描述:显示当前月份) 4)date +% ...
 - tree - 列出树状目录结构
			
tree - list contents of directories in a tree-like format. 树状显示目录结构 常用格式: tree [option] [directory] ...
 - The Instruction Set In Cortex-M3
			
The Cortex-M3 supports the Thumb-2 instruction set. This is one of the most important features of th ...
 - Linux操作系统-CentOS6启动流程和服务管理
			
Linux操作系统-CentOS6启动流程和服务管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux组成 1>.Linux: kernel+rootfs ker ...
 - php string常用函数
			
<?php $a[]='a'; $a[]='b'; $a[]='C'; echo "</br>"; /* implode — 将一个一维数组的值转化为字符串 说明 ...