1. 程式人生 > >vue+element-ui,樹形表格,可以做許可權管理模組,可摺疊,全選,部分全選

vue+element-ui,樹形表格,可以做許可權管理模組,可摺疊,全選,部分全選

html部分:

<ul class="role-table col-xs-offset-2 col-md-offset-1 col-sm-offset-2">
    <li class="header">
        <div class="left">選單列表</div>
        <div class="right">功能許可權</div>
    </li>
    <div class="vertical-line"></div>
    <li  v-for="(item,index) in dataList" 
:key="item.id"> <div class="left h40" @click="fold(item)"> <i :class="{'el-icon-caret-right':item.folded,'el-icon-caret-bottom':!item.folded}" v-cloak v-if="item.second" class="item-icon"></i> <el-checkbox @click.native="handleOneCheckAll($event,item)"
v-cloak v-if="!item.second" :indeterminate="item.isIndeterminate" v-model="item.checkAll"> {{item.title}}</el-checkbox> <span v-if="item.second" v-cloak>{{item.title}}</span> </div> <div class="right h40"> <el-checkbox v-if=
"item.second" :indeterminate="item.isIndeterminate" @change="checkSecondAll(item)" v-model="item.firstCheckAll"> 所有</el-checkbox> <el-checkbox-group v-model="item.checkedCities" @change="handleOneCheckedCitiesChange(item)" v-else> <el-checkbox v-for="m in item.list" :label="m.id" :key="m.id" v-cloak> {{m.name}}</el-checkbox> </el-checkbox-group> </div> <div class="line"></div> <ul v-show="item.second&&!item.folded"> <li class="h40" v-for="(second,cur) in item.second" :key="second.id"> <div class="left"> <el-checkbox v-model="second.checkAll" @change="handleCheckAllChange($event,item,second)" v-cloak> {{second.title}} </el-checkbox> </div> <div class="right"> <el-checkbox-group v-model="second.checkedCities" @change="handleCheckedCitiesChange(item,second)"> <el-checkbox v-for="p in second.list" :label="p.id" :key="p.id" v-cloak > {{p.name}} </el-checkbox> </el-checkbox-group> </div> <div class="line"></div> </li> </ul> </li> </ul>
css部分
.role-table {
    border: 1px solid #e0e0e0;
border-bottom: none;
padding: 0;
position: relative;
}

.header {
    height: 40px;
line-height: 40px;
border-bottom: 1px solid #e7e7e7;
background: #F8F8F9;
text-align: center;
}

.vertical-line {
    width: 1px;
height: 100%;
background: #ddd;
position: absolute;
left: 30%;
top: 0
}

.left {
    width: 30%;
float: left;
padding-left: 10px;
user-select: none;
cursor: pointer;
}

.one {
    padding-left: 20px;
}

.right {
    width: 70%;
float: left;
padding-left: 10px;
}

.item-icon {
    margin-left: -5px;
padding: 5px;
}

