改進Vue.js的treeview
前言
最近要為遊戲引擎製作物件的treeview,就想到之前的使用vue.js建構treeview,但沒想到實際使用後發現不太符合需求,之前的範例是把某個Node作root後將其繪製,但實際的需求是root的Node不只一個,所以要做一個改進,在此做個紀錄。內容
先來看改進後的html部分<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width"> <title>JS Bin</title> </head> <body> <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.0.3/vue.js"></script> <div id='app'> <root_treenodeview :rootnode_list='nodelist'></root_treenodeview> </div> </body> </html>
再來是javascript的部分
Vue.component('treenodeview',{
props : ['node'],
template : [
'<ul>\n',
' <li>\n',
' <div @click="onClick">\n',
' {{node.name}}\n',
' <span v-show="isFolder">[{{isExpand?"-":"+"}}]</span>\n',
' </div>\n',
' </li>\n',
' <treenodeview v-show="isExpand" v-for="childNode in node.child" :node="childNode"></treenodeview>\n',
'</ul>\n'
].join(''),
data : function(){
return {
isExpand : false
};
},
computed:{
isFolder:function(){
return this.node.child &&
this.node.child.length;
}
},
methods:{
onClick:function(){
if(this.isFolder){
this.isExpand=!this.isExpand;
}
}
}
});
Vue.component('root_treenodeview',{
props : ['rootnode_list'],
template:[
'<div>\n',
' <treenodeview v-for="rootNode in rootnode_list" :node="rootNode"></treenodeview>\n',
'</div>\n',
].join(''),
});
//
let node1={
name:'node1',
child:[
{
name : 'subNode1',
child : []
},
{
name : 'subNode1',
child : []
}
]
}
let node2={
name:'node2',
child:[
{
name : 'subNode1',
child : []
}
]
}
let app = new Vue({
el : '#app',
data:function(){
return {
nodelist:[node1,node2],
}
}
});
這次的程式碼風格跟上次有些不一樣,像之前的template是用html的方式來取值,這次是直接用字串陣列來輸入, 兩者的效果是一樣的,請根據喜好使用。在"treenodeview"的部分跟上次是一樣的,這次多了個"root_treenodeview",作用是將多個root顯示來符合本次的需求,程式碼的部分比"treenodeview"簡單許多,就只是依據"rootnode_list"的內容來產生對應的"treenodeview"。
這次製作時卡了一陣子,一方面因為太久沒用Vue.js,所以還複習了一下,還有一個我以前沒發現的問題,那就是Vue.js的變數命名對"大寫"不友善,像是"props"的命名規則可以接受"_"與"-"但不接受大寫,而在Component的命名規則可以接受"_",但大寫與"-"都不被接受,在"data"的命名規則可以接受"_"與大寫,但不接受"-"。綜合3種狀況來看,"_"在Vue.js的接受度是最高的,3種狀況都能用,在Vue.js總是使用"_"來隔開字詞,這樣就可以不用管會不會違反命名規則了。
沒有留言:
張貼留言