亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

VUE餓了么樹形控件添加增刪改功能的示例代碼

2019-11-19 15:09:03
字體:
來源:轉載
供稿:網友

本文介紹了VUE餓了么樹形控件添加增刪改功能的示例代碼,分享給大家,具體如下:

element-ui樹形控件:地址

在原文檔中有個案例是有新增和刪除功能,但是后來發現其修改的數據并不能直接影響到樹形數據,所以采用了 render-content 的API重新寫了個組件。

寫個開發的步驟,所以文章比較長emmm

大致效果如圖:

1.省市API

在網上復制了個省市的list,有兩個屬性是新增的

  • isEdit :控制編輯狀態
  • maxexpandId :為現下id的最大值
export default{  maxexpandId: 95,  treelist: [{     id: 1,     name: "北京市",     ProSort: 1,     remark: "直轄市",    pid: '',    isEdit: false,    children: [{      id: 35,      name: "朝陽區",      pid: 1,      remark: '',      isEdit: false,      children: []    }]  }{...}]}

2.el-tree Component基本

咱們一步步來,先寫個餓了么的組件

<template>  <el-tree ref="expandMenuList" class="expand-tree"    v-if="isLoadingTree"    :data="setTree"    node-key="id"    highlight-current    :props="defaultProps"    :expand-on-click-node="false"    :render-content="renderContent"    :default-expanded-keys="defaultExpandKeys"></el-tree></template><!--* highlight-current :為了點擊時節點高亮* expand-on-click-node : 只能箭頭控制樹形的展開收縮* render-content : 節點渲染方式* default-expanded-keys :默認展開節點-->

同時引入API和節點渲染的組件

import TreeRender from '@/components/tree_render'import api from '@/resource/api'

然后搭建好基礎

