通過 iview 的checkbox 控制菜單樹

數(shù)據(jù)格式

后臺返回數(shù)據(jù)格式為

 var tree = [
        {
          children: [
            {
              children: [],
              hasRole: false,
              id: 24,
              name: "二級菜單A"
            },
            {
              children: [],
              hasRole: true,
              id: 27,
              name: "二級菜單B"
            },
            {
              children: [],
              hasRole: true,
              id: 25,
              name: "二級菜單C"
            },
            {
              children: [],
              hasRole: true,
              id: 26,
              name: "二級菜單D"
            }
          ],
          hasRole: true,
          id: 7,
          name: "一級菜單E"
        },
        {
          children: [
            {
              children: [],
              hasRole: false,
              id: 21,
              name: "二級菜單F"
            },
            {
              children: [],
              hasRole: false,
              id: 20,
              name: "二級菜單G"
            },
            {
              children: [],
              hasRole: false,
              id: 23,
              name: "二級菜單H"
            },
            {
              children: [],
              hasRole: false,
              id: 22,
              name: "二級菜單I"
            }
          ],
          hasRole: false,
          id: 6,
          name: "一級菜單J"
        },
        {
          children: [
            {
              children: [],
              hasRole: false,
              id: 32,
              name: "二級菜單K"
            },
            {
              children: [],
              hasRole: false,
              id: 33,
              name: "二級菜單L"
            },
            {
              children: [],
              hasRole: false,
              id: 28,
              name: "二級菜單M"
            },
            {
              children: [],
              hasRole: false,
              id: 29,
              name: "二級菜單N"
            },
            {
              children: [],
              hasRole: false,
              id: 30,
              name: "二級菜單O"
            },
            {
              children: [],
              hasRole: false,
              id: 31,
              name: "二級菜單P"
            }
          ],
          hasRole: false,
          id: 8,
          name: "一級菜單Q"
        },
        {
          children: [
            {
              children: [],
              hasRole: false,
              id: 13,
              name: "二級菜單R"
            }
          ],
          hasRole: false,
          id: 3,
          name: "一級菜單S"
        },
        {
          children: [
            {
              children: [],
              hasRole: false,
              id: 19,
              name: "二級菜單T"
            },
            {
              children: [],
              hasRole: false,
              id: 17,
              name: "二級菜單U"
            },
            {
              children: [],
              hasRole: false,
              id: 16,
              name: "二級菜單V"
            },
            {
              children: [],
              hasRole: false,
              id: 18,
              name: "二級菜單W"
            }
          ],
          hasRole: false,
          id: 5,
          name: "一級菜單X"
        },
        {
          children: [],
          hasRole: true,
          id: 1,
          name: "一級菜單Y"
        },
        {
          children: [
            {
              children: [],
              hasRole: false,
              id: 14,
              name: "二級菜單Z"
            },
            {
              children: [],
              hasRole: false,
              id: 15,
              name: "二級菜單0"
            }
          ],
          hasRole: false,
          id: 4,
          name: "一級菜單1"
        },
        {
          children: [
            {
              children: [],
              hasRole: false,
              id: 12,
              name: "二級菜單2"
            },
            {
              children: [],
              hasRole: false,
              id: 11,
              name: "二級菜單3"
            },
            {
              children: [],
              hasRole: false,
              id: 10,
              name: "二級菜單4"
            },
            {
              children: [],
              hasRole: false,
              id: 9,
              name: "二級菜單5"
            }
          ],
          hasRole: false,
          id: 2,
          name: "一級菜單6"
        }
      ];

樣式

F0CCA897-EF77-4494-A138-FD6180F80EB6.png

