tm-trees.vue 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. <template>
  2. <view class="tm-trees">
  3. <tm-trees-row v-for="(item,index) in options"
  4. :option="item"
  5. :openKeys="openKeys"
  6. :checkedKeys="checkedKeys"
  7. :parentCheck="parentCheckble"
  8. v-on:open-keys="openKeysHandle"
  9. v-on:checked-keys="checkedKeysHandle"
  10. :key="index"/>
  11. </view>
  12. </template>
  13. <script>
  14. /**
  15. * 树形控件,支持多选
  16. * 千里及
  17. * 2021.2.1
  18. * props: {
  19. * options:树节点数据,
  20. * defaultOpen:默认展开的项(节点key),
  21. * defaultChecked:默认选中的项(节点key),
  22. * open-keys:展开事件监听,会返回展开项的key,
  23. * checked-keys:选中事件监听,返回选中项的key
  24. * }
  25. */
  26. export default {
  27. data() {
  28. return {
  29. openKeys: [],
  30. checkedKeys: [],
  31. checkedItems:[], //已勾选项
  32. };
  33. },
  34. props: ['options', 'defaultOpen', 'defaultChecked','parentCheckble'],
  35. created:function(){
  36. this.openKeys = this.defaultOpen || [];
  37. this.checkedKeys = this.defaultChecked || [];
  38. },
  39. watch: {
  40. defaultOpen: function(open) {
  41. this.openKeys = open;
  42. },
  43. defaultChecked: function(checked) {
  44. this.checkedKeys = checked;
  45. }
  46. },
  47. mounted() {
  48. // console.log('this.props',this.parentCheckble);
  49. },
  50. methods: {
  51. openKeysHandle: function(keys) {
  52. this.openKeys = keys;
  53. this.$emit('open-keys', keys);
  54. },
  55. checkedKeysHandle: function(keys,items) {
  56. this.checkedKeys = keys;
  57. const index = this.checkedItems.findIndex(item=>item.key == items.key);
  58. let _checkedItems = this.checkedItems;
  59. if(index != -1){
  60. _checkedItems.splice(index,1);
  61. }else{
  62. _checkedItems.push(items);
  63. }
  64. this.checkedItems = _checkedItems;
  65. this.$emit('checked-keys', keys,_checkedItems);
  66. }
  67. }
  68. }
  69. </script>
  70. <style lang="less">
  71. .tm-trees {
  72. width: 100%;
  73. height: 100%;
  74. }
  75. </style>