data(){ return{  maxexpandId: api.maxexpandId,//新增節點開始id  non_maxexpandId: api.maxexpandId,//新增節點開始id(不更改)  isLoadingTree: false,//是否加載節點樹  setTree: api.treelist,//節點樹數據  defaultProps: {   children: 'children',   label: 'name'  },  defaultExpandKeys: [],//默認展開節點列表 }},

添加個渲染的method

methods: {  renderContent(h,{node,data,store}){   let that = this;//指向vue   return h(TreeRender,{    props: {     DATA: data,//節點數據     NODE: node,//節點內容     STORE: store,//完整樹形內容    },    on: {//綁定方法     nodeAdd: ((s,d,n) => that.handleAdd(s,d,n)),     nodeEdit: ((s,d,n) => that.handleEdit(s,d,n)),     nodeDel: ((s,d,n) => that.handleDelete(s,d,n))    }   });  },  handleAdd(s,d,n){//增加節點   console.log(s,d,n)  },  handleEdit(s,d,n){//編輯節點   console.log(s,d,n)  },  handleDelete(s,d,n){//刪除節點   console.log(s,d,n)  }}

3.tree_render Component基本

渲染組件:

<template>  <span class="tree-expand">    <span class="tree-label">      <span>{{DATA.name}}</span>    </span>    <span class="tree-btn">      <i class="el-icon-plus" @click.stop="nodeAdd(STORE,DATA,NODE)"></i>      <i class="el-icon-edit" @click.stop="nodeEdit(STORE,DATA,NODE)"></i>      <i class="el-icon-delete" @click.stop="nodeDel(STORE,DATA,NODE)"></i>    </span>  </span></template>

添加好幾個按鈕(element-ui自帶icon:地址)對應的方法:

export default{  props: ['NODE', 'DATA', 'STORE'],  methods: {   nodeAdd(s,d,n){//新增    this.$emit('nodeAdd',s,d,n)   },   nodeEdit(s,d,n){//編輯    this.$emit('nodeEdit',s,d,n)   },   nodeDel(s,d,n){//刪除    this.$emit('nodeDel',s,d,n)   }  }}

4.改

我們用isEdit來切換input和span的顯示狀態,首先加個input:

<!-- tree_render component --><template>  <span class="tree-expand">    <span class="tree-label" v-if="DATA.isEdit">      <el-input class="edit" size="mini"      :ref="'treeInput'+DATA.id"      v-model="DATA.name"></el-input>    </span>    <template v-else>      <span class="tree-label">        <span>{{DATA.name}}</span>      </span>      <span class="tree-btn" v-show="!DATA.isEdit">        <i class="el-icon-plus" @click.stop="nodeAdd(STORE,DATA,NODE)"></i>        <i class="el-icon-edit" @click.stop="nodeEdit(STORE,DATA,NODE)"></i>        <i class="el-icon-delete" @click.stop="nodeDel(STORE,DATA,NODE)"></i>      </span>    </template>  </span></template>

編輯的時候按鈕同時消失,那么什么時候編輯完成呢?

  • 編輯完按enter鍵=》監聽input的enter輸入
  • 點擊其他節點=》input失焦-blur=》編輯時自動聚焦-focus
  • 點擊當前節點范圍

當以上三點發生一項,節點對應的data都要isEdit = false;

1、enter鍵

<!-- tree_render component --><el-input @keyup.enter.native="nodeEditPass(STORE,DATA,NODE)"></el-input>

添加方法:

//tree_render componentmethods: {  nodeEditPass(s,d,n){    d.isEdit = false;  }}

2、focus or blur

<!-- tree_render component --><el-input @blur="nodeEditPass(STORE,DATA,NODE)"></el-input>

后來發現第一次編輯時能讓input聚焦,點擊第二個input就不起作用了,加了autofocus屬性也同樣如此。所以我們要在點擊編輯icon的時候,用原生的input autofocus。

修改方法:

//tree_render componentnodeEdit(s,d,n){//編輯 d.isEdit = true; this.$nextTick(() => {  this.$refs['treeInput'+d.id].$refs.input.focus() }) this.$emit('nodeEdit',s,d,n)}

3、當前節點點擊

采用el-tree已有的API――node-click

<!-- el-tree component --><el-tree @node-click="handleNodeClick"></el-tree>

添加methods:

//el-tree componentmethods: {  handleNodeClick(d,n,s){//點擊節點   d.isEdit = false;//放棄編輯狀態  }}

問題來了,如果在編輯狀態下點擊此節點也同樣會影響input,這就無法進入編輯,所以要阻止input事件冒泡:

<!-- tree_render component --><el-input @click.stop.native="nodeEditFocus"></el-input>

添加methods:

//tree_render componentmethods: {  nodeEditFocus(){}}

4、v-show代替v-if

這里有個新的問題,當用戶經常編輯修改,v-if模板的開銷更高,所以改用v-show。而后者不支持template模板,所以要適當調整一下位置:

<template>  <span class="tree-expand">    <span class="tree-label" v-show="DATA.isEdit">      <el-input class="edit" size="mini" autofocus      v-model="DATA.name"      :ref="'treeInput'+DATA.id"      @click.stop.native="nodeEditFocus"      @blur="nodeEditPass(STORE,DATA,NODE)"      @keyup.enter.native="nodeEditPass(STORE,DATA,NODE)"></el-input>    </span>    <span v-show="!DATA.isEdit">      <span>{{DATA.name}}</span>    </span>    <span class="tree-btn" v-show="!DATA.isEdit">      <i class="el-icon-plus" @click.stop="nodeAdd(STORE,DATA,NODE)"></i>      <i class="el-icon-edit" @click.stop="nodeEdit(STORE,DATA,NODE)"></i>      <i class="el-icon-delete" @click.stop="nodeDel(STORE,DATA,NODE)"></i>    </span>  </span></template>

5.增

新增節點 =》添加一條數據

  1. 新增的同時展開父節點
  2. 是否考慮無限新增
//el-tree componenthandleAdd(s,d,n){//增加節點 console.log(s,d,n) if(n.level >=6){  this.$message.error("最多只支持五級!")  return false; } //添加數據 d.children.push({  id: ++this.maxexpandId,  name: '新增節點',  pid: d.id,  isEdit: false,  children: [] }); //展開節點 if(!n.expanded){  n.expanded = true; }}

新增節點字體加粗 =》給節點添加一個class =》 如何判斷是否新增?

我們有一個參數maxexpandId

tree_render添加一個prop

//el-tree componentrenderContent(h,{node,data,store}){//加載節點 let that = this; return h(TreeRender,{  props: {   ...   maxexpandId: that.non_maxexpandId  },  on: {...} });}

根據id判斷:

//tree_render componentprops: ['NODE', 'DATA', 'STORE', 'maxexpandId']
<!-- tree_render component --><span v-show="!DATA.isEdit" :class="[DATA.id > maxexpandId ? 'tree-new tree-label' : 'tree-label']":ref="'treeLabel'+DATA.id">  <span>{{DATA.name}}</span></span>.tree-expand .tree-label.tree-new{  font-weight:600;}

6.刪

跟新增同義:刪除節點 =》刪除一條數據

  • 新增節點直接刪除
  • 已有節點需提示再刪除
  • 已有子級節點不能刪除
handleDelete(s,d,n){//刪除節點 console.log(s,d,n) let that = this; //有子級不刪除 if(d.children && d.children.length !== 0){  this.$message.error("此節點有子級,不可刪除!")  return false; }else{  //刪除操作  let delNode = () => {   let list = n.parent.data.children || n.parent.data,   //節點同級數據,頂級節點時無children    _index = 99999;//要刪除的index   list.map((c,i) => {    if(d.id == c.id){     _index = i;    }   })   let k = list.splice(_index,1);   //console.log(_index,k)   this.$message.success("刪除成功!")  }  let isDel = () => {   that.$confirm("是否刪除此節點?","提示",{    confirmButtonText: "確認",    cancelButtonText: "取消",    type: "warning"   }).then(() => {    delNode()//此處可通過ajax做刪除操作   }).catch(() => {    return false;   })  }  //新增節點直接刪除,否則要通過請求數據刪除  d.id > this.non_maxexpandId ? delNode() : isDel() }}

7.拓展

還有一些特別的需求,例如:

1、點擊高亮的時候顯示icon

.expand-tree .is-current>.el-tree-node__content .tree-btn,.expand-tree .el-tree-node__content:hover .tree-btn{ display: inline-block;}

2、添加頂級節點

添加按鈕:

<!-- el-tree component --><el-button @click="handleAddTop">添加頂級節點</el-button>

添加methods:

//el-tree componentmethods: { handleAddTop(){  this.setTree.push({   id: ++this.maxexpandId,   name: '新增節點',   pid: '',   isEdit: false,   children: []  }) }}

3、默認展開樹形第一級

//el-tree componentmounted(){ this.initExpand()},methods: { initExpand(){  //isLoadingTree用意也是在此  this.setTree.map((a) => {   this.defaultExpandKeys.push(a.id)  });  this.isLoadingTree = true; },}

8.github

還有些具體的樣式都放在github

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久精品视频在线观看| 91久久国产精品91久久性色| 国产精品ⅴa在线观看h| 97香蕉久久夜色精品国产| 欧美视频一区二区三区…| 欧美日韩在线视频一区二区| 一区二区三区天堂av| 91精品在线影院| 日韩在线视频线视频免费网站| 国产精品日日摸夜夜添夜夜av| 久久激情视频免费观看| 亚洲女人天堂网| 午夜精品一区二区三区在线| 91免费综合在线| 伊人久久久久久久久久久久久| 日本一区二三区好的精华液| 欧美精品videossex88| 91精品国产亚洲| 欧美韩日一区二区| 国产一区视频在线播放| 精品亚洲aⅴ在线观看| 欧美一区亚洲一区| 欧美成人中文字幕在线| 亚洲女同性videos| 日韩女优人人人人射在线视频| 538国产精品视频一区二区| 国产91在线播放九色快色| 一夜七次郎国产精品亚洲| 精品欧美国产一区二区三区| 国产美女搞久久| 日本伊人精品一区二区三区介绍| 91精品国产乱码久久久久久久久| 亚洲黄页网在线观看| 91色视频在线观看| 欧美精品激情blacked18| 久久精品中文字幕| 69**夜色精品国产69乱| 日韩欧美中文字幕在线播放| 性金发美女69hd大尺寸| 久久99久久99精品免观看粉嫩| 成人精品福利视频| 亚洲人成电影在线观看天堂色| 中文字幕日韩专区| 欧美做受高潮电影o| 日韩中文在线视频| 国产精品99导航| 亚洲人成网站免费播放| 欧美电影免费观看网站| 91视频国产精品| 91av在线看| 久久久久久噜噜噜久久久精品| 国产精品久久久久久久久影视| 亚洲欧美中文日韩v在线观看| 91精品国产乱码久久久久久蜜臀| 欧美综合在线观看| 日韩小视频在线| 欧美专区第一页| 精品国产视频在线| 一区二区三区在线播放欧美| 91地址最新发布| 亚洲人成77777在线观看网| 亚洲一区国产精品| 57pao国产精品一区| 中文字幕日韩有码| 亚洲午夜未删减在线观看| 欧美日韩免费看| 亚洲tv在线观看| 欧美理论电影在线播放| 国产一区二区色| 色噜噜狠狠色综合网图区| 久久久噜噜噜久久| 欧美精品www在线观看| 欧美国产日韩一区二区三区| 欧美激情一区二区三区高清视频| 亚洲日本中文字幕免费在线不卡| 国产一区二区三区三区在线观看| 亚洲aaaaaa| 中文字幕成人在线| 97视频在线免费观看| 九九精品在线观看| 国产91对白在线播放| 欧美精品久久久久| 日韩视频亚洲视频| yellow中文字幕久久| 国产精品久久久久久久久久东京| 亚洲小视频在线观看| 都市激情亚洲色图| 国产成人精品综合久久久| 国产精品一区=区| 国产日韩中文在线| 日韩av资源在线播放| 88国产精品欧美一区二区三区| 久久夜色撩人精品| 亚洲曰本av电影| 日韩欧美国产高清91| 亚洲欧美色婷婷| 在线观看欧美www| 日韩毛片在线看| 国产一区私人高清影院| 欧美电影在线免费观看网站| 欧美激情亚洲视频| 久久夜精品va视频免费观看| 一区二区三区在线播放欧美| 国产精品情侣自拍| 91在线观看免费高清完整版在线观看| 91黄色8090| 亚洲精品久久久一区二区三区| 国产精品黄页免费高清在线观看| 久久久视频精品| 国产69久久精品成人看| 在线日韩日本国产亚洲| 久久综合亚洲社区| 国产精品a久久久久久| 国产九九精品视频| 亚洲国产欧美一区二区三区久久| 精品丝袜一区二区三区| 亚洲第一福利在线观看| 国产狼人综合免费视频| 国内免费久久久久久久久久久| 欧美日韩国产一区二区三区| 性日韩欧美在线视频| 亚洲国产天堂久久综合| 国产一区二区免费| 亚洲va欧美va国产综合久久| 日韩国产在线看| 国产欧美在线观看| 亚洲人成网站在线播| 久久99精品久久久久久琪琪| 欧美大片网站在线观看| 欧美日韩激情视频8区| 久久999免费视频| 亚洲xxx自由成熟| 性色av一区二区三区在线观看| 国产精品日韩在线一区| 亚洲一区精品电影| 久久综合五月天| 久久成人亚洲精品| 91久久精品久久国产性色也91| 亚洲码在线观看| 久久亚洲综合国产精品99麻豆精品福利| 日韩成人在线电影网| 91精品国产综合久久香蕉的用户体验| 欧美日韩国产区| 国产日韩精品电影| 日韩av在线免费播放| 色偷偷偷亚洲综合网另类| 欧美精品免费播放| 国产精品av网站| 亚洲第一页自拍| 欧美性猛交xxxxx水多| 日韩中文字幕久久| 久久久久久久久爱| 亚洲综合自拍一区| 久久香蕉国产线看观看av| 国产精品夜间视频香蕉| 成人激情视频免费在线| 丰满岳妇乱一区二区三区| 国产午夜精品视频免费不卡69堂| 日韩视频第一页| 精品亚洲aⅴ在线观看| 亚洲天堂男人的天堂| 亚洲精品国产成人| 庆余年2免费日韩剧观看大牛| 欧美理论在线观看|