欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue實現(xiàn)樹形結(jié)構(gòu)增刪改查的示例代碼

 更新時間:2021年09月22日 15:23:15   作者:前端開發(fā)二月半  
其實很多公司都會有類似于用戶權(quán)限樹的增刪改查功能,本文主要介紹了vue實現(xiàn)樹形結(jié)構(gòu)增刪改查,具有一定的參考價值,感興趣的小伙伴們可以參考一下

其實很多公司都會有類似于用戶權(quán)限樹的增刪改查功能,正好最近我剛寫了一個樹形結(jié)構(gòu)的增刪改,在這里和大家分享一下,如果有不合理的地方歡迎評論,我會盡快優(yōu)化~~ 先附上一下效果圖

這個是沒有點擊編輯時,產(chǎn)品的需求是選中某個節(jié)點,取得該節(jié)點對應(yīng)的設(shè)備數(shù)據(jù),所以初始頁面是下面這個樣子的。

在這里插入圖片描述

這個是點擊了編輯之后,顯示節(jié)點的編輯按鈕

在這里插入圖片描述

點擊最上面的添加按鈕,顯示最外層父節(jié)點的添加畫面

在這里插入圖片描述

修改節(jié)點名稱

在這里插入圖片描述

因為我們的需求是編輯與非編輯兩種狀態(tài),所以我用了兩個樹形組件,通過v-if進行控制。(v-if:該組件不存在,v-show:組件占用空間,只是不展示)

<el-tree
    v-if="treeSetData.editFlg"
     ref="tree"
     :key="treeSetData.tree_key"
     :data="treeSetData.treeData"
     node-key="id"
     :render-content="renderContent"
     :expand-on-click-node="false"
     :default-expand-all="treeSetData.defaultExpandAll"
     highlight-current
     @node-click="handleNodeClick"
     class="tree-style"
 ></el-tree>
 <el-tree
     v-else
     ref="tree"
     :key="treeSetData.tree_key"
     :data="treeSetData.treeData"
     node-key="id"
     :render-content="renderContent"
     :expand-on-click-node="false"
     :default-expand-all="treeSetData.defaultExpandAll"
     highlight-current
     class="tree-style"
 ></el-tree>

樹形組件的字段說明我就不一一贅述了,可以通過element-ui的樹形組件官網(wǎng)查看,但是我要單獨說明一下以下方法,

  • render-content:自定義節(jié)點內(nèi)容,renderContent:為方法名。
  • @node-click:節(jié)點點擊時調(diào)用,因為只有在非編輯狀態(tài)下才存在節(jié)點點擊效果,因此該方法我只寫在了非編輯的樹形組件內(nèi)

所需data說明

// 樹形結(jié)構(gòu)所需數(shù)據(jù)  
treeSetData:{
  defaultExpandAll:true, // 是否默認展開
  editFlg:true, // 是否是編輯狀態(tài)
  treeData: [], // 樹形組件數(shù)據(jù)集
  // 編輯樹形數(shù)組內(nèi)容
  editList:[],
  // 刪除樹形數(shù)據(jù)數(shù)組內(nèi)容
  deleteList:[],
  // 添加樹形數(shù)據(jù)數(shù)組內(nèi)容
  addList:[],
  // 是否添加flg
  addNodeFlg:false,
  // 默認的id
  defaultId:5000,
  // 新增的最外層節(jié)點名稱
  newName:'',
  tree_key: 0,
},

說明一下最外層節(jié)點的添加方法,其實主要的核心思想是控制下方的輸入框以及按鈕的展示與否,然后點擊確認按鈕之后,在原有的樹形組件data里新增一條數(shù)據(jù)。

實現(xiàn)畫面

在這里插入圖片描述

添加按鈕的html代碼

<el-button type="text" @click="add_new_Area" class="button-style"><i class="el-icon-plus" style="margin-right:5px"></i>添加</el-button>

添加按鈕點擊方法【add_new_Area】

add_new_Area() {
      this.treeSetData.addNodeFlg = true;
    },

文本框的代碼片段

<el-row class="add_question" v-show="treeSetData.addNodeFlg">
    <el-col :span="11" style="margin:0px 5px">
         <el-input v-model="treeSetData.newName" placeholder="通行區(qū)域" size="mini"></el-input>
     </el-col>
     <el-col :span="12">
         <el-button size="mini" type="primary" plain @click.stop="add_area_sure">確定</el-button>
         <el-button size="mini" type="warning" plain @click.stop="add_area_cancel">取消</el-button>
     </el-col>
 </el-row>

確認按鈕【add_area_sure】

add_area_sure() {
// 添加節(jié)點數(shù)據(jù),因為是最上層,所以默認父ID是pid,id的話是我初始化設(shè)置的【defaultId】的自加,大家自己在data中加一下【defaultId】字段就可以了
  const nodeObj = {
    id: this.treeSetData.defaultId++,
    name: this.treeSetData.newName,
    isEdit: false,
    children: [],
    pid:0
  };
  this.treeSetData.treeData.push(nodeObj);
  this.treeSetData.addNodeFlg = false;
  this.treeSetData.addList.push(nodeObj);
},

