Vue下拉菜單組件化開發(fā)詳解
本文實(shí)例為大家分享了Vue下拉菜單組件化開發(fā)的具體代碼,供大家參考,具體內(nèi)容如下
搞一個(gè)自定義組件,只是一個(gè)很簡(jiǎn)單的下拉菜單,也就是一個(gè)思路,整起
第一步:在項(xiàng)目中專門創(chuàng)建一個(gè)放置自定義組件的文件夾(直接components底下的common中)

dropdown.vue 為一級(jí)盒子
dropdownMenu.vue 為二級(jí)盒子
dropdownItem.vue 為二級(jí)盒子內(nèi)容
第二步 :
對(duì)dropdown.vue的操作
<template>
<div class="box">
<!-- 給按鈕加點(diǎn)擊事件 -->
<div @click="showM">
<!-- 一級(jí)按鈕 -->
<slot name="title"></slot>
</div>
<!-- 二級(jí)盒子 -->
<!-- 加v-if操作 隱藏顯示效果 -->
<slot v-if="show" name="dropdown"></slot>
</div>
</template>
<script>
export default {
name: "dropdown",
data() {
return {
// 默認(rèn)二級(jí)盒子關(guān)閉
show: false
}
},
methods: {
showM() {
this.show = !this.show
},
commitClick(value) {
// 向父級(jí)暴露dropdown事件,并把值傳入
this.$emit('change-item',value)
}
}
}
</script>
<style scoped>
.box {
display: inline-block; /* 行內(nèi)塊 */
position: relative; /* 相對(duì)定位 */
top:100px;
margin-left:100px
}
</style>
對(duì)于dropdownMenu僅僅只是把它當(dāng)作一個(gè)盒子,只需要添加一個(gè)插槽,把盒子搭好即可
<template>
<div class="dropdown-menu">
<slot></slot>
</div>
</template>
<script>
export default {
name: "dropdownMenu"
}
</script>
<style scoped>
.dropdown-menu {
padding: 8px 0; /* 盒子內(nèi)邊距上下為8px 左右為0 */
border-radius: 4px; /* 盒子圓角 */
border: 1px solid #f2f6fc; /* 邊框?yàn)?px 灰色 */
position: absolute; /* 絕對(duì)定位 */
right: 0; /* 在右側(cè) */
top: 110%; /* 盒子在按鈕下方 */
background-color: #fff; /* 背景顏色為白色 */
box-shadow: 0 2px 4px rgba(0,0,0,0.12),0 0 6px rgba(0,0,0,.04);
/* 為盒子添加陰影 */
}
</style>
對(duì)dropdownItem的操作
<template>
<div class="dropdown-item" @click="itemClick(value)">
<slot></slot>
</div>
</template>
<script>
export default {
name: "dropdownItem",
props:['value'],
data() {
return {};
},
methods: {
itemClick(value) {
// console.log(value)
//通過this調(diào)用當(dāng)前組件的父級(jí)的父級(jí)也就是dropdown的showM()方法來進(jìn)行關(guān)閉
this.$parent.$parent.showM();
// 調(diào)用父級(jí)的父級(jí)(dropdown)的commitClick方法并傳如value值
this.$parent.$parent.commitClick(value);
},
},
};
</script>
<style scoped>
.dropdown-item {
line-height: 40px; /* 行高40px */
white-space: nowrap; /* 不換行 */
padding: 0 20px; /* 內(nèi)邊距上下為0 左右為20px */
color: #606266; /* 字體顏色為灰色 */
cursor: pointer; /* 鼠標(biāo)移入為點(diǎn)擊樣子 */
}
.dropdown-item:hover {
color: #409eff; /* 字體顏色為藍(lán)色 */
background-color: #ecf5ff; /* 背景顏色為 淺~~藍(lán)色 非常淺就對(duì)了 */
}
</style>
接下來對(duì)App.vue文件進(jìn)行操作
<template>
<div id="app">
<dropdown @change-item="changeItem">
<button slot="title">按鈕</button>
<dropdown-menu slot="dropdown">
<dropdown-item value="吃的">吃的</dropdown-item>
<dropdown-item value="喝的">喝的</dropdown-item>
<dropdown-item value="玩的">玩的</dropdown-item>
</dropdown-menu>
</dropdown>
</div>
</template>
<script>
import dropdown from './components/common/dropdown'
import dropdownMenu from "./components/common/dropdownMenu";
import dropdownItem from "./components/common/dropdownItem";
export default {
name: 'App',
components: {
dropdown,dropdownMenu,dropdownItem
},
methods:{
changeItem(e){
console.log(e)
}
}
}
</script>
在main.js導(dǎo)入組件
import zgDropdown from "@/components/common/dropdown"
import zgDropdownMenu from "@/components/common/dropdownMenu"
import zgDropdownItem from "@/components/common/dropdownItem"
Vue.component('zgDropdownItem',zgDropdownItem)
Vue.component('zgDropdown',zgDropdown)
Vue.component('zgDropdownMenu',zgDropdownMenu)
app.vue也要相應(yīng)修改
<template>
<div id="app">
<zg-dropdown @change-item="changeItem">
<button slot="title">按鈕</button>
<zg-dropdown-menu slot="dropdown">
<zg-dropdown-item value="吃的">吃的</zg-dropdown-item>
<zg-dropdown-item value="喝的">喝的</zg-dropdown-item>
<zg-dropdown-item value="玩的">玩的</zg-dropdown-item>
</zg-dropdown-menu>
</zg-dropdown>
</div>
</template>
<script>
export default {
name: 'App',
methods:{
changeItem(e){
console.log(e)
}
}
}
</script>
<style scoped>
</style>
大概就是這么一個(gè)思路。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue實(shí)現(xiàn)數(shù)字滾動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)數(shù)字滾動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06
vue如何處理base64格式文件pdf及圖片預(yù)覽功能
這篇文章主要給大家介紹了關(guān)于vue如何處理base64格式文件pdf及圖片預(yù)覽功能的相關(guān)資料,圖片的base64編碼就是可以將一副圖片數(shù)據(jù)編碼成一串字符串,使用該字符串代替圖像地址,需要的朋友可以參考下2024-05-05
詳解Vue iview IE瀏覽器不兼容報(bào)錯(cuò)(Iview Bable polyfill)
這篇文章主要介紹了Vue iview IE瀏覽器不兼容報(bào)錯(cuò)的決絕方法,由于Iview編譯使用到了es6的一些新特性,但是在IE中不支持ES6的新特性,本文就介紹一下如何解決這些問題2019-01-01
vue.js2.0點(diǎn)擊獲取自己的屬性和jquery方法
下面小編就為大家分享一篇vue.js2.0點(diǎn)擊獲取自己的屬性和jquery方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-02-02
Vue進(jìn)行數(shù)據(jù)可視化圖表展示的實(shí)現(xiàn)示例
數(shù)據(jù)可視化是現(xiàn)代化的數(shù)據(jù)分析和展示方式,可以使數(shù)據(jù)更加直觀、易于理解和傳達(dá),Vue作為一款流行的前端框架,提供了豐富的插件和工具來實(shí)現(xiàn)數(shù)據(jù)可視化圖表展示,本文將介紹如何使用Vue和Echarts/D3.js來實(shí)現(xiàn)數(shù)據(jù)可視化圖表展示,并提供示例代碼和實(shí)際應(yīng)用場(chǎng)景2023-10-10
完美解決vue中報(bào)錯(cuò)?“TypeError:?Cannot?read?properties?of?null?
這篇文章主要介紹了完美解決vue中報(bào)錯(cuò)?“TypeError:?Cannot?read?properties?of?null?(reading?‘forEach‘)“,本文給大家分享詳細(xì)解決方案,需要的朋友可以參考下2023-02-02
Vue如何基于vue-i18n實(shí)現(xiàn)多國(guó)語言兼容
這篇文章主要介紹了Vue如何基于vue-i18n實(shí)現(xiàn)多國(guó)語言兼容,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
vue?element-ui如何在el-tabs組件最右側(cè)添加按鈕
這篇文章主要介紹了vue?element-ui如何在el-tabs組件最右側(cè)添加按鈕問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
vue不操作dom實(shí)現(xiàn)圖片輪播的示例代碼
這篇文章主要介紹了vue不操作dom實(shí)現(xiàn)圖片輪播的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12

