vue elementui異步給dom賦值無(wú)效問題
vue elementui異步給dom賦值無(wú)效
最近在研究el-admin,角色管理里面有個(gè)功能是點(diǎn)擊左側(cè)的表格里面的一個(gè)角色,右側(cè)的樹就會(huì)自動(dòng)初始化。
于是我在點(diǎn)擊的方法里面,去后臺(tái)異步調(diào)用了一下接口,然后返回?cái)?shù)據(jù)并把數(shù)據(jù)賦值給menuIds,但是我發(fā)現(xiàn)這個(gè)異步請(qǐng)求獲取到的數(shù)據(jù)壓根就不能讓樹控件刷新。
代碼如下:
我是在handleCurrentChange里面操作的,網(wǎng)上說通過push方法能夠起作用,但是根本沒用,最后我的解決方法如下,先將ids都存儲(chǔ)起來(lái),然后再在nextTick方法里面去給menuIds賦值。
async initMenus(val) { this.menuIds = [] const AV = window.AV const role = AV.Object.createWithoutData('Role', val.objectId); const roleMenuQuery = new AV.Query('RoleMenu'); roleMenuQuery.equalTo("role", role) roleMenuQuery.include("menu") var roleMenus = await roleMenuQuery.find() var ids = []; roleMenus.forEach(roleMenu => { var roleMenuJson = roleMenu.toJSON() ids.push(roleMenuJson.menu.menuId) }) this.$nextTick(() => { this.menuIds = ids; }) // https://blog.csdn.net/xudalin/article/details/103158941 // 這個(gè)代碼解決了樹控件的半選問題。參考鏈接如上 /*ids.forEach((i, n) => { var node = this.$refs.menu.getNode(i); console.log(node.isLeaf) if (node.isLeaf) { this.$refs.menu.setChecked(node, true); } });*/ }, // 觸發(fā)單選 handleCurrentChange(val) { console.log("handleCurrentChange") if (val) { const _this = this // 清空菜單的選中 this.$refs.menu.setCheckedKeys([]) // 保存當(dāng)前的角色id this.currentId = val.id // this.showButton = this.level <= val.level // 初始化 this.initMenus(val) // 菜單數(shù)據(jù)需要特殊處理 /*val.menus.forEach(function (data, index) { _this.menuIds.push(data.id) })*/ } },
vue elementui前端異步方法轉(zhuǎn)同步
elementui的表單驗(yàn)證功能
表單驗(yàn)證方法如果傳入回調(diào)函數(shù)時(shí)是異步的
// 子組件的方法 validateForm(){ this.$refs.jsonEditor.getRef("form").validate((valid, hints) => { return {valid: valid, hints: hints} }) } // 父組件調(diào)用,會(huì)發(fā)現(xiàn)校驗(yàn)結(jié)果,hints為undefine submitAll(){ this.$refs.resourceEditorRef.forEach((item, index) => { console.log(item.validateForm()) }) }
修改成同步的
// 子組件方法 validateForm(){ // this.$refs.jsonEditor.getRef("form").validate((valid, hints) => { // return {valid: valid, hints: hints} // }) // return new Promise((resolve, reject) => { // this.$refs.jsonEditor.getRef("form").validate((valid, hints) => { // resolve({valid, hints}) // }) // }) //或者根據(jù)官網(wǎng)文檔說明可以不傳入回調(diào)函數(shù),直接validate return this.$refs.jsonEditor.getRef("form").validate }, // 父組件調(diào)用 submitAll(){ // this.$refs.resourceEditorRef.forEach((item, index) => { // console.log("校驗(yàn)結(jié)果", item.validateForm()) // }) this.$refs.resourceEditorRef.forEach(async (item, index) => { let {valid, hints} = await item.validateForm() console.info(valid, hints) console.log("校驗(yàn)結(jié)果", hints) }) }
但是其實(shí)上面 submitAll 的 forEach 是有問題, 需要改成傳統(tǒng)的for遍歷, 因?yàn)?forEach 的入?yún)⑹且粋€(gè)回調(diào)函數(shù) , 簡(jiǎn)單的說就是執(zhí)行 forEach 后會(huì)馬上執(zhí)行forEach后面的代碼
所以修改成普通的for , 使用普通 for 循環(huán)的時(shí)候有需要多包一層
// 子組件方法 validateForm(){ //或者根據(jù)官網(wǎng)文檔說明可以不傳入回調(diào)函數(shù),直接validate return this.$refs.jsonEditor.getRef("form").validate } //父組件調(diào)用 submitAll(){ (async () => { let submitAllForm = {}; for (let index = 0; index < this.$refs.resourceEditorRef.length; index++) { const item = this.$refs.resourceEditorRef[index] await item.validateForm().then(res => { console.log("表單校驗(yàn)",res) }).catch(res => { console.log("表單校驗(yàn)catch",res) if(res == false){ this.$message({ type: "error", message: "表單校驗(yàn)失敗" }); // 有一個(gè)校驗(yàn)失敗則直接返回 return; } }) } //后續(xù)操作 })() }
或者
// 子組件方法 validateForm(){ return new Promise((resolve, reject) => { this.$refs.jsonEditor.getRef("form").validate((valid, hints) => { resolve({valid, hints}) }) }) } // 父調(diào)用 submitAll(){ (async () => { let submitAllForm = {}; for (let index = 0; index < this.$refs.resourceEditorRef.length; index++) { const item = this.$refs.resourceEditorRef[index] let {valid, hints} = await item.validateForm(); console.log("表單校驗(yàn)valid",valid) console.log("表單校驗(yàn)hints",hints) debugger } //后續(xù)操作 debugger })() }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue實(shí)現(xiàn)列表無(wú)縫滾動(dòng)
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)列表無(wú)縫滾動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06vue修改this.$confirm的文字樣式、自定義樣式代碼實(shí)例
this.$confirm是一個(gè)?Vue.js?中的彈窗組件,其樣式可以通過?CSS?進(jìn)行自定義,下面這篇文章主要給大家介紹了關(guān)于vue修改this.$confirm的文字樣式、自定義樣式的相關(guān)資料,需要的朋友可以參考下2024-02-02VueCli生產(chǎn)環(huán)境打包部署跨域失敗的解決
這篇文章主要介紹了VueCli生產(chǎn)環(huán)境打包部署跨域失敗的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-11-11100行代碼實(shí)現(xiàn)一個(gè)vue分頁(yè)組功能
今天用vue來(lái)實(shí)現(xiàn)一個(gè)分頁(yè)組件,總體來(lái)說,vue實(shí)現(xiàn)比較簡(jiǎn)單,樣式部分模仿了elementUI。接下來(lái)本文通過實(shí)例代碼給大家介紹100行代碼實(shí)現(xiàn)一個(gè)vue分頁(yè)組功能,感興趣的朋友跟隨小編一起看看吧2018-11-11Vue3中如何修改父組件傳遞到子組件中的值(全網(wǎng)少有!)
大家都知道,vue是具有單向數(shù)據(jù)流的傳遞特性,下面這篇文章主要給大家介紹了關(guān)于Vue3中如何修改父組件傳遞到子組件中值的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04webpack vue 項(xiàng)目打包生成的文件,資源文件報(bào)404問題的修復(fù)方法(總結(jié)篇)
這篇文章主要介紹了解決webpack vue 項(xiàng)目打包生成的文件,資源文件報(bào)404問題的修復(fù)方法,需要的朋友可以參考下2018-01-01最全vue的vue-amap使用高德地圖插件畫多邊形范圍的示例代碼
這篇文章主要介紹了最全vue的vue-amap使用高德地圖插件畫多邊形范圍,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07