To learn Vue.js I have made a tree viewer with the code below. Can anyone give me some advice on how to improve the code?
<script src="https://unpkg.com/[email protected]"></script>
<div id="app">
<tree v-bind:nodes="nodes"></tree>
</div>
<style>
.selected {
font-weight: bold;
}
</style>
<script>
var selectedNode;
Vue.component("tree", {
template: `
<ul>
<div v-for="(node, index) of nodes">
<node
v-bind:node="typeof node === 'string' ? node : Object.keys(node)[0]"
v-bind:nestingTree="typeof node === 'string' ? undefined : Object.values(node)[0]"
v-bind:id="index + '/' + (nestingLevel || 0)"
v-bind:nestingLevel="nestingLevel || 0"
></node>
</div>
</ul>
`,
props: ["nodes", "nestingLevel"]
});
Vue.component("node", {
template: `
<li>
<div v-on:click="onClick" v-bind:id="id">
{{node}} {{
nestingTree
? open ? "[-]" : "[+]"
: ""}}
</div>
<tree v-if="nestingTree && open" v-bind:nodes="nestingTree" v-bind:nestingLevel="nestingLevel + 1"></tree>
</li>
`,
props: ["node", "nestingTree", "nestingLevel", "id"],
data: function() {
return {
open: false
}
},
methods: {
onClick: function(event) {
this.toggleOpenClosedState(event);
this.selectCurrentNode(event);
},
toggleOpenClosedState: function(event) {
this.open = !this.open;
},
selectCurrentNode: function(event) {
if (selectedNode) {
document.getElementById(selectedNode).classList.remove("selected");
}
selectedNode = this.id;
document.getElementById(selectedNode).classList.add("selected");
},
isSelected: function() {
console.log(this.id)
return selectedNode === this.id
}
}
});
var app = new Vue({
el: "#app",
data: {
nodes: [
"dfadsfa",
"fkjsdafkj", {
carrots: [
"caveats", {
moreNesting: [
"bwah bwah bwah"
]
}
]
}
]
}
});
</script>