当前位置: 首页 > 知识库问答 >
问题:

javascript - 调用接口数据没成功的渲染在表格上?

海岳
2024-08-30
<template>
  <!-- <div class="dialog"> -->
    <!-- 控制弹窗显示/隐藏 -->
    <el-dialog v-model="props.visible" v-if="props.visible">
      <div class="dialog_content">
        <div class="dialog_content_title"> {{ props.title }}</div>
        <div class="main">
          <div class="join-detail">
            <div class="table-wrap">
              <el-table v-if="tableData" ref="tableRef" :data="tableData" height="100%" class="custom-table" stripe>
                <el-table-column :label="areaTitleName" prop="areaName" fixed width="130">
</el-table-column>
              </el-table>
              <el-table v-else ref="tableRef" id="tableRef" :data="tableData" height="100%" class="custom-table" stripe> <el-table-column label="计划场次" prop="planSession" sortable="planSession" align="center">
                  <template #default="scope">
                    <span class="area-span">
                      <span
                        :class="data.areaHistoryList[data.areaHistoryIndex].level == 'cq' && !data.areaHistoryList[data.areaHistoryIndex].rankType ? '' : 'area-name'"
                        @click="showConversion(scope.row, '1')">{{ scope.row.planSession ?? '--' }}</span>
                    </span>
                  </template>
                </el-table-column>
                <el-table-column label="执行场次" prop="executeSession" sortable="executeSession" align="center">
                  <template #default="scope">
                    <span class="area-span">
                      <span
                        :class="data.areaHistoryList[data.areaHistoryIndex].level == 'cq' && !data.areaHistoryList[data.areaHistoryIndex].rankType ? '' : 'area-name'"
                        @click="showConversion(scope.row, '2')">{{ scope.row.executeSession ?? '--' }}</span>
                    </span>
                  </template>
                </el-table-column>
                <el-table-column label="有效场次" prop="validSession" sortable="validSession" align="center">
                  <template #default="scope">
                    <span class="area-span">
                      <span
                        :class="data.areaHistoryList[data.areaHistoryIndex].level == 'cq' && !data.areaHistoryList[data.areaHistoryIndex].rankType ? '' : 'area-name'"
                        @click="showConversion(scope.row, '3')">{{ scope.row.validSession ?? '--' }}</span>
                    </span>
                  </template>
                </el-table-column>
             
                <el-table-column v-for="(item, index) in tableColumnList" :key="index" :prop="item.prop"
                  :label="item.label" :width="item.width" :sortable="item.sortable" align="center">
                  <template #default="scope">
                    <div class="hb">
                      <span>{{ scope.row[item.prop] || '--' }}</span>
                      <!-- 滑动条 -->
                      <img v-if="item.isArrow && comFun.formatRate(scope.row[item.prop]) > 0"
                        src="@/assets/images/leader-board/up.png" alt="">
                      <img v-if="item.isArrow && comFun.formatRate(scope.row[item.prop]) < 0"
                        src="@/assets/images/leader-board/down.png" alt="">
                    </div>
                  </template>
                </el-table-column>
              </el-table>
            </div>
            <!-- 分页 -->
            <div class="page">
              <el-pagination size="small" layout="prev, pager, next" :total="50" />
            </div>
          </div>
        </div>
      </div>
    </el-dialog>
  ------------------------------------------------------------------------
 
<script lang="ts" setup>
import { onMounted, ref, defineProps, getCurrentInstance, toRaw } from 'vue';
import Api from "@/assets/Apis/api.js";
import type { dataTypeStore } from '@/stores/business_develop/dataType';
import { useUserStore } from "@/stores/strongfd-board/user-strongfd"
import { reactive } from "vue";
import * as options from './tableOptions.js'
import { result } from 'lodash';
//定义了组件接受的属性
const props = defineProps(
  {
    title: {
      type: String,
      default: ''
    },
    sessionType: {
      type: String,
      default: ''
    },
    planObj: {
      type: Object,
      default: {}
    },
    visible: {
      type: Boolean,
      default: false,
    }
 
 
  })
