Mr__Wind 2023-06-25 14:43 采纳率: 0%
浏览 18

vue2在render函数中通过axios异步获取数据渲染侧边栏不成功问题

以下代码是基于若依框架对侧边栏sidebar做的修改,并且项目为vue2项目,在title为待办消息时发送axios请求得到消息数,前端能够发送请求到后端并且得到消息数,但是侧边栏只显示空白菜单不显示“待办消息”和提示消息数,初步猜测是render函数没有等待异步请求完成,就已经完成了渲染

<script>
import pendingMsgApi from "@/api/business/pendingMsg";
export default {
  name: 'MenuItem',
  functional: true,
  props: {
    icon: {
      type: String,
      default: ''
    },
    title: {
      type: String,
      default: ''
    }
  },
  render(h, context) {
    const { icon, title } = context.props
    const vnodes = []
    let pendingMsg = 0;
    if (icon) {
      vnodes.push(<svg-icon icon-class={icon}/>)
    }
    if (title) {
      if (title.length > 5) {
        vnodes.push(<span slot='title' title={(title)}>{(title)}</span>)
      } else {
        if (title !== '待办消息') {
          vnodes.push(<span slot='title'>{(title)}</span>)
        } else {
          //是待办消息,需要判断待办消息条数
          pendingMsgApi.getPendingMsgCount().then(response => {
            console.log("待办信息数:" + response);
            pendingMsg = response;
            if (pendingMsg !== 0) {
              debugger
              vnodes.push(<span slot='title'>{(title)}<el-badge value={pendingMsg} class="item"></el-badge></span>)
            } else {
              vnodes.push(<span slot='title'>{(title)}</span>)
            }
          }).catch(error => {
            console.error(error)
          })
        }
      }
    }
    return vnodes
  }
}
</script>

运行结果如图:

img

预期效果如图(没有执行axios异步请求,直接写死数据查看预期效果):

img

尝试过整个侧边栏等待axios完成请求,但是会导致整个侧边栏都得不到渲染,虽然能拿到各个菜单名,但是没法渲染进去。

尝试封装异步请求 ,能够显示“待办消息”,也能够从后台拿到消息数据,但是无法显示待办消息数

<script>
import pendingMsgApi from "@/api/business/pendingMsg";

export default {
  name: 'MenuItem',
  functional: true,
  props: {
    icon: {
      type: String,
      default: ''
    },
    title: {
      type: String,
      default: ''
    }
  },

  render(h, context) {
    const { icon, title } = context.props
    const vnodes = []
    let pendingMsg = 0;

    if (icon) {
      vnodes.push(<svg-icon icon-class={icon}/>)
    }

    if (title) {
      if (title.length > 5) {
        vnodes.push(<span slot='title' title={(title)}>{(title)}</span>)
      } else {
        if (title !== '待办消息') {
          vnodes.push(<span slot='title'>{(title)}</span>)
        } else {
          //是待办消息,需要判断待办消息条数
          // getMsgCount()
          vnodes.push(
            <span slot="title">{(title)}{pendingMsg ? <el-badge value={pendingMsg} class="item"></el-badge> : null}</span>
          );
        }
      }
    }

    function getMsgCount() {
      pendingMsgApi.getPendingMsgCount().then(response => {
        console.log("待办信息数:" + response);
        pendingMsg = response;
      }).catch(error => {
        console.error(error)
      })
    }

    return vnodes
  }
}
</script>
  • 写回答

2条回答 默认 最新

  • 诚实可靠王大锤 2023-06-25 14:57
    关注

    其他的不说,你这个后台请求肯定是异步执行的,对于代码执行结果来说,肯定是retrun vnodes先执行,pendingMsgApi.getPendingMsgCount().then是后执行的,所以这里的代码不太会影响到渲染,,建议抽出,通过生命周期去实现

    评论

报告相同问题?

问题事件

  • 修改了问题 6月25日
  • 创建了问题 6月25日

悬赏问题

  • ¥15 系统 24h2 专业工作站版,浏览文件夹的图库,视频,图片之类的怎样删除?
  • ¥15 怎么把512还原为520格式
  • ¥15 MATLAB的动态模态分解出现错误,以CFX非定常模拟结果为快照
  • ¥15 求高通平台Softsim调试经验
  • ¥15 canal如何实现将mysql多张表(月表)采集入库到目标表中(一张表)?
  • ¥15 wpf ScrollViewer实现冻结左侧宽度w范围内的视图
  • ¥15 栅极驱动低侧烧毁MOSFET
  • ¥30 写segy数据时出错3
  • ¥100 linux下qt运行QCefView demo报错
  • ¥50 F1C100S下的红外解码IR_RX驱动问题