[解决问题]vue el-table的data更新但页面没有及时渲染

前言

本来在网上找了一些解决方案,说给table加上key就可以,然后我试了一下发现显示的还是上次渲染的数据。然后循着这个路子摸出了另一个方法

捋思路

需求

  • 在一个表格内镶嵌一个表格,镶嵌的表格会根据所展开的行信息去发送请求并将最新数据渲染在页面上
  • 采取的是手风琴效果,即只显示一行的数据

问题

镶嵌表格的数据更新了,但是页面没有及时渲染

解决

  • 用模板<template>包裹镶嵌表格,并规定插槽作用域slot-scope="props"
  • 在镶嵌表格中,用:key="props.row.id"指明身份

手风琴及效果部分:

  • 用官方提供的expand-change方法,每次关闭或展开行都会触发
  • v-loading来增强效果(如果不加,可能会先看到原来的数据,效果不好)

代码实现

模板部分:

<el-table :data="tableData" border ref="orderTable"  @expand-change="expandChange">
        <el-table-column type="expand">
			   <template slot-scope="props">
					<el-table :data="tableInfoData" :key="props.row.id" v-loading="loading">
						<el-table-column label="份数" prop="number"/>
						<el-table-column label="订单号" prop="order_id"/>
						<el-table-column label="金额" prop="money">
						</el-table-column>	
					</el-table>
			   </template>
		    </el-table-column>
        <el-table-column prop="department" label="部门" />
        <el-table-column prop="username" label="姓名" />
        <el-table-column prop="phone" label="电话号码" />
</el-table>

data部分:

//主表格数据
tableData: [],

//镶嵌表格数据
loading:false,
tableInfoData:[],

methods部分:展开行获取数据

//第一个参数是展开的行数据;第二个参数是一个数组,里面是所有展开的行
async expandChange(row,expandRows){
  this.loading=true
  let id=row.id
  
  //定义展开行id
  let expandid=''
  
  //手风琴效果
  const $orderTable = this.$refs.orderTable
  if(expandRows.length>1){
    expandRows.forEach(expandRow=>{
      //拿刚刚点击的行与现目前展示的行作比较,id不一致即表示要关闭其他展开行
      if(id!==expandRow.id){
      	//toggleRowExpansion是官方提供的方法,用于改变某一行的展开状态
        $orderTable.toggleRowExpansion(expandRow, false)
      }
    })
  }else{
  	//获取展开行id
    expandid=expandRows[0].order_id
  }
  
  //请求镶嵌表格的数据,假设需要发送参数——展开行的id:
  const res = await getDetails({
    id:expandid,
  });
  if (res.msg === "ok") {
    this.tableInfoData = Array.from(res.data);
    this.loading=false
  }
},

其中getDetails是引入的方法:

export function getDetails(params) {
    const url = '...'
    return $axios.get(url, params)
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue是一种流行的JavaScript框架,用于构建用户界面。它采用了组件化的开发方式,使得开发者可以将页面拆分成独立的、可复用的组件。el-tableVue中的一个表格组件,而el-input是一个输入框组件。 在el-table中使用el-input进行行内校验的方法如下: 1. 首先,在el-table的每一行中使用el-input组件来渲染需要进行校验的单元格。 2. 在el-input上使用Vue的校验指令(如v-model和:rules)来实现校验功能。 3. 在Vue实例中定义校验规则,并将其应用到el-input上。 下面是一个示例代码: ```html <template> <el-table :data="tableData"> <el-table-column prop="name" label="姓名"> <template slot-scope="scope"> <el-input v-model="scope.row.name" :rules="nameRules"></el-input> </template> </el-table-column> <el-table-column prop="age" label="年龄"> <template slot-scope="scope"> <el-input v-model="scope.row.age" :rules="ageRules"></el-input> </template> </el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { name: '张三', age: 20 }, { name: '李四', age: 25 }, // ... ], nameRules: [ { required: true, message: '姓名不能为空', trigger: 'blur' }, // 其他校验规则 ], ageRules: [ { required: true, message: '年龄不能为空', trigger: 'blur' }, // 其他校验规则 ] }; } }; </script> ``` 在上述代码中,我们使用了el-table组件来展示数据,并在每一列中使用el-input组件进行编辑。通过给el-input组件绑定v-model指令,可以实现数据的双向绑定。同时,通过给el-input组件绑定:rules指令,可以定义校验规则。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值