以下代码是基于若依框架对侧边栏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>
运行结果如图:
预期效果如图(没有执行axios异步请求,直接写死数据查看预期效果):
尝试过整个侧边栏等待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>