代碼

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>iview example</title>
    <link
      rel="stylesheet"
      type="text/css"
      
    />
    <script
      type="text/javascript"
      src="http://vuejs.org/js/vue.min.js"
    ></script>
    <script
      type="text/javascript"
      src="http://unpkg.com/iview/dist/iview.min.js"
    ></script>

    <style>
      #app {
        margin-top: 100px;
      }
      .boxer {
        width: 50%;
        margin-left: 20%;
        margin-top: 20px;
      }

      .line-split {
        border-bottom: 3px solid #eaa;
        padding-bottom: 6px;
        margin-bottom: 6px;
      }
    </style>
  </head>

  <body>
    <div id="app">
      <div v-for="(unit,indexu) in tree" class="boxer">
        <!-- @click.prevent.native="handleCheckAll" -->
        <div class="line-split">
          <Checkbox
            :indeterminate="treelist[indexu].indeterminate"
            :value="treelist[indexu].check"
            @click.prevent.native="handleCheckAll(indexu)"
            >{{ unit.name }}
          </Checkbox>
        </div>

        <!-- 雙向綁定異常 -->
        <Checkbox-Group
          v-model="treelist[indexu].list"
          @on-change="checkAllGroupChange(indexu)"
        >
          <Checkbox v-for="iunit in unit.children" :label="iunit.id"
            >{{ iunit.name }}
          </Checkbox>
        </Checkbox-Group>
      </div>
    </div>

    <script>
      var tree = [
        {
          children: [
            {
              children: [],
              hasRole: false,
              id: 24,
              name: "二級菜單A"
            },
            {
              children: [],
              hasRole: true,
              id: 27,
              name: "二級菜單B"
            },
            {
              children: [],
              hasRole: true,
              id: 25,
              name: "二級菜單C"
            },
            {
              children: [],
              hasRole: true,
              id: 26,
              name: "二級菜單D"
            }
          ],
          hasRole: true,
          id: 7,
          name: "一級菜單E"
        },
        {
          children: [
            {
              children: [],
              hasRole: false,
              id: 21,
              name: "二級菜單F"
            },
            {
              children: [],
              hasRole: false,
              id: 20,
              name: "二級菜單G"
            },
            {
              children: [],
              hasRole: false,
              id: 23,
              name: "二級菜單H"
            },
            {
              children: [],
              hasRole: false,
              id: 22,
              name: "二級菜單I"
            }
          ],
          hasRole: false,
          id: 6,
          name: "一級菜單J"
        },
        {
          children: [
            {
              children: [],
              hasRole: false,
              id: 32,
              name: "二級菜單K"
            },
            {
              children: [],
              hasRole: false,
              id: 33,
              name: "二級菜單L"
            },
            {
              children: [],
              hasRole: false,
              id: 28,
              name: "二級菜單M"
            },
            {
              children: [],
              hasRole: false,
              id: 29,
              name: "二級菜單N"
            },
            {
              children: [],
              hasRole: false,
              id: 30,
              name: "二級菜單O"
            },
            {
              children: [],
              hasRole: false,
              id: 31,
              name: "二級菜單P"
            }
          ],
          hasRole: false,
          id: 8,
          name: "一級菜單Q"
        },
        {
          children: [
            {
              children: [],
              hasRole: false,
              id: 13,
              name: "二級菜單R"
            }
          ],
          hasRole: false,
          id: 3,
          name: "一級菜單S"
        },
        {
          children: [
            {
              children: [],
              hasRole: false,
              id: 19,
              name: "二級菜單T"
            },
            {
              children: [],
              hasRole: false,
              id: 17,
              name: "二級菜單U"
            },
            {
              children: [],
              hasRole: false,
              id: 16,
              name: "二級菜單V"
            },
            {
              children: [],
              hasRole: false,
              id: 18,
              name: "二級菜單W"
            }
          ],
          hasRole: false,
          id: 5,
          name: "一級菜單X"
        },
        {
          children: [],
          hasRole: true,
          id: 1,
          name: "一級菜單Y"
        },
        {
          children: [
            {
              children: [],
              hasRole: false,
              id: 14,
              name: "二級菜單Z"
            },
            {
              children: [],
              hasRole: false,
              id: 15,
              name: "二級菜單0"
            }
          ],
          hasRole: false,
          id: 4,
          name: "一級菜單1"
        },
        {
          children: [
            {
              children: [],
              hasRole: false,
              id: 12,
              name: "二級菜單2"
            },
            {
              children: [],
              hasRole: false,
              id: 11,
              name: "二級菜單3"
            },
            {
              children: [],
              hasRole: false,
              id: 10,
              name: "二級菜單4"
            },
            {
              children: [],
              hasRole: false,
              id: 9,
              name: "二級菜單5"
            }
          ],
          hasRole: false,
          id: 2,
          name: "一級菜單6"
        }
      ];

      var treelist = [];
      var treei = 0;
      for (let index = 0; index < tree.length; index++) {
        var node = {};
        var nodelist = [];
        var alllist = [];
        var nodei = 0;
        var menu = tree[index];
        for (let ini = 0; ini < menu.children.length; ini++) {
          if (menu.children[ini].hasRole) {
            nodelist[nodei++] = menu.children[ini].id;
          }
          alllist[ini] = menu.children[ini].id;
        }
        node.size = menu.children.length;
        node.id = menu.id;
        node.list = nodelist;
        node.indeterminate = nodei > 0 && node.size != nodei;
        node.alllist = alllist;
        node.check = node.size == nodei;
        treelist[treei++] = node;
      }

      new Vue({
        el: "#app",
        data: {
          treelist: treelist
        },
        methods: {
          handleCheckAll: function(index) {
            if (treelist[index].indeterminate) {
              treelist[index].check = false;
            } else {
              treelist[index].check = !treelist[index].check;
            }
            treelist[index].indeterminate = false;

            if (treelist[index].check) {
              treelist[index].list = treelist[index].alllist;
            } else {
              treelist[index].list = [];
            }
          },
          checkAllGroupChange: function(index) {
            if (
              treelist[index].list.length === treelist[index].alllist.length
            ) {
              treelist[index].indeterminate = false;
              treelist[index].check = true;
            } else if (treelist[index].list.length > 0) {
              treelist[index].indeterminate = true;
              treelist[index].check = false;
            } else {
              treelist[index].indeterminate = false;
              treelist[index].check = false;
            }
          }
        }
      });
    </script>
  </body>