取消按鈕【add_area_cancel】

add_area_cancel() {
  this.treeSetData.addNodeFlg = false;
  this.treeSetData.newName = "";
},

至此就可以實現(xiàn)最外層節(jié)點的添加了。

編輯狀態(tài)下的幾點增刪改的話,其實就是通過自定義節(jié)點內(nèi)容的【renderContent】這個方法實現(xiàn)的,快下班了我就不一一說明了,有時間再補吧,先把主要代碼提出來~

// 通行區(qū)域樹操作group node,
    renderContent(h, { node, data, store }) {
        if(this.treeSetData.editFlg == false){
            return (
                <span class="tree-span">
                    <span>{this.showOrEdit(data)}</span>
                    <div class="tree_node_op">
                        <i class="el-icon-edit" on-click={ev => this.nodeEdit(ev, store, data)} style="padding-left: 10px;"></i>
                        <i class="el-icon-circle-plus" on-click={() => this.nodeAdd(node, data)} style="margin-left: 5px;"></i>
                        <i class="el-icon-remove" on-click={() => this.nodeDelete(node, data)} style="margin-left: 5px;"></i>
                    </div>
                </span>
            );
        } else {
            return (
                <span class="tree-span">
                    <span>{this.showOrEdit(data)}</span>
                    <div class="tree_node_op">
                    </div>
                </span>
            );
        }
    },

    // 節(jié)點編輯
    showOrEdit(data) {
      if (data.isEdit) {
        return (
          <el-input
            type="text"
            value={data.name}
            on-blur={ev => this.edit_sure(ev, data)}
            size="mini"
            class="input-style"
          ></el-input>
        );
      } else {
        return <span className="node_labe">{data.name}</span>;
      }
    },
    nodeEdit(ev, store, data) {
      data.isEdit = true;
      this.$nextTick(() => {
        const $input =
          ev.target.parentNode.parentNode.querySelector("input") ||
          ev.target.parentElement.parentElement.querySelector("input");
        !$input ? "" : $input.focus();
      });
    },

    // 確認編輯
    edit_sure(ev, data) {
        const $input =
            ev.target.parentNode.parentNode.querySelector("input") ||
            ev.target.parentElement.parentElement.querySelector("input");
        if (!$input) {
            return false;
        } else {
            data.name = $input.value;
            data.isEdit = false;
        }
        // 修改編輯樹形數(shù)據(jù)的內(nèi)容
        let editFilter = this.treeSetData.editList.filter((item)=>item.id == data.id);
        if (editFilter.length == 0){
            this.treeSetData.editList.push(data);
        } else {
            this.treeSetData.editList.forEach((item,i)=>{
                if(item.id == data.id) {
                    this.treeSetData.editList[i].name = data.name;
                }
            })
        }
    },

    // 增加節(jié)點
    nodeAdd(node, data) {
      if (data.pid !== 0){
        this.$message({type:'error',message:'通行區(qū)域最多只能有兩級層次結(jié)構(gòu)。'});
        return false;
      } else {
          const newChild = { id: this.treeSetData.defaultId++, name: '新增的通行區(qū)域', isEdit:false, pid:data.id, children: [] };
          if (!data.children) {
            this.$set(data, 'children', []);
          }
          data.children.push(newChild);
          this.treeSetData.addList.push(newChild);
      }
    },

    // 節(jié)點刪除
    nodeDelete(node, data) {
      this.treeSetData.deleteList.push(data);
      const parent = node.parent;
      const children = parent.data.children || parent.data;
      const index = children.findIndex(d => d.id === data.id);
      children.splice(index, 1);
    },

然后將上面處理完的數(shù)據(jù)(要增加的數(shù)據(jù):addList,要修改的數(shù)據(jù):editList,要刪除的數(shù)據(jù):deleteList)整體提交給后臺去做數(shù)據(jù)庫處理就可以了,但是需要注意一下以下的幾種情況。

// 先添加,后修改的數(shù)據(jù)整合
this.treeSetData.addList.forEach((item,i)=>{
    let editFilter = this.treeSetData.editList.filter((value)=>value.id == item.id);
    if(editFilter.length !== 0){
        this.treeSetData.addList[i] = editFilter[0];
        this.treeSetData.editList = this.treeSetData.editList.filter((value)=>value.id !== item.id);
    }
})
// 先添加,后刪除的數(shù)據(jù)整合
this.treeSetData.deleteList.forEach((item,i)=>{
    let addFilter = this.treeSetData.addList.filter((value)=>value.id == item.id);
    if(addFilter.length !== 0){
        this.treeSetData.deleteList = this.treeSetData.deleteList.filter((value)=>value.id !== item.id);
        this.treeSetData.addList = this.treeSetData.addList.filter((value)=>value.id !== item.id);
    }
})
// 先編輯,后刪除的數(shù)據(jù)整合
this.treeSetData.deleteList.forEach((item,i)=>{
    let editFilter = this.treeSetData.editList.filter((value)=>value.id == item.id);
    if(editFilter.length !== 0){
        this.treeSetData.editList = this.treeSetData.editList.filter((value)=>value.id !== item.id);
    }
})