const { proxy } = getCurrentInstance()
const tableColumnList = ref([])
const curSortObj = ref({
  asc: null,
  field: '' //存储当前排序的字段名
})
//存储和显示表格的数据
const tableData = ref([
 
])
const tableRef = ref(null)
const data = reactive({
  areaHistoryList: [0], //用于存储区域历史记录
  areaHistoryIndex: 0,  //录当前区域历史记录的索引位置。
})
// 确保 areaHistoryIndex 不为 undefined
if (data.areaHistoryIndex === undefined) {
  data.areaHistoryIndex = 0;
}
const pageNum = ref(1)
const user = useUserStore()
const fetchData = () => {
  const { dateType, date, level, code } = user.userState
  const { rankType } = data.areaHistoryList[data.areaHistoryIndex]
  const params = {
    rankType: rankType ? rankType : '',
    // endDate: endDate,
    // beginDate: beginDate,
    pageNum: pageNum.value,
    dateType,
    areaLevel: level,
    areaCode: code,
    wjdhType: 'community',
    orderBy: curSortObj.value['field'],
    asc: curSortObj.value['asc'],
  }
  if (user.userState.dateType == 'C') {
    params.beginDate = date[0]
    params.endDate = date[1]
  } else {
    params.dateStr = date
  }
  //区域编码传递参数
  proxy.$post(Api.lightSecond.dataList, params).then(res => {
    tableData.value = res.result.list;
    //2:查看是否有返回至,以及哪些返回值
    console.log( tableData.value)
  });
  
 
 
};
//监听fetchData
proxy.$watch(() => user.userState, fetchData, { deep: true });
const showPlanListDialog = ref(false)
const sessionType = ref('1')
const planName = ref('')
const planObj = ref({})
// 展示场次
const showConversion = (item, type) => {
  debugger
  const { dateType, date, level, code } = user.userState
  if(level == 'cq' && !rankType){
    return
  }else{
    planObj.value = item
    sessionType.value = type
    planName.value = item.areaName + (type == '1' ? '计划场次': type == '2' ? '执行场次' : '有效场次')
    showPlanListDialog.value = true
  }
}
onMounted(() => {
  const init = () => {
 
  tableData.value = []
  
}
  fetchData();
  tableColumnList.value = options.marketingTransfer
  data.areaHistoryList.push({
    level: user.userState.level,
    code: user.userState.code,
    name: user.userState.name
  })
 
});
</script>

这是我运行出来的图
image.png
这是我想要的图
image.png

希望从接口拿到的数据成功的渲染在表格上面

共有1个答案

狄阳华
2024-08-30

根据你提供的信息和代码片段,有几个可能的原因导致接口数据没有成功渲染在表格上。以下是一些可能的问题及解决方案:

1. 检查接口返回的数据

首先,确保接口确实返回了你期望的数据格式。你可以通过查看网络请求的响应(通常在浏览器的开发者工具中的Network标签页)来确认这一点。确保res.result.list确实包含了有效的数据,并且这些数据格式与你的<el-table><el-table-column>中定义的prop属性相匹配。

2. 验证tableData的数据

在你的代码中,你通过tableData.value = res.result.list;来更新表格数据。确保res.result.list不是undefined或空数组。你可以在赋值后使用console.log(tableData.value)来检查数据是否正确。

3. 检查v-ifv-else的使用

你的代码中使用了v-if="tableData"v-else来控制<el-table>的渲染。这意味着如果tableDatafalseundefinednull、空数组或空对象等“假值”时,表格将不会渲染。由于你默认将tableData设置为空数组[],这实际上是一个“真值”,因此这个条件应该不是问题。但如果res.result.listnullundefined,则可能导致问题。

4. 确保el-table的响应性

由于你使用了Vue 3的Composition API,确保你正确地处理了响应性。在你的代码中,tableData已经是一个响应性引用(ref),所以这部分应该是正确的。

5. 检查表格列定义

确保你的<el-table-column>prop属性与tableData中的对象属性完全匹配(包括大小写)。

6. 异步数据加载