.line {
    clear: both;
width: 100%;
height: 1px;
background: #e0e0e0;
}
.h40{
    height: 39px;
line-height: 39px;
}
[v-cloak] {
    display: none;
}
js部分
new Vue({
    el: "#app",
data: {
        dataList: [
            {
                title: "概況",
id: "0",
checkedCities:[],
list: [
                    {
                        name: "瀏覽",
id: "10001"
},
{
                        name: "修改",
id: "11111"
}
                ]
            },
{
                title: "會員管理",
id: "1",
second: [
                    {
                        title: "會員列表",
id: "11",
list: [
                            {
                                name: "新增",
id: "10002"
},
{
                                name: "修改",
id: "10003"
}
                        ],
checkedCities: []
                    },
{
                        title: "會員等級",
id: "12",
list: [
                            {
                                name: "新增",
id: "10004"
},
{
                                name: "修改",
id: "10005"
},
{
                                name: "刪除",
id: "1006"
}

                        ],
checkedCities: []
                    }
                ]
            },
{
                title: "菜品管理",
id: "2",
second: [
                    {
                        title: "菜品列表",
id: "21",
list: [
                            {
                                name: "新增",
id: "10007"
},
{
                                name: "修改",
id: "10008"
}
                        ],
checkedCities: []
                    },
{
                        title: "會員等級",
id: "22",
list: [
                            {
                                name: "瀏覽",
id: "10009"
},
{
                                name: "新增",
id: "10010"
},
{
                                name: "修改",
id: "10011"
},
{
                                name: "刪除",
id: "10012"
}
                        ],
checkedCities: []
                    }
                ]
            }
        ],
},
methods: {
        fold: function (item) {
            if (typeof item.folded === "undefined") {
                this.$set(item, "folded", true);
} else {
                item.folded = !item.folded;
}
        },
// 全選一項
handleCheckAllChange(event, item, second) {
            let arr = [];
for (let a = 0; a < second.list.length; a++) {
                arr.push(second.list[a].id)
            }
            if (typeof second.checkedCities === "undefined") {
                this.$set(second, "checkedCities", arr);
}
            second.checkedCities = event.target.checked ? arr : [];
// if (typeof second === "undefined") {
            //     this.$set(second, "isIndeterminate", false)
            // }
            // second.isIndeterminate = false;
if (typeof second.checkAll === "undefined") {
                this.$set(second, "checkAll", true);
}
            if (typeof item.isIndeterminate === "undefined") {
                this.$set(item, "isIndeterminate", true);
}
            for (let a = 0; a < item.second.length; a++) {
                if (!item.second[a].checkAll) {
                    item.isIndeterminate = true;
for (let a = 0; a < item.second.length; a++) {
                        if (item.second[a].checkAll) {
                            break
} else {
                            item.isIndeterminate = false;
item.firstCheckAll = false;
}
                    }
                    break
} else {
                    item.isIndeterminate = false;
item.firstCheckAll = true;
}
            }

        },
// 單選
handleCheckedCitiesChange(item, second) {
            let checkedCount = second.checkedCities.length;
if (typeof second.checkAll === "undefined") {
                this.$set(second, "checkAll", false);
}
            if (typeof second.isIndeterminate === "undefined") {
                this.$set(second, "isIndeterminate", false);
}
            if (typeof item.isIndeterminate === "undefined") {
                this.$set(item, "isIndeterminate", true);
}
            second.isIndeterminate = checkedCount > 0 && checkedCount < second.list.length;
second.checkAll = checkedCount === second.list.length;
if (checkedCount === 0) {
                second.isIndeterminate = false
}
            for (let a = 0; a < item.second.length; a++) {
                if (!item.second[a].checkAll) {
                    item.isIndeterminate = true;
for (let b = 0; b < item.second.length; b++) {
                        if (item.second[b].checkedCities.length > 0) {
                            break
} else {
                            item.isIndeterminate = false;
item.firstCheckAll = false;
}
                    }
                    break
} else {
                    item.isIndeterminate = false;
item.firstCheckAll = true;
}
            }

        },
// 點選所有
checkSecondAll: function (item) {
            if (typeof item.firstCheckAll === "undefined") {
                this.$set(item, "firstCheckAll", true);
}
            for (let a = 0; a < item.second.length; a++) {
                this.checkItemAll(item.firstCheckAll, item.second[a])
            }
            item.isIndeterminate=false
},
checkItemAll: function (flag, item) {
            let arr = [];
for (let a = 0; a < item.list.length; a++) {
                arr.push(item.list[a].id)
            }
            if (typeof item.checkedCities === "undefined") {
                this.$set(item, "checkedCities", arr);
}
            item.checkedCities = flag ? arr : [];
item.checkAll = flag;
},
// 沒有二級選單
handleOneCheckedCitiesChange:function (item) {
            let checkedCount = item.checkedCities.length;
if (typeof item.isIndeterminate === "undefined") {
                this.$set(item, "isIndeterminate", false);
}
            if (typeof item.checkAll === "undefined") {
                this.$set(item, "checkAll", false);
}
            item.isIndeterminate = checkedCount > 0 && checkedCount < item.list.length;
item.checkAll = checkedCount === item.list.length;
},
handleOneCheckAll:function (event,item) {
            let arr = [];
for (let a = 0; a < item.list.length; a++) {
                arr.push(item.list[a].id)
            }

            item.checkedCities = event.target.checked ? arr : [];
}
    }
})

相關推薦

vue+element-ui樹形表格可以許可權管理模組摺疊部分

html部分: <ul class="role-table col-xs-offset-2 col-md-offset-1 col-sm-offset-2"> <li class="header"> <div cla

ELement-UI樹形表格(treeTable&&treeGrid)

先上圖來一波 支援無限層級,支援新增子級時自動開啟父級,支援編輯時自動開啟父級,執行操作時自帶動畫效果,支援初始化時設定全部開啟或者關閉,支援一鍵展開與關閉絲滑般的無延遲 由於基於el-table擴充套件的,所以當然能夠使用el-table的所有功能 下面上程式碼: 1,核心JS,格式化資料來源

vue+element ui 分頁表格操作的坑

問題一:為實現分頁記憶選中項,但實際獲取資料後this.$refs.xxx.toggleRowSelection函式無效 【轉載】自“前端開發終生學習者”的《獲取資料後this.$refs.xxx.toggleRowSelection無效》 方法:獲取資料後在外部加上一個$nextTic

ELement-UI樹形表格(treeTable&&treeGrid)

