2 changed files with 378 additions and 14 deletions
			
			
		- 
					99src/views/archivesManage/archivesCheck/module/addCheck.vue
- 
					293src/views/components/TreeSelect.vue
| @ -0,0 +1,293 @@ | |||
| <template> | |||
|   <div> | |||
|     <div v-show="isShowSelect" class="mask" @click="isShowSelect = !isShowSelect" /> | |||
|     <el-popover | |||
|       v-model="isShowSelect" | |||
|       placement="bottom-start" | |||
|       :width="width" | |||
|       trigger="manual" | |||
|       @hide="popoverHide" | |||
|     > | |||
|       <el-tree | |||
|         ref="tree" | |||
|         class="common-tree" | |||
|         :style="style" | |||
|         :data="data" | |||
|         :props="defaultProps" | |||
|         :show-checkbox="multiple" | |||
|         :node-key="nodeKey" | |||
|         :check-strictly="checkStrictly" | |||
|         default-expand-all | |||
|         :expand-on-click-node="false" | |||
|         :check-on-click-node="multiple" | |||
|         :highlight-current="true" | |||
|         @node-click="handleNodeClick" | |||
|         @check-change="handleCheckChange" | |||
|       /> | |||
|       <el-select | |||
|         slot="reference" | |||
|         ref="select" | |||
|         v-model="selectedData" | |||
|         :style="selectStyle" | |||
|         :size="size" | |||
|         :multiple="multiple" | |||
|         :clearable="clearable" | |||
|         :collapse-tags="collapseTags" | |||
|         class="tree-select" | |||
|         @click.native="isShowSelect = !isShowSelect" | |||
|         @remove-tag="removeSelectedNodes" | |||
|         @clear="removeSelectedNode" | |||
|         @change="changeSelectedNodes" | |||
|       > | |||
|         <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" /> | |||
|       </el-select> | |||
|     </el-popover> | |||
|   </div> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| export default { | |||
|   name: 'TreeSelect', | |||
|   props: { | |||
|     // 树结构数据 | |||
|     data: { | |||
|       type: Array, | |||
|       default() { | |||
|         return [] | |||
|       } | |||
|     }, | |||
|     defaultProps: { | |||
|       type: Object, | |||
|       default() { | |||
|         return {} | |||
|       } | |||
|     }, | |||
|     // 配置是否可多选 | |||
|     multiple: { | |||
|       type: Boolean, | |||
|       default() { | |||
|         return false | |||
|       } | |||
|     }, | |||
|     // 配置是否可清空选择 | |||
|     clearable: { | |||
|       type: Boolean, | |||
|       default() { | |||
|         return false | |||
|       } | |||
|     }, | |||
|     // 配置多选时是否将选中值按文字的形式展示 | |||
|     collapseTags: { | |||
|       type: Boolean, | |||
|       default() { | |||
|         return false | |||
|       } | |||
|     }, | |||
|     nodeKey: { | |||
|       type: String, | |||
|       default() { | |||
|         return 'id' | |||
|       } | |||
|     }, | |||
|     // 显示复选框情况下,是否严格遵循父子不互相关联 | |||
|     checkStrictly: { | |||
|       type: Boolean, | |||
|       default() { | |||
|         return false | |||
|       } | |||
|     }, | |||
|     // 默认选中的节点key数组 | |||
|     checkedKeys: { | |||
|       type: Array, | |||
|       default() { | |||
|         return [] | |||
|       } | |||
|     }, | |||
|     size: { | |||
|       type: String, | |||
|       default() { | |||
|         return 'small' | |||
|       } | |||
|     }, | |||
|     width: { | |||
|       type: Number, | |||
|       default() { | |||
|         return 250 | |||
|       } | |||
|     }, | |||
|     height: { | |||
|       type: Number, | |||
|       default() { | |||
|         return 300 | |||
|       } | |||
|     } | |||
|   }, | |||
|   data() { | |||
|     return { | |||
|       isShowSelect: false, // 是否显示树状选择器 | |||
|       options: [], | |||
|       selectedData: [], // 选中的节点 | |||
|       style: 'width:' + this.width + 'px;' + 'height:' + this.height + 'px;', | |||
|       selectStyle: 'width:' + (this.width + 24) + 'px;', | |||
|       checkedIds: [], | |||
|       checkedData: [] | |||
|     } | |||
|   }, | |||
|   watch: { | |||
|     isShowSelect(val) { | |||
|       // 隐藏select自带的下拉框 | |||
|       this.$refs.select.blur() | |||
|     }, | |||
|     checkedKeys(val) { | |||
|       if (!val) return | |||
|       this.checkedKeys = val | |||
|       this.initCheckedData() | |||
|     } | |||
|   }, | |||
|   mounted() { | |||
|     this.initCheckedData() | |||
|   }, | |||
|   methods: { | |||
|     // 单选时点击tree节点,设置select选项 | |||
|     setSelectOption(node) { | |||
|       const tmpMap = {} | |||
|       tmpMap.value = node.key | |||
|       tmpMap.label = node.label | |||
|       this.options = [] | |||
|       this.options.push(tmpMap) | |||
|       this.selectedData = node.key | |||
|     }, | |||
|     // 单选,选中传进来的节点 | |||
|     checkSelectedNode(checkedKeys) { | |||
|       var item = checkedKeys[0] | |||
|       this.$refs.tree.setCurrentKey(item) | |||
|       var node = this.$refs.tree.getNode(item) | |||
|       this.setSelectOption(node) | |||
|     }, | |||
|     // 多选,勾选上传进来的节点 | |||
|     checkSelectedNodes(checkedKeys) { | |||
|       this.$refs.tree.setCheckedKeys(checkedKeys) | |||
|     }, | |||
|     // 单选,清空选中 | |||
|     clearSelectedNode() { | |||
|       this.selectedData = '' | |||
|       this.$refs.tree.setCurrentKey(null) | |||
|     }, | |||
|     // 多选,清空所有勾选 | |||
|     clearSelectedNodes() { | |||
|       var checkedKeys = this.$refs.tree.getCheckedKeys() // 所有被选中的节点的 key 所组成的数组数据 | |||
|       for (let i = 0; i < checkedKeys.length; i++) { | |||
|         this.$refs.tree.setChecked(checkedKeys[i], false) | |||
|       } | |||
|     }, | |||
|     initCheckedData() { | |||
|       if (this.multiple) { | |||
|         // 多选 | |||
|         if (this.checkedKeys.length > 0) { | |||
|           this.checkSelectedNodes(this.checkedKeys) | |||
|         } else { | |||
|           this.clearSelectedNodes() | |||
|         } | |||
|       } else { | |||
|         // 单选 | |||
|         if (this.checkedKeys.length > 0) { | |||
|           this.checkSelectedNode(this.checkedKeys) | |||
|         } else { | |||
|           this.clearSelectedNode() | |||
|         } | |||
|       } | |||
|     }, | |||
|     popoverHide() { | |||
|       if (this.multiple) { | |||
|         this.checkedIds = this.$refs.tree.getCheckedKeys() // 所有被选中的节点的 key 所组成的数组数据 | |||
|         this.checkedData = this.$refs.tree.getCheckedNodes() // 所有被选中的节点所组成的数组数据 | |||
|       } else { | |||
|         this.checkedIds = this.$refs.tree.getCurrentKey() | |||
|         this.checkedData = this.$refs.tree.getCurrentNode() | |||
|       } | |||
|       this.$emit('popoverHide', this.checkedIds, this.checkedData) | |||
|     }, | |||
|     // 单选,节点被点击时的回调,返回被点击的节点数据 | |||
|     handleNodeClick(data, node) { | |||
|       if (!this.multiple) { | |||
|         this.setSelectOption(node) | |||
|         this.isShowSelect = !this.isShowSelect | |||
|         this.$emit('change', this.selectedData) | |||
|       } | |||
|     }, | |||
|     // 多选,节点勾选状态发生变化时的回调 | |||
|     handleCheckChange() { | |||
|       var checkedKeys = this.$refs.tree.getCheckedKeys() // 所有被选中的节点的 key 所组成的数组数据 | |||
|       this.options = checkedKeys.map((item) => { | |||
|         var node = this.$refs.tree.getNode(item) // 所有被选中的节点对应的node | |||
|         const tmpMap = {} | |||
|         tmpMap.value = node.key | |||
|         tmpMap.label = node.label | |||
|         return tmpMap | |||
|       }) | |||
|       this.selectedData = this.options.map((item) => { | |||
|         return item.value | |||
|       }) | |||
|       this.$emit('change', this.selectedData) | |||
|     }, | |||
|     // 多选,删除任一select选项的回调 | |||
|     removeSelectedNodes(val) { | |||
|       this.$refs.tree.setChecked(val, false) | |||
|       var node = this.$refs.tree.getNode(val) | |||
|       if (!this.checkStrictly && node.childNodes.length > 0) { | |||
|         this.treeToList(node).map(item => { | |||
|           if (item.childNodes.length <= 0) { | |||
|             this.$refs.tree.setChecked(item, false) | |||
|           } | |||
|         }) | |||
|         this.handleCheckChange() | |||
|       } | |||
|       this.$emit('change', this.selectedData) | |||
|     }, | |||
|     treeToList(tree) { | |||
|       var queen = [] | |||
|       var out = [] | |||
|       queen = queen.concat(tree) | |||
|       while (queen.length) { | |||
|         var first = queen.shift() | |||
|         if (first.childNodes) { | |||
|           queen = queen.concat(first.childNodes) | |||
|         } | |||
|         out.push(first) | |||
|       } | |||
|       return out | |||
|     }, | |||
|     // 单选,清空select输入框的回调 | |||
|     removeSelectedNode() { | |||
|       this.clearSelectedNode() | |||
|       this.$emit('change', this.selectedData) | |||
|     }, | |||
|     // 选中的select选项改变的回调 | |||
|     changeSelectedNodes(selectedData) { | |||
|       // 多选,清空select输入框时,清除树勾选 | |||
|       if (this.multiple && selectedData.length <= 0) { | |||
|         this.clearSelectedNodes() | |||
|       } | |||
|       this.$emit('change', this.selectedData) | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| 
 | |||
| <style scoped> | |||
|   .mask{ | |||
|     width: 100%; | |||
|     height: 100%; | |||
|     position: fixed; | |||
|     top: 0; | |||
|     left: 0; | |||
|     opacity: 0; | |||
|     z-index: 11; | |||
|   } | |||
|   .common-tree{ | |||
|     overflow: auto; | |||
|   } | |||
|   .tree-select{ | |||
|     z-index: 111; | |||
|   } | |||
| </style> | |||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue