一篇帶你搞懂Vue中的自定義指令
自定義指令的設(shè)計(jì)原則
在 Vue 中,自定義指令是通過(guò)調(diào)用 Vue.directive 方法或使用 directive 函數(shù)來(lái)創(chuàng)建的。自定義指令可以在 Vue 組件的模板中直接使用,并且可以綁定到元素、組件或模板的各種屬性上。
自定義指令的設(shè)計(jì)遵循以下幾個(gè)核心原則:
- 注冊(cè)指令: 使用
Vue.directive方法或directive函數(shù)來(lái)注冊(cè)指令。這些方法接受兩個(gè)參數(shù):指令名稱(chēng)和指令配置對(duì)象。指令名稱(chēng)是一個(gè)字符串,用于在模板中綁定指令。指令配置對(duì)象包含一系列鉤子函數(shù)和其他配置選項(xiàng),用于定義指令的行為。 - 鉤子函數(shù): 指令配置對(duì)象中的鉤子函數(shù)定義了指令的生命周期。常用的鉤子函數(shù)包括
bind、mounted、update、componentUpdated和unbind。這些鉤子函數(shù)在指令的不同生命周期階段被調(diào)用,允許開(kāi)發(fā)者在相應(yīng)的時(shí)機(jī)執(zhí)行自定義的邏輯。 - 鉤子函數(shù)參數(shù): 指令的鉤子函數(shù)可以接受一些參數(shù),用于傳遞信息給指令的行為邏輯。常用的參數(shù)包括
el(指令所綁定的元素)、binding(一個(gè)對(duì)象,包含指令的綁定值、參數(shù)、修飾符等信息)、vnode(Vue 編譯生成的虛擬節(jié)點(diǎn))和oldVnode(上一個(gè)虛擬節(jié)點(diǎn))等。 - 修飾符: 修飾符是附加在指令后面的特殊標(biāo)記,用于修改指令的行為。Vue 提供了一些內(nèi)置的修飾符,如
.prevent、.stop、.capture、.self等,用于處理事件和事件修飾符。開(kāi)發(fā)者也可以自定義修飾符,并在指令的行為邏輯中根據(jù)修飾符的值進(jìn)行相應(yīng)處理。
Vue 2 和 Vue 3 的自定義指令區(qū)別
Vue 3 的自定義指令在語(yǔ)法上與 Vue 2 的指令有一些不同,但核心概念和使用方式仍然相似。Vue 3 引入了 Composition API,并對(duì)指令的鉤子函數(shù)進(jìn)行了更細(xì)粒度的劃分,提供了更靈活和可控的指令編寫(xiě)方式。以下是 Vue 2 和 Vue 3 的自定義指令之間的主要區(qū)別:
注冊(cè)方式
- Vue 2:在 Vue 2 中,使用全局的
Vue.directive方法來(lái)注冊(cè)自定義指令。指令名稱(chēng)作為第一個(gè)參數(shù),指令配置對(duì)象作為第二個(gè)參數(shù)。 - Vue 3:在 Vue 3 中,可以使用全局的
app.directive方法或directive函數(shù)來(lái)注冊(cè)自定義指令。指令名稱(chēng)作為第一個(gè)參數(shù),指令配置對(duì)象作為第二個(gè)參數(shù)。
指令鉤子函數(shù)
- Vue 2:Vue 2 的指令鉤子函數(shù)包括
bind、inserted、update、componentUpdated和unbind。這些鉤子函數(shù)在指令的生命周期中不同的階段被調(diào)用。 - Vue 3:Vue 3 的指令鉤子函數(shù)包括
beforeMount、mounted、beforeUpdate、updated、beforeUnmount和unmounted。這些鉤子函數(shù)提供了更細(xì)粒度的控制,并與組件的生命周期鉤子函數(shù)保持一致。
鉤子函數(shù)參數(shù)
- Vue 2:Vue 2 的指令鉤子函數(shù)的參數(shù)包括
el、binding、vnode和oldVnode。其中,binding對(duì)象中包含了指令的綁定值、參數(shù)、修飾符等信息。 - Vue 3:Vue 3 的指令鉤子函數(shù)的參數(shù)也包括
el、binding、vnode和prevVnode。prevVnode是之前的虛擬節(jié)點(diǎn),用于在更新鉤子函數(shù)中進(jìn)行比較。
指令修飾符
- Vue 2:Vue 2 的指令修飾符可以通過(guò)
v-前綴使用,例如v-on:click.stop。Vue 2 提供了一些內(nèi)置的事件修飾符,如.stop、.prevent、.capture、.self等。 - Vue 3:Vue 3 的指令修飾符不再使用
v-前綴,而是直接在指令后面使用,例如@click.stop。Vue 3 內(nèi)置的事件修飾符仍然可用,但要與@符號(hào)一起使用。
常見(jiàn)的自定義指令應(yīng)用場(chǎng)景
操作 DOM
自定義指令可用于直接操作 DOM 元素,例如設(shè)置樣式、添加類(lèi)名、聚焦元素、滾動(dòng)等。這樣可以避免直接在組件中操作 DOM,保持組件的職責(zé)單一。
<template>
<div>
<input v-focus />
</div>
</template>
<script>
// 自定義指令:聚焦元素
Vue.directive('focus', {
inserted(el) {
el.focus();
}
});
</script>事件處理
自定義指令可用于處理事件,如監(jiān)聽(tīng)點(diǎn)擊事件、滾動(dòng)事件、拖拽事件等。通過(guò)自定義指令,可以封裝特定的事件處理邏輯,并在組件中復(fù)用。
在以下示例中,定義了一個(gè)自定義指令 v-draggable,它綁定在一個(gè)具有 draggable 類(lèi)的元素上。當(dāng)鼠標(biāo)按下或觸摸開(kāi)始時(shí),啟動(dòng)拖拽功能。在拖拽過(guò)程中,元素會(huì)跟隨鼠標(biāo)或手指的移動(dòng)而改變位置。當(dāng)鼠標(biāo)釋放或觸摸結(jié)束時(shí),停止拖拽。
<template>
<div>
<div class="draggable" v-draggable> Drag me!</div>
</div>
</template>
<script>
// 自定義指令:拖拽
Vue.directive('draggable', {
bind(el) {
el.style.position = 'absolute';
el.style.cursor = 'move';
let offsetX = 0;
let offsetY = 0;
let isDragging = false;
el.addEventListener('mousedown', startDrag);
el.addEventListener('touchstart', startDrag);
function startDrag(e) {
e.preventDefault();
if (e.type === 'touchstart') {
offsetX = e.touches[0].clientX - el.getBoundingClientRect().left;
offsetY = e.touches[0].clientY - el.getBoundingClientRect().top;
} else {
offsetX = e.clientX - el.getBoundingClientRect().left;
offsetY = e.clientY - el.getBoundingClientRect().top;
}
isDragging = true;
document.addEventListener('mousemove', handleDrag);
document.addEventListener('touchmove', handleDrag);
document.addEventListener('mouseup', stopDrag);
document.addEventListener('touchend', stopDrag);
}
function handleDrag(e) {
e.preventDefault();
let x = 0;
let y = 0;
if (e.type === 'touchmove') {
x = e.touches[0].clientX - offsetX; y = e.touches[0].clientY - offsetY;
} else {
x = e.clientX - offsetX;
y = e.clientY - offsetY;
}
el.style.left = x + 'px';
el.style.top = y + 'px';
}
function stopDrag() {
isDragging = false;
document.removeEventListener('mousemove', handleDrag);
document.removeEventListener('touchmove', handleDrag);
document.removeEventListener('mouseup', stopDrag);
document.removeEventListener('touchend', stopDrag);
}
}
});
</script>
<style>
.draggable {
width: 100px;
height: 100px;
background-color: #ccc;
text-align: center;
line-height: 100px;
}
</style>表單驗(yàn)證
自定義指令可用于表單驗(yàn)證,例如檢查輸入是否滿足特定的條件、格式化輸入等。自定義指令可以在輸入框失去焦點(diǎn)或值變化時(shí)進(jìn)行驗(yàn)證,并給出相應(yīng)的提示信息。
在以下示例中,定義了一個(gè)自定義指令 v-validate,它用于驗(yàn)證表單輸入。通過(guò)指令的參數(shù)來(lái)指定驗(yàn)證類(lèi)型,例如 required 表示必填字段,email 表示郵箱格式驗(yàn)證。
在 validateField 函數(shù)中,我們根據(jù)指令的參數(shù)進(jìn)行相應(yīng)的驗(yàn)證邏輯,并根據(jù)驗(yàn)證結(jié)果來(lái)顯示或隱藏錯(cuò)誤提示。
當(dāng)表單提交時(shí),我們?cè)?submitForm 方法中檢查必填字段是否都已填寫(xiě)。如果有未填寫(xiě)的字段,我們將 showError 設(shè)置為 true,顯示錯(cuò)誤提示信息。否則,我們將 showError 設(shè)置為 false,執(zhí)行表單提交操作。
<template>
<div>
<form @submit.prevent="submitForm">
<label for="name">Name:</label>
<input id="name" v-model="name" v-validate.required />
<label for="email">Email:</label>
<input id="email" v-model="email" v-validate.email />
<button type="submit">Submit</button>
</form>
<p v-show="showError" class="error-message">Please fill in all the required fields.</p>
</div>
</template>
<script>
// 自定義指令:表單驗(yàn)證
Vue.directive('validate', {
bind(el, binding) {
const { value } = binding;
function validateField() {
const inputValue = el.value;
if (value === 'required' && !inputValue.trim()) {
showError(true);
} else if (value === 'email' && !validateEmail(inputValue)) {
showError(true);
} else {
showError(false);
}
}
el.addEventListener('blur', validateField);
function showError(show) {
el.classList.toggle('error', show);
}
function validateEmail(email) {
const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return regex.test(email);
}
}
});
export default {
data() {
return {
name: '',
email: '',
showError: false
};
},
methods: {
submitForm() {
// 表單提交邏輯
if (this.name && this.email) {
// 執(zhí)行表單提交操作
this.showError = false;
} else {
this.showError = true;
}
}
}
};
</script>
<style>
.error {
border-color: red;
}
.error-message {
color: red;
margin-top: 5px;
}
</style>- 第三方庫(kù)集成: 自定義指令可用于與第三方庫(kù)進(jìn)行集成,如集成日期選擇器、富文本編輯器、圖表庫(kù)等。通過(guò)自定義指令,可以在組件中方便地使用第三方庫(kù)提供的功能。
以下是一個(gè)示例,展示如何使用自定義指令來(lái)集成日期選擇器(這里以 flatpickr 庫(kù)為例),在這個(gè)示例中,我們定義了一個(gè)自定義指令 v-datepicker,它用于將日期選擇器集成到輸入框中。我們使用了 flatpickr 這個(gè)第三方庫(kù)來(lái)實(shí)現(xiàn)日期選擇器的功能。
在 mounted 鉤子中,我們使用 flatpickr 函數(shù)將日期選擇器應(yīng)用到指令所在的輸入框上。我們可以通過(guò)配置對(duì)象來(lái)設(shè)置日期選擇器的選項(xiàng),例如日期格式、事件回調(diào)等。
在日期選擇器的 onChange 事件回調(diào)中,我們將選中的日期賦值給指令的綁定值 binding.value,以便在父組件中獲取選擇的日期值。
在 beforeUnmount 鉤子中,我們銷(xiāo)毀日期選擇器實(shí)例,以釋放資源并防止內(nèi)存泄漏。
<template>
<div>
<input v-datepicker v-model="selectedDate" />
</div>
</template>
<script>
import flatpickr from 'flatpickr';
// 自定義指令:集成 flatpickr
Vue.directive('datepicker', {
mounted(el, binding) {
flatpickr(el, {
dateFormat: 'Y-m-d',
onChange(selectedDates) {
binding.value = selectedDates[0];
}
});
},
beforeUnmount(el) {
const flatpickrInstance = flatpickrInstance(el);
if (flatpickrInstance) {
flatpickrInstance.destroy();
}
}
});
</script>動(dòng)畫(huà)和過(guò)渡效果
自定義指令可用于處理動(dòng)畫(huà)和過(guò)渡效果,例如實(shí)現(xiàn)元素的淡入淡出、滑動(dòng)等效果。通過(guò)自定義指令,可以在元素的插入、更新、移除等過(guò)程中添加動(dòng)畫(huà)效果。
在以下示例中,我們定義了一個(gè)自定義指令 v-fade-transition,它用于為元素添加淡入淡出的過(guò)渡效果。
在 beforeMount 鉤子中,我們?cè)O(shè)置元素的初始透明度為 0,并添加過(guò)渡效果的 CSS 屬性。
在 mounted 鉤子中,我們將元素的透明度設(shè)置為 1,實(shí)現(xiàn)淡入效果。
在 beforeUnmount 鉤子中,我們將元素的透明度設(shè)置為 0,實(shí)現(xiàn)淡出效果。
在組件的模板中,我們使用 v-if 指令來(lái)控制元素的顯示與隱藏,同時(shí)將自定義指令 v-fade-transition 應(yīng)用在這個(gè)元素上,實(shí)現(xiàn)淡入淡出的過(guò)渡效果。
當(dāng)點(diǎn)擊按鈕時(shí),我們通過(guò) toggleVisibility 方法來(lái)切換元素的顯示與隱藏。
<template>
<div>
<button @click="toggleVisibility">Toggle</button>
<div v-if="isVisible" v-fade-transition>
Content
</div>
</div>
</template>
<script>
// 自定義指令:淡入淡出過(guò)渡效果
Vue.directive('fade-transition', {
beforeMount(el) {
el.style.opacity = '0';
el.style.transition = 'opacity 0.5s';
},
mounted(el) {
el.style.opacity = '1';
},
beforeUnmount(el) {
el.style.opacity = '0';
}
});
export default {
data() {
return {
isVisible: false
};
},
methods: {
toggleVisibility() {
this.isVisible = !this.isVisible;
}
}
};
</script>
<style>
.fade-transition {
transition: opacity 0.5s;
}
</style>權(quán)限控制
自定義指令可用于權(quán)限控制,例如根據(jù)用戶的角色或權(quán)限,動(dòng)態(tài)顯示或隱藏某些元素。自定義指令可以根據(jù)用戶的權(quán)限信息,決定元素的可見(jiàn)性或可操作性。
在以下示例中,我們定義了一個(gè)自定義指令 v-permission,它用于根據(jù)用戶權(quán)限控制元素的可用性。
在 mounted 鉤子中,我們獲取指令的綁定值 permission,并檢查用戶的權(quán)限數(shù)組 userPermissions 是否包含該權(quán)限。如果用戶沒(méi)有該權(quán)限,我們禁用按鈕元素(el.disabled = true),添加禁用樣式類(lèi)(el.classList.add('disabled')),并設(shè)置提示信息(el.title)。
在組件的模板中,我們?cè)诎粹o元素上使用 v-permission 指令,并將相應(yīng)的權(quán)限字符串作為指令的參數(shù),用于權(quán)限控制。
另外,我們使用 v-show 指令結(jié)合 isAdmin 數(shù)據(jù)屬性來(lái)控制管理員權(quán)限下的按鈕的顯示與隱藏。
<template>
<div>
<button v-permission="'edit'">Edit</button>
<button v-permission="'delete'">Delete</button>
<button v-permission="'create'" v-show="isAdmin">Create</button>
</div>
</template>
<script>
// 模擬用戶權(quán)限
const userPermissions = ['edit', 'delete'];
// 自定義指令:權(quán)限控制
Vue.directive('permission', {
mounted(el, binding) {
const permission = binding.value;
if (!userPermissions.includes(permission)) {
el.disabled = true;
el.classList.add('disabled');
el.title = 'You do not have permission to perform this action';
}
}
});
export default { data() {
return {
isAdmin: true // 用戶是否是管理員
};
}
};
</script>
<style>
.disabled {
opacity: 0.5;
cursor: not-allowed;
}
</style>響應(yīng)式操作
自定義指令可用于監(jiān)聽(tīng)數(shù)據(jù)的變化,并在數(shù)據(jù)變化時(shí)執(zhí)行相應(yīng)的操作。例如,自定義指令可以監(jiān)聽(tīng)滾動(dòng)位置,根據(jù)滾動(dòng)位置改變某些元素的樣式或行為。
如下示例中,我們定義了一個(gè)自定義指令 v-scroll-spy,它用于監(jiān)聽(tīng)容器元素的滾動(dòng)事件。
在 mounted 鉤子中,我們?yōu)槿萜髟靥砑恿?scroll 事件監(jiān)聽(tīng)器,當(dāng)容器滾動(dòng)時(shí),會(huì)觸發(fā) handleScroll 方法。
在 beforeUnmount 鉤子中,我們移除了 scroll 事件監(jiān)聽(tīng)器,以防止內(nèi)存泄漏。
在 handleScroll 方法中,我們通過(guò) event.target.scrollTop 獲取到容器的滾動(dòng)位置,然后根據(jù)滾動(dòng)位置執(zhí)行相應(yīng)的操作。在這個(gè)示例中,當(dāng)滾動(dòng)位置大于 200px 時(shí),我們輸出一條日志。
在組件的模板中,我們使用 v-scroll-spy 指令應(yīng)用在一個(gè)滾動(dòng)容器上,并通過(guò) v-for 指令渲染了幾個(gè)示例部分。
<template>
<div v-scroll-spy>
<div class="section" v-for="section in sections" :key="section.id"> {{ section.content }}
</div>
</div>
</template>
<script>
// 自定義指令:滾動(dòng)監(jiān)聽(tīng)
Vue.directive('scroll-spy', {
mounted(el) {
el.addEventListener('scroll', this.handleScroll);
},
beforeUnmount(el) {
el.removeEventListener('scroll', this.handleScroll);
},
methods: {
handleScroll(event) {
// 獲取滾動(dòng)位置
const scrollTop = event.target.scrollTop;
// 根據(jù)滾動(dòng)位置觸發(fā)不同的操作
// 這里可以根據(jù)需要自定義滾動(dòng)監(jiān)聽(tīng)的邏輯
if (scrollTop > 200) {
// 滾動(dòng)位置大于 200px 執(zhí)行操作
console.log('Scrolled beyond 200px');
}
}
}
});
export default {
data() {
return {
sections: [
{ id: 1, content: 'Section 1' },
{ id: 2, content: 'Section 2' },
{ id: 3, content: 'Section 3' }
] };
}
};
</script>
<style>
.section {
height: 200px;
margin-bottom: 20px;
border: 1px solid #ccc;
padding: 20px;
}
</style>性能優(yōu)化
自定義指令可用于性能優(yōu)化,例如延遲加載、虛擬滾動(dòng)等。通過(guò)自定義指令,可以根據(jù)需要延遲加載某些元素或優(yōu)化滾動(dòng)的性能。 下面是一個(gè)示例,展示如何使用自定義指令實(shí)現(xiàn)滾動(dòng)監(jiān)聽(tīng)實(shí)現(xiàn)圖片懶加載:
<template>
<div>
<div class="image-container" v-scroll-lazy>
<img v-for="image in images" :key="image.id" :src="image.src" class="lazy-image" />
</div>
</div>
</template>
<script>
// 自定義指令:滾動(dòng)懶加載
Vue.directive('scroll-lazy', {
mounted(el) {
const lazyImages = el.querySelectorAll('.lazy-image');
this.loadImagesOnScroll(lazyImages);
// 添加滾動(dòng)事件監(jiān)聽(tīng)器
el.addEventListener('scroll', () => {
this.loadImagesOnScroll(lazyImages);
});
},
beforeUnmount(el) {
// 移除滾動(dòng)事件監(jiān)聽(tīng)器
el.removeEventListener('scroll', () => { this.loadImagesOnScroll(lazyImages);
});
},
methods: {
loadImagesOnScroll(lazyImages) {
lazyImages.forEach(image => {
if (this.isImageVisible(image) && !image.src) {
// 加載圖片
image.src = image.dataset.src;
}
});
},
isImageVisible(image) {
const rect = image.getBoundingClientRect();
return (
rect.top >= 0 &&
rect.left >= 0 &&
rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
rect.right <= (window.innerWidth || document.documentElement.clientWidth)
);
}
}
});
export default {
data() {
return {
images: [
{ id: 1, src: '', dataSrc: 'image1.jpg' },
{ id: 2, src: '', dataSrc: 'image2.jpg' },
{ id: 3, src: '', dataSrc: 'image3.jpg' }
]
};
}
};
</script>
<style>
.image-container {
height: 300px;
overflow: auto;
}
.lazy-image {
width: 100%;
height: auto;
}
</style>在這個(gè)示例中,我們定義了一個(gè)自定義指令 v-scroll-lazy,它用于在滾動(dòng)容器中實(shí)現(xiàn)圖片懶加載。
在 mounted 鉤子中,我們獲取到所有具有 .lazy-image 類(lèi)的圖片元素,并通過(guò) loadImagesOnScroll 方法進(jìn)行初始的圖片加載。然后,我們添加了滾動(dòng)事件監(jiān)聽(tīng)器,在滾動(dòng)時(shí)繼續(xù)加載更多的圖片。
在 beforeUnmount 鉤子中,我們移除了滾動(dòng)事件監(jiān)聽(tīng)器。
在 loadImagesOnScroll 方法中,我們遍歷每個(gè)圖片元素,檢查它是否可見(jiàn)并且尚未加載。如果是,則將 data-src 屬性的值設(shè)置為 src 屬性,觸發(fā)圖片加載。
在 isImageVisible 方法中,我們使用 getBoundingClientRect 方法來(lái)判斷圖片是否在可視區(qū)域內(nèi)。
在組件的模板中,我們使用 v-scroll-lazy 指令應(yīng)用在一個(gè)滾動(dòng)容器上,并通過(guò) v-for 指令渲染了幾個(gè)示例圖片。每個(gè)圖片都有一個(gè) data-src 屬性,表示真實(shí)的圖片路徑。一開(kāi)始,src 屬性為空,當(dāng)圖片進(jìn)入可視區(qū)域時(shí),會(huì)觸發(fā)圖片加載。
以上就是一篇帶你搞懂Vue中的自定義指令的詳細(xì)內(nèi)容,更多關(guān)于Vue自定義指令的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue中實(shí)現(xiàn)深度監(jiān)聽(tīng)的方法小結(jié)
在Vue中,深度監(jiān)聽(tīng)是一種非常常見(jiàn)且重要的功能,它可以讓我們監(jiān)聽(tīng)對(duì)象內(nèi)部的所有屬性,并對(duì)這些屬性的變化做出相應(yīng)的處理,在本篇博客中,我將為大家介紹Vue中如何實(shí)現(xiàn)深度監(jiān)聽(tīng)的方法,需要的朋友可以參考下2024-09-09
vue中@路徑無(wú)法跳轉(zhuǎn)到指定文件的解決
這篇文章主要介紹了vue中@路徑無(wú)法跳轉(zhuǎn)到指定文件的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
vue 項(xiàng)目集成 electron 和 electron 打包及環(huán)境配
文章介紹了如何使用Vue和Electron開(kāi)發(fā)桌面端應(yīng)用,包括安裝Electron、配置package.json、創(chuàng)建main.js文件、運(yùn)行和打包應(yīng)用等步驟,并分享了一些常見(jiàn)的打包錯(cuò)誤及其解決方法,感興趣的朋友一起看看吧2025-01-01
詳解swiper在vue中的應(yīng)用(以3.0為例)
這篇文章主要介紹了詳解swiper在vue中的應(yīng)用(以3.0為例),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
Vue3在Setup中使用axios請(qǐng)求獲取的值方式
這篇文章主要介紹了Vue3在Setup中使用axios請(qǐng)求獲取的值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
vue項(xiàng)目因內(nèi)存溢出啟動(dòng)報(bào)錯(cuò)的解決方案
這篇文章主要介紹了vue項(xiàng)目因內(nèi)存溢出啟動(dòng)報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-09-09
vue3實(shí)現(xiàn)點(diǎn)擊空白區(qū)域隱藏div
這篇文章主要介紹了vue3實(shí)現(xiàn)點(diǎn)擊空白區(qū)域隱藏div方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
解決vue build打包之后首頁(yè)白屏的問(wèn)題
下面小編就為大家分享一篇解決vue build打包之后首頁(yè)白屏的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03