樹形組件樣式

<style lang="less">
.el-message-box {width: 450px;}
.button-style {padding: 0px}
.input-style {height: 15px;width: 140px;}
.through-panel-body {
  padding-top:12px;
  width: 100%;
  display: flex;
  .panel-area-left {
    position: relative;
    width: 360px;
    border:2px solid rgba(240,240,240,1);
    border-radius: 5px;
    .head-title {
        display:flex;justify-content: space-between;padding:10px 10px;
        h5{border-left:solid 3px #FB8742;padding-left:5px;height: 20px;line-height:20px;font-size:16px;}
    }
    .area-tree {
        width: 100%;
        .tree-style {
            margin: 0px 0px 10px 10px;
            height:88%;
            overflow-y: auto;
        }
        .el-tree-node__content { 
            padding-left: 10px;display: flex;width: 100%; 
            .tree-span {
                display: flex; width: 100%; 
                .tree_node_op {
                    margin-left: 10px;color: #D3D3D3;
                }
            }
        }
    }
    .add_question {
        margin: 10px 0px;
    }
    .foot-style{
        padding-right:5px; 
        height: 40px;
        text-align: right;
    }
  }
  .panel-area-right {
    margin-right: 5px;
    width: 100%;
    padding-left: 15px;
    height: 100%;
    .el-row {
      width: 100%;
      display: flex;
      justify-content: space-between;
      .located-class {
        width: 50%;
      }
      .device-floor-class {
        width: 50%;
        display: flex;
        justify-content: flex-end;
      }
    }
  }
}
</style>

到此這篇關(guān)于vue實現(xiàn)樹形結(jié)構(gòu)增刪改查的示例代碼的文章就介紹到這了,更多相關(guān)vue 樹形結(jié)構(gòu)增刪改查內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Vue.js

    淺談Vue.js

    本文主要介紹了Vue.js的相關(guān)知識。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-03-03
  • vue3使用vue-router及路由權(quán)限攔截方式

    vue3使用vue-router及路由權(quán)限攔截方式

    這篇文章主要介紹了vue3使用vue-router及路由權(quán)限攔截方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Element-UI 解決el-table中圖片懸浮被遮擋問題小結(jié)

    Element-UI 解決el-table中圖片懸浮被遮擋問題小結(jié)

    在開發(fā)中,發(fā)現(xiàn)element-ui在el-table中添加圖片懸浮顯示時,會被單元格遮擋的問題,對于此問題解決其實也并不難,將懸浮圖片放在body節(jié)點下,通過定位顯示即可,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • 在vite項目中使用@進行文件的引入方式

    在vite項目中使用@進行文件的引入方式

    這篇文章主要介紹了在vite項目中使用@進行文件的引入方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • vuejs路由的傳參及路由props配置詳解

    vuejs路由的傳參及路由props配置詳解

    最近在學(xué)習(xí)vue router的傳參,所以下面這篇文章主要給大家介紹了關(guān)于vuejs路由的傳參及路由props配置的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • 結(jié)合mint-ui移動端下拉加載實踐方法總結(jié)

    結(jié)合mint-ui移動端下拉加載實踐方法總結(jié)

    下面小編就為大家?guī)硪黄Y(jié)合mint-ui移動端下拉加載實踐方法總結(jié)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • vue與django集成打包的實現(xiàn)方法

    vue與django集成打包的實現(xiàn)方法

    這篇文章主要介紹了vue與django集成打包的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • vue-router路由懶加載及實現(xiàn)的3種方式

    vue-router路由懶加載及實現(xiàn)的3種方式

    這篇文章主要給大家介紹了關(guān)于vue-router路由懶加載及實現(xiàn)的3種方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • vue3?騰訊地圖設(shè)置簽到范圍并獲取經(jīng)緯度的實現(xiàn)代碼

    vue3?騰訊地圖設(shè)置簽到范圍并獲取經(jīng)緯度的實現(xiàn)代碼

    本文給大家介紹vue3?騰訊地圖設(shè)置簽到范圍并獲取經(jīng)緯度的實現(xiàn)代碼,本文通過示例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2022-05-05
  • vueScroll實現(xiàn)移動端下拉刷新、上拉加載

    vueScroll實現(xiàn)移動端下拉刷新、上拉加載

    這篇文章主要介紹了vueScroll實現(xiàn)移動端下拉刷新、上拉加載,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評論