如何在vue單頁中重復(fù)引入同一子組件
vue單頁中重復(fù)引入同一子組件
如果一個功能復(fù)用率比較高,我們一般寫成一個公共組件,需要的時候就引入
今天遇到一個問題,寫了一個城市級聯(lián)選擇器的公共子組件,我在一個頁面引入了三個該組件,發(fā)現(xiàn)只有一個能夠使用,拿代碼說事
下面代碼是我城市選擇器的一部分,我將getProvince方法在created中執(zhí)行,因此只要打開引入該組件的頁面,方法中的請求就會發(fā)送,結(jié)果是三個組件中的其中兩個console.log(res) 輸出為underfined,為了測試是否是res的是輸出結(jié)果,我在后面輸出1,發(fā)現(xiàn)確實是輸出了三次1,underfined就是res的輸出結(jié)果,頁面中只有一個級聯(lián)選擇器點擊有數(shù)據(jù)
getProvince(data) {
cityFormApi.getDown(data).then(res => {
console.log(res)
console.log('1')
let that = this;
let province = res.data;
for (let i = 0; i < province.length; i++) {
let wzpz = province[i];
wzpz.value = wzpz.id;
wzpz.label = wzpz.name;
wzpz.loading = false;
wzpz.children = [];
that.newSbType.push(wzpz);
}
})
},在頁面中引入組件
<queryData @ProvinceData="childByValue"></queryData>
子組件返回數(shù)據(jù)
this.$emit('ProvinceData', this.newObject);解決方法
不要在同一時間去調(diào)用,我選擇在點擊輸入框的時候再執(zhí)行請求,所以在任何一個子組件被使用時都會重新發(fā)送一次請求
在下拉框展開事件中,執(zhí)行g(shù)etProvince方法
vue多個相同組件重復(fù)請求的問題
一個頁面中如果多次調(diào)用同一個組件的話,組件中請求多個接口,那么就會導(dǎo)致一上來就會一次性請求多個重復(fù)的接口。
解決方案
import { listDept } from "@/api/system/dept";
import { roleSelect } from "@/api/system/role";
import { formList as formSelect } from "@/api/statisticalConfig/formManage";
import { validatenull } from "@/utils/ruoyi";
let cache = {};
let count = 0;
/**
* 睡眠一段時間
* @param {Number} ms 延遲時間,單位毫秒
* @returns {Promise<void>}
*/
async function delay(ms = 200) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
export async function getAllData(params) {
try {
let id = localStorage.getItem("oldBusinessTypeId");
if (!validatenull(cache) && id == params.businessTypeId) {
return cache;
}
if (count++) {
// 如果有計數(shù)說明自己不是第 1 個,就等。注意這里判斷的是加之前的 count
// 循環(huán)里最好再加個超時判斷
while (!cache) {
await delay();
}
} else {
// 是第 1 個就去請求
// 如果這里有可能會拋異常,拋異常也不要漏了 count--
const res1 = await listDept(); //部門列表
const res2 = await roleSelect(); //角色列表
const res3 = await formSelect(params); //表單數(shù)據(jù)
cache = {
deptList: res1.data,
roleList: res2.data,
formList: res3.data,
};
if (!validatenull(cache.formList)) {
let oldBusinessTypeId = cache.formList[0].businessTypeId;
localStorage.setItem("oldBusinessTypeId", oldBusinessTypeId);
}
}
count--; // 記得減回去,方便以后如果要刷新 cache 的時候用
return cache;
} catch (error) {
console.log("獲取數(shù)據(jù)出錯", error);
}
}總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue項目中0.js過大導(dǎo)致首屏加載慢的問題解決方法
在 Vue 項目開發(fā)完成后,進行打包部署時,首屏加載速度是影響用戶體驗的關(guān)鍵因素之一,最近我在項目中就遇到了 0.js 過大導(dǎo)致首屏加載時間變慢的問題,經(jīng)過一番排查和優(yōu)化,成功解決了該問題,特此記錄分享給大家,需要的朋友可以參考下2025-11-11
詳解Vue項目中出現(xiàn)Loading chunk {n} failed問題的解決方法
這篇文章主要介紹了詳解Vue項目中出現(xiàn)Loading chunk {n} failed問題的解決方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09
Vue如何使用Promise.all()方法并行執(zhí)行多個請求
在Vue中,可以使用Promise.all()方法并行執(zhí)行多個異步請求,當所有請求都成功返回時,Promise.all()將返回一個包含所有請求結(jié)果的數(shù)組,如果其中任何一個請求失敗,則會觸發(fā)catch()方法并返回錯誤信息,這種方式可以顯著提高程序的性能和響應(yīng)速度2025-01-01