</html>

  • iview 定義的函數(shù)可以傳入自定義參數(shù)調用
  • 數(shù)組中存放數(shù)字正常使用, 當使用 toString() 函數(shù)時,不能正常綁定數(shù)據(jù).說明參數(shù)的類型是必須相同的(如果在js 中獲取id 時使用了 toString() ,那么在 :label = id 時 也要 用 toString())
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末贱田,一起剝皮案震驚了整個濱河市慨亲,隨后出現(xiàn)的幾起案子服傍,更是在濱河造成了極大的恐慌蒸甜,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件睛竣,死亡現(xiàn)場離奇詭異,居然都是意外死亡求摇,警方通過查閱死者的電腦和手機射沟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來与境,“玉大人验夯,你說我怎么就攤上這事∷さ螅” “怎么了挥转?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長共屈。 經(jīng)常有香客問我绑谣,道長,這世上最難降的妖魔是什么拗引? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任借宵,我火速辦了婚禮,結果婚禮上矾削,老公的妹妹穿的比我還像新娘壤玫。我一直安慰自己,他們只是感情好哼凯,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布欲间。 她就那樣靜靜地躺著,像睡著了一般断部。 火紅的嫁衣襯著肌膚如雪猎贴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音嘱能,去河邊找鬼吝梅。 笑死,一個胖子當著我的面吹牛惹骂,可吹牛的內容都是我干的苏携。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼对粪,長吁一口氣:“原來是場噩夢啊……” “哼右冻!你這毒婦竟也來了?” 一聲冷哼從身側響起著拭,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤纱扭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后儡遮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乳蛾,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年鄙币,在試婚紗的時候發(fā)現(xiàn)自己被綠了肃叶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡十嘿,死狀恐怖因惭,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情绩衷,我是刑警寧澤蹦魔,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站咳燕,受9級特大地震影響勿决,放射性物質發(fā)生泄漏。R本人自食惡果不足惜迟郎,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一剥险、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宪肖,春花似錦表制、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蜕衡,卻和暖如春壤短,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工久脯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纳胧,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓帘撰,卻偏偏與公主長得像跑慕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子摧找,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,101評論 1 32
  • 第3章 基本概念 3.1 語法 3.2 關鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,126評論 0 21
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5核行? 答:HTML5是最新的HTML標準。 注意:講述HT...
    kismetajun閱讀 27,485評論 1 45
  • 概要 64學時 3.5學分 章節(jié)安排 電子商務網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,197評論 0 3
  • √是日完成 1.復查 2.關于獨居女生的安全防范蹬耘。 ?是日收獲 需要等待芝雪。 什么意思呢?發(fā)現(xiàn)自己對想要的東西有點急...
    Silvia花花閱讀 247評論 2 3