由于你是在onMounted钩子中调用fetchData来获取数据,这意味着数据是异步加载的。如果数据加载和组件渲染之间存在竞争条件,可能会导致在数据到达之前表格就已经渲染了空数据。然而,由于你使用了v-if="tableData",这实际上应该阻止了这种情况的发生(尽管如之前所述,空数组是“真值”)。

7. 调试和错误处理

fetchData函数中添加错误处理逻辑,以便在请求失败时能够捕获错误并相应地处理它们。这可以通过在.then()之后添加一个.catch()来实现。

8. 刷新或重新加载数据

如果数据在页面加载后可能发生变化,确保你有一种机制来重新加载或刷新数据。

9. 清理和简化代码

你的代码中有一些可能不必要的复杂性和冗余(如data.areaHistoryList的初始化和处理)。尝试清理和简化代码,以便更容易地找到和解决问题。

结论

最有可能的问题是接口返回的数据不是你期望的格式,或者res.result.list是空的或未定义的。检查这些点,并相应地调整你的代码和请求。如果问题仍然存在,请考虑在控制台中输出更多的调试信息来进一步诊断问题。

 类似资料:
  • 本文向大家介绍javascript表格的渲染组件,包括了javascript表格的渲染组件的使用技巧和注意事项,需要的朋友参考一下 表格的渲染组件,demo请点击http://lovewebgames.com/jsmodule/table.html,git源码请点击https://github.com/tianxiangbing/table 如上图所示,功能基本包括常用表格中遇到的分页、搜索、删除

  • 问题一、当"串口输出id"和"报文/频率" 。分别需要两个接口来获取对应的数据,第一个接口是获取id的接口,第二个接口是需要将id传值给第二接口才会返回"报文/频率"的内容,请问大佬们我该如何才能实现获取两个不同的接口数据在el-table内显示呢? 我试着将两个接口分别不同的请求,来获取不同的字段数据,但是第二个接口返回的数据渲染在表格里,会把第一个返回的id给替换掉? 问题二、下面这是第二个接

  • 根据数据库里面获取到的数据信息渲染表格,起初根据数据结构生成了四列,但是由于后续数据库里面会有数据结构上的变化,会增加字段,那我要如何在表格中去追加这部分新数据,从而在前端渲染出一个新的表格————就是说原来四列变六列,并把对应数据也一同渲染上去。

  • 问题内容: 最近,我问了一个问题,其中有一个很明显的答案。我仍在同一个项目上,遇到另一个问题。我需要实现每帧逻辑,并且该协议在iOS上工作得很好,但是在OSX上,该功能未触发。我创建了一个小示例项目来说明我的问题。它由情节提要中的Scene Kit视图和该类中的以下代码组成: 我想要的基本上是每帧移动立方体。但是什么也没发生。什么是奇怪的是,当我设置到时,每当我点击或在屏幕上拖动(这是有道理的,因

  • 后端返回数据格式无法进行修改,都是双引号转义符, 根据以上代码期待转成下面格式

  • echarts图表渲染不出来,查看元素canvas标签都没有。 需求:在表格内点击生成echart图 解决:表格数据渲染,其中一列判断为csv属性后,实现在单元格内点击文字,触发dialog弹窗,弹窗中显示echart图表。 模板: data: dialogTableVisible: false methods: 渲染出来了(可能一开始就渲染出来没注意到),但是弹窗上不显示,而是后面阴影部分显示出

  • 问题内容: 渲染模板后如何运行方法?我要设置和之后,我需要使用JQuery进行更改(例如,在模板内容的DOM中)。正在“之前”渲染工作(模板的DOM尚不可用)。谢谢。 问题答案: 创建在链接函数中运行代码的指令。构建模板后,将调用链接功能。 请参阅ng-click以获取想法。

  • vue 3 Chartjs未从API动态呈现数据 目前,我正在开发vue 3,我是新来的。我添加了一个图表从官方chartjs留档我添加了图表的数据栏从API和它的工作正常一切都呈现但每当我尝试更新相同的数据栏到另一个字段它不是呈现图表但图表接收数据但不是渲染 这是来自API的JSON数据 这就是我调用api的方式 我想根据Ward 1从上面的JSON数据更新数据,但每当我从API更新数据时,图表