vue 菜单异步的问题请教!我估计是异步的问题
import { storeToRefs } from 'pinia';
import useStore from '../store';
const { menuLeft } = useStore()
const { menuLeftData } = storeToRefs(menuLeft)
const { getDataMenuLeft } = menuLeft // pinia store 向数据库调用数据的函数
onBeforeMount(() => {
getDataMenuLeft('work_group/') // 从后端数据库获取 菜单数据,这里控制台 后出来
})
onMounted(()=>{
menuLeftInit(1) // 初始化菜单, 这里控制台 先出来
})
现在问题是 控制台显示, 先执行了 初始化菜单 函数,然后才读到了 菜单数据,
正常进入没问题,当点右键刷新时,菜单就混乱了。
import { defineStore } from "pinia";
import { MenuLeft, Themes} from '../../types/data'
import { getMethod, postMethod } from '../../api/myHttp'
const menuLeftStore = defineStore('meunLeft',{
state:()=>{
return {
menuLeftData : [] as Array<MenuLeft>,
}
},
actions:{
async getDataMenuLeft(url:string){
await getMethod(url).then(res=>{
console.log('sssssssss11111111111111111',res) // 这里控制台 后面才出来
this.menuLeftData = res.data.menu
})
}
}
})
看题主代码用到了async+Promise对象,应该还是没完全理解,可以看下阮一峰老师的教程
更改下代码结构确保数据加载完毕后再执行初始化操作就能解决
。用下面2中方法之一。
async getDataMenuLeft方法异步
,会返回promise实例,在then中执行初始化能确保数据已经获取到从而能正确初始化
onMounted(() => {
getDataMenuLeft('work_group/').then(() => {
menuLeftInit(1)
})
});
onMounted(async () => {
await getDataMenuLeft('work_group/');
menuLeftInit(1)
});
getDataMenuLeft('work_group/') 不要放onBeforeMount中,应该放onMounted中
改成这样
onMounted(()=>{
getDataMenuLeft('work_group/').then(()=>{
menuLeftInit(1) // 初始化菜单, 这里控制台 先出来
});
})
或者
onMounted(async ()=>{
await getDataMenuLeft('work_group/')
menuLeftInit(1) // 初始化菜单, 这里控制台 先出来
})
99999
onMounted 里加载实现
改成getDataMenuLeft('work_group/').then(()=>{
menuLeftInit(1)
});
onMounted(()=>{
menuLeftInit(1) // 初始化菜单, 这里控制台 先出来
})
改为
onMounted(()=>{
this.$nextTick(()=>{
menuLeftInit(1) // 初始化菜单, 这里控制台 先出来
}
})
你看这样可以不
onBeforeMount DOM还没渲染完就开始加载接口渲染,页面肯定会有问题,改成onMounted,页面完成后再试试
onMounted 中可以得到 ref的RefImpl的对象, 通过.value 获取真实dom
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!onBeforeMount dom元素还未完成挂载