先上圖來一波 支援無限層級,支援新增子級時自動開啟父級,支援編輯時自動開啟父級,執行操作時自帶動畫效果,支援初始化時設定全部開啟或者關閉,支援一鍵展開與關閉絲滑般的無延遲 由於基於el-table擴充套件的,所以當然能夠使用el-table的所有功能 下面上程式碼: 1,核心JS,格式化資料來源

websocket+springboot+vue+element ui完成資料表格的實時資料

java部分: import org.springframework.stereotype.Component; impo

vue element UI el-table 給表格新增複並得到所

<el-table @selection-change="changeFun"> <el-table-column type="selection"> </el-table-column> </el-table>

vue+element ui 的tab 動態增減切換時提示用戶是否切換

ble href test 點擊 rom item lock code vue.js 前言:工作中用到 vue+element ui 的前端框架,動態添加 Tab,刪除 Tab,切換 Tab 時提示用戶是否切換等,發現 element ui 有一個 bug,這裏記錄一下

vue 實現模糊搜尋功能vue-element ui改編input模糊查詢

 vue實現模糊搜尋功能 根據輸入的內容進行查詢資料,然後展示含有輸入內容的資料 <input v-model="issue_content" v-on:input ="inputFunc" type="text" placeholder="如何修改密碼"> <di

Vue+Element UI 向Table組建中的每一行新增一個switch元件實現每一行單獨控制

  最近在做公司的裝置管理系統,許可權管理中有一個需求需要展示如下: 每一行表格中的switch單獨控制一行; 實現效果的程式碼如下: <el-table :data="userRights" stripe border align="center" sty

求助:關於django rest framework + vue(element-ui)跨域問題求助大佬解決...

前端: headers: { token: '' } if (document.cookie.length > 0) { var arr = document.cookie.split('; ') for (var i = 0; i < arr.length; i++

vue + element-ui 製作tab切換(切換vue元件踩坑總結)

本篇文章使用vue結合element-ui開發tab切換vue的不同元件,每一個tab切換的都是一個新的元件。 1、vue如何使用element-ui 上一篇文章已經分享瞭如何在vue中使用element-ui建立tab元件切換內容(需要了解的朋友點選連結檢視) 2、建立相應檔案。   a、建立父元件

ie 報錯:'SyntaxError: strict 模式下不允許一個屬性有多個定義 ' 基於vue element-ui的坑的解決

環境:基於vue-cli的element- ui的專案 在其他瀏覽器正常。在ie中報錯的程式碼: <el-select filterable clearable v-model="Form.P

vue+element ui 使用$refs獲取el-dialog 下的 el-table 元件 ,以及使用table多預設選中

el-dialog程式碼塊:<el-button @click="opendialog">開啟dialog</el-button><el-dialog title="我是標

vue Element-ui 表格自帶篩選框自定義高度

image n-k pre chrome code lac 分享 sso spa el-table中可以在一行的某列進行篩選,代碼如下: <el-table-column prop="classOfTest" class="test" label="測試類名" :

VUE+Element UI實現簡單的表格行內編輯效果

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <!-- 引入樣式 --> <link rel="stylesheet" href="https://

vue+element-ui+slot-scope或原生實現編輯表格(日歷)

gui 兩種 label div 前言 大牛 對比 default 操作dom 你們公司的產品是不是還在做一個可編輯表格功能? 1.前言 咱開發拿到需求大多數是去網上找成型的組件,找不到再看原生的方法能否實現,大牛除外哈,大牛一般喜歡封裝組件框架。 2.思路 可編輯表格在後

element ui 分頁器遇到的bug。切換頁面時當時選擇第二頁第二個選項卡也是第二頁

我在這個教材選項卡選擇了第二頁。 然後切換到課件。看到下面效果 還是在第二頁的。實際上我已經處理了讓this.page=1.而且介面也給的第一頁的,但是頁面上顯示的卻是2. 解決辦法就是在分頁器上加一個引數。:current-page.sync = "pag

vue+element-ui專案中如何勾表格資料匯出到excel表格

        在專案中,我們會將查詢資料以table的形式顯示在頁面中,有時候需要匯出頁面資料或者勾選table的複選框來選擇要匯出的資料。element-ui的table元件本身提供了方法,當勾選每行前面的複選框時,獲得他的id。         當我們點選匯出按鈕時,

vue+element ui 表格自定義樣式溢位隱藏

樣式 .hoveTitle {   text-align: left;   width: 140px;   overflow: hidden;   text-overflow: ellipsis;   whit

Vue+element UI實現表格資料匯出Excel元件

介紹 這是一個可以將頁面中的表格資料匯出為Excel檔案的功能元件,該元件一般與表格一起使用,將表格資料傳給元件,然後通過點選元件按鈕可將表格中的資料匯出成Excel檔案。 使用方法 由於封裝該元件內部引用了xlsx.js,file-saver.js和elementUI,因此在使用該元件時,請先安裝如下