tree.html 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. <script src="../../../dist/vue.js"></script>
  2. <style>
  3. .item {
  4. cursor: pointer;
  5. font-family: monospace;
  6. color: #999;
  7. }
  8. .item.folder {
  9. color: #333;
  10. }
  11. </style>
  12. <div id="demo">
  13. <ul id="root">
  14. <li v-component="folder" v-with="model: treeData"></li>
  15. </ul>
  16. </div>
  17. <script type="text/x-template" id="folder-template">
  18. <div class="item folder" v-on="click: open = !open">
  19. {{model.name}} [{{open ? '-' : '+'}}]
  20. </div>
  21. <ul v-show="open">
  22. <li v-repeat="model: model.children | orderBy 'type'"
  23. v-component="{{model.type}}">
  24. </li>
  25. </ul>
  26. </script>
  27. <script type="text/x-template" id="file-template">
  28. <div class="item file">{{model.name}}</div>
  29. </script>
  30. <script>
  31. Vue.component('folder', {
  32. template: '#folder-template',
  33. data: {
  34. open: false
  35. }
  36. })
  37. Vue.component('file', {
  38. template: '#file-template'
  39. })
  40. var menu = new Vue({
  41. el: '#demo',
  42. data: {
  43. treeData: {
  44. name: 'My Tree',
  45. children: [
  46. { type: 'file', name: 'hello' },
  47. { type: 'file', name: 'wat' },
  48. {
  49. type: 'folder',
  50. name: 'child folder',
  51. children: [
  52. {
  53. type: 'folder',
  54. name: 'child folder',
  55. children: [
  56. { type: 'file', name: 'hello' },
  57. { type: 'file', name: 'wat' }
  58. ]
  59. },
  60. { type: 'file', name: 'hello' },
  61. { type: 'file', name: 'wat' },
  62. {
  63. type: 'folder',
  64. name: 'child folder',
  65. children: [
  66. { type: 'file', name: 'hello' },
  67. { type: 'file', name: 'wat' }
  68. ]
  69. }
  70. ]
  71. }
  72. ]
  73. }
  74. }
  75. })
  76. </script>