vue 實(shí)現(xiàn)dot-dropdown的實(shí)例代碼
vue 實(shí)現(xiàn)dot-dropdown的代碼如下:
<template>
<div class="app-container">
<div class="mt30"></div>
<el-row :gutter="20">
<!-- title -->
<!-- <div class="modt-box">導(dǎo)航管理</div> -->
<el-col :span="2">
<div class="grid-content bg-purple"></div>
</el-col>
<el-col :span="6">
<!-- default-expand-all="" tree-border-->
<div class="lefttree">
<div class="tit-box">菜單目錄</div>
<el-tree
class="treeclass"
default-expand-all=""
ref="tree"
:data="treeData"
:props="defaultProps"
@node-click="nodeclick"
@check-change="handleClick"
check-strictly
node-key="id"
>
<!-- 操作的插槽 -->
<span class="custom-tree-node" slot-scope="{ node, data }">
<div class="custom-tree-node-wrapper">
<span class="custom-tree-node-label">{{ node.label }}</span>
<span class="operate-btns">
<dot-dropdown :eventsa="dropevents" :data="{node,data}" @addPeerNode="addPeerNode" @addNode="addNode" @editNode="editNode" @removeNode="removeNode" />
</span>
</div>
</span>
</el-tree>
</div>
</el-col>
<el-col :span="2">
<div class="grid-content bg-purple"></div>
</el-col>
<el-col :span="16">
<div class="rightform">
<div class="tit-box">{{tit}}</div>
<!-- <div class="mod-btnbox">
<el-button type="primary" icon="el-icon-plus" @click="addModule">添加</el-button>
</div>-->
<el-form ref="form" :model="form" label-width="80px" :rules="rules">
<!-- <el-form-item label="父級(jí)菜單" prop="parentId">
<el-select v-model="form.parentId" placeholder="請(qǐng)選擇" class="selectw">
<el-option v-for="parm in fmenu" :key="parm.id" :label="parm.name" :value="parm.id"></el-option>
</el-select>
</el-form-item> -->
<!-- <el-form-item label="上級(jí)菜單">
<treeselect
v-model="form.id"
:options="fmenu"
:normalizer="normalizer"
:show-count="true"
placeholder="選擇上級(jí)菜單"
/>
</el-form-item> -->
<el-form-item label="名稱(chēng)" prop="name">
<el-input v-model="form.name"></el-input>
</el-form-item>
<!-- <el-form-item label="圖標(biāo)" prop="moduleIcon">
<el-input v-model="form.moduleIcon"></el-input>
</el-form-item>-->
<el-form-item label="Path" prop="path">
<el-input v-model="form.path"></el-input>
</el-form-item>
<el-form-item label="Link" prop="link">
<el-input v-model="form.link"></el-input>
</el-form-item>
<el-form-item label="順序" prop="sortNum">
<el-input v-model="form.sortNum"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="saveModule('form')">保存</el-button>
<el-button v-show="!form.id" type="primary" @click="reset('form')">重置</el-button>
<!-- <el-button type="primary" v-show="showdelete" @click="deleteModule">刪除</el-button> -->
</el-form-item>
</el-form>
</div>
</el-col>
<!-- <dot-dropdown :events="sysDropMenuEvents" :data="{node,data}" @addNode="addResource" /> -->
</el-row>
</div>
</template>
<script>
import {
listCategory,
getCategory,
delCategory,
addCategory,
updateCategory,
exportCategory,
listCategorytree
} from "@/api/cms/category";
import DotDropdown from "./drop.vue";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
name: "Category",
components: {
DotDropdown,
Treeselect
},
data() {
return {
tit:'新建同級(jí)',
dropevents: [
{ label: '新建同級(jí)', funcName: 'addPeerNode' },
{ label: '新建子級(jí)', funcName: 'addNode' },
{ label: '編輯', funcName: 'editNode' },
{ label: '刪除', funcName: 'removeNode' }
],
showdelete: false,
treeData: [],
defaultProps: {
children: "children",
label: "label"
},
form: {
id: '',
parentId:'',
link:"",
path: "",
name: "",
sortNum: "",
},
// rules表單驗(yàn)證
rules: {
// parentId: [
// { required: true, message: "請(qǐng)選擇父級(jí)菜單", trigger: "blur" }
// ],
name: [
{ required: true, message: "請(qǐng)輸入菜單名稱(chēng)", trigger: "blur" }
],
link: [{ required: true, message: "請(qǐng)輸入link", trigger: "blur" }],
path: [{ required: true, message: "請(qǐng)輸入path", trigger: "blur" }],
sortNum: [
{ required: true, message: "請(qǐng)輸入菜單順序", trigger: "blur" }
]
},
fmenu: [],
};
},
created() {
// this.getList();
this.getdata();
// this.getmenu();
// console.log(DotDropdown, " DotDropdown,");
},
methods: {
//彈框的四個(gè)操作
//新建同級(jí)
addPeerNode(item){
console.log(item,'新建同級(jí)')
this.reset('form')
this.form.id=''
// 這個(gè)能確保建立子級(jí)的同級(jí)
this.form.parentId=item.node.parent.data.id
console.log(item.node.parent.data.id,"item.node.id")
this.tit = '新建同級(jí)'
},
//新建子級(jí)
addNode(item){
console.log(item,'新建子級(jí)')
let id = item.data.id
this.form.parentId = id
this.reset('form')
this.form.id=''
this.tit = '新建子級(jí)'
},
//編輯
editNode(item){
console.log(item,'編輯')
this.tit = '編輯'
let id = item.data.id
getCategory(id)
.then(res => {
console.log(res, "根據(jù)id查信息");
this.form = res.data
// console.log(JSON.stringify(res))
// this.form = res.data.data
// this.$refs.tree.setCheckedNodes([])
// this.$refs.tree.setCheckedNodes([arr])
})
.catch(err => {
this.loading = false;
this.$message.error("用戶(hù)管理獲取失敗,請(qǐng)稍后再試!");
});
},
//刪除(ok)
removeNode(item){
this.tit = '刪除'
let id = item.data.id
// console.log(id,"kk")
delCategory(id).then(res=>{
this.getdata();
this.reset('form')
this.form.id=''
this.tit="新建同級(jí)"
this.$message.success("刪除成功!");
})
.catch(err => {
this.$message.error("表刪除失敗,請(qǐng)稍后再試!");
})
},
// 獲取數(shù)據(jù)
getdata() {
listCategorytree()
.then(res => {
this.treeData = res.categorys;
})
.catch(err => {
this.loading = false;
this.$message.error("菜單管理列表失敗,請(qǐng)稍后再試!");
});
},
// 添加
addModule() {
// this.showdelete = false;
this.form.link = "";
this.form.name = "";
this.form.path = "";
this.form.sortNum = "";
this.form.parentId = "";
this.form.id = "";
},
// 獲取父級(jí)菜單
// getmenu() {
// listCategory()
// .then(response => {
// //為啥返回的parentid不一樣
// response.rows.forEach(a=>{
// a.parentId =0
// })
// this.fmenu = [];
// const menu = { id: '', menuName: "主類(lèi)目", children: [] };
// menu.children = this.handleTree(response.rows, "id");
// this.fmenu.push(menu);
// })
// .catch(err => {
// this.loading = false;
// this.$message.error("父級(jí)菜單列表獲取失敗,請(qǐng)稍后再試!");
// });
// },
/** 轉(zhuǎn)換菜單數(shù)據(jù)結(jié)構(gòu) */
// normalizer(node) {
// // console.log(node,"nnn")
// if (node.children && !node.children.length) {
// delete node.children;
// }
// return {
// id: node.id,
// label: node.name,
// children: node.children
// };
// },
// 復(fù)選變單選
handleClick(data, checked, node) {
if (checked) {
// this.$refs.tree.setCheckedNodes([]);
// this.$refs.tree.setCheckedNodes([data]);
this.showdelete = true;
} else {
}
},
// 點(diǎn)擊節(jié)點(diǎn)
nodeclick(arr, node, self) {
},
// 保存菜單
saveModule(editData) {
this.$refs[editData].validate(valid => {
if (valid) {
console.log(this.form,this.form.parentId,"idiidid")
if (this.form.id != '') {
updateCategory(this.form).then(response => {
this.msgSuccess("修改成功");
this.getdata();
// this.getmenu();
this.reset('form')
});
} else {
addCategory(this.form).then(response => {
this.msgSuccess("新增成功");
this.getdata();
// this.getmenu();
this.reset('form')
});
}
} else {
return false;
}
});
},
// 重置
reset(formName) {
this.$refs[formName].resetFields();
}
}
};
</script>
<style lang="less" scoped>
.mt30 {
margin-bottom: 30px;
}
.el-tree-node__content {
position: relative;
}
.el-tree-node__content :hover,
.el-tree-node__content :focus-within {
.operate-btns {
display: inline;
}
}
.operate-btns {
position: absolute;
right: 2px;
}
//
.bg-purple {
background: #d3dce6;
}
.rightform{
border: #f1f3f7 solid 1px;
padding: 30px 30px 20px 0px;
box-shadow: 5px 5px 5px #cdcfcf;
background: #fff
}
.lefttree{
border: #f1f3f7 solid 1px;
padding: 30px 30px 20px 0px;
box-shadow: 5px 5px 5px #cdcfcf;
background: #fff
}
.tit-box{
// border-bottom: #666 solid 1px;
text-align: center;
width: 100%;
/* margin: 0 auto; */
margin-bottom: 20px;
}
</style>自組件drop
<template>
<el-dropdown trigger="click" class="custom-tree-menu" size="small">
<i class="el-icon-more rotate " />
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-for='(item,index) in eventsa' :key="index" :divided="index >0" @click.native="clickMenu(item)">
{{item.label}}
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
<script>
export default {
props: {
eventsa: {
type: Array,
default: function() {
return [
{ label: '新建同級(jí)', funcName: 'addPeerNode' },
{ label: '新建子級(jí)', funcName: 'addNode' },
// { label: '分配操作', funcName: 'distributeAction' },
{ label: '編輯', funcName: 'editNode' },
{ label: '刪除', funcName: 'removeNode' }
]
}
},
// 注入數(shù)據(jù)
data: {
type: Object
}
},
data(){
return{
// events2:[]
}
},
methods: {
clickMenu(item) {
console.log(item,"item",this.data)
this.$emit(item.funcName, this.data)
}
}
}
</script>
<style scoped>
.el-icon-more:before {
content: "\E794";
color: #c0c4cc;
font-size: 15px;
}
.rotate {
cursor: pointer;
margin-left: 5px;
transform: rotate(90deg);
}
/* .rotate:focus {
width: 15px;
height: 15px;
border-radius: 4em;
background-color: rgba(130, 132, 138, 0.2);
} */
</style>實(shí)現(xiàn)的效果:

有個(gè)問(wèn)題 點(diǎn)擊按鈕就會(huì)在頁(yè)面頂部閃現(xiàn)
teleported這個(gè)設(shè)置為false 就好了
到此這篇關(guān)于vue 實(shí)現(xiàn)dot-dropdown的文章就介紹到這了,更多相關(guān)vue dot-dropdown內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Vue之elementUI下拉菜單dropdown組件中command方法添加額外參數(shù)方式
- 手寫(xiě)實(shí)現(xiàn)vue2下拉菜單dropdown組件實(shí)例
- vue中使用el-dropdown方式
- Vue.js 帶下拉選項(xiàng)的輸入框(Textbox with Dropdown)組件
- Vue+Element UI 樹(shù)形控件整合下拉功能菜單(tree + dropdown +input)
- 解決vue使用vant下拉框van-dropdown-item 綁定title值不變問(wèn)題
- vue+element搭建后臺(tái)小總結(jié) el-dropdown下拉功能
相關(guān)文章
vue+drf+第三方滑動(dòng)驗(yàn)證碼接入的實(shí)現(xiàn)
這篇文章要給大家介紹的是vue和drf以及第三方滑動(dòng)驗(yàn)證碼接入的實(shí)現(xiàn),下文小編講詳細(xì)講解該內(nèi)容,感興趣的小伙伴可以和小編一起來(lái)學(xué)習(xí)奧2021-10-10
Object.assign觸發(fā)watch原理示例解析
這篇文章主要為大家介紹了Object.assign觸發(fā)watch原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
vue3數(shù)據(jù)更新而視圖未更新問(wèn)題解決
本文主要介紹了vue3?解決數(shù)據(jù)更新而視圖未更新問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-10-10
vue中按鈕操作完刷新頁(yè)面的實(shí)現(xiàn)
這篇文章主要介紹了vue中按鈕操作完刷新頁(yè)面的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
Vue監(jiān)聽(tīng)一個(gè)數(shù)組id是否與另一個(gè)數(shù)組id相同的方法
今天小編就為大家分享一篇Vue監(jiān)聽(tīng)一個(gè)數(shù)組id是否與另一個(gè)數(shù)組id相同的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
Vue-cli assets SubDirectory及PublicPath區(qū)別詳解
這篇文章主要介紹了Vue-cli assets SubDirectory及PublicPath區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
Nuxt升級(jí)2.0.0時(shí)出現(xiàn)的問(wèn)題(小結(jié))
這篇文章主要介紹了Nuxt升級(jí)2.0.0時(shí)出現(xiàn)的問(wèn)題(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-10-10

