| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 | 
							- <template>
 
- 	<view class="uni-collapse">
 
- 		<slot />
 
- 	</view>
 
- </template>
 
- <script>
 
- 	/**
 
- 	 * Collapse 折叠面板
 
- 	 * @description 展示可以折叠 / 展开的内容区域
 
- 	 * @tutorial https://ext.dcloud.net.cn/plugin?id=23
 
- 	 * @property {String|Array} value 当前激活面板改变时触发(如果是手风琴模式,参数类型为string,否则为array)
 
- 	 * @property {Boolean} accordion = [true|false] 是否开启手风琴效果是否开启手风琴效果
 
- 	 * @event {Function} change 切换面板时触发,如果是手风琴模式,返回类型为string,否则为array
 
- 	 */
 
- 	export default {
 
- 		name: 'uniCollapse',
 
- 		emits:['change','activeItem','input','update:modelValue'],
 
- 		props: {
 
- 			value: {
 
- 				type: [String, Array],
 
- 				default: ''
 
- 			},
 
- 			modelValue: {
 
- 				type: [String, Array],
 
- 				default: ''
 
- 			},
 
- 			accordion: {
 
- 				// 是否开启手风琴效果
 
- 				type: [Boolean, String],
 
- 				default: false
 
- 			},
 
- 		},
 
- 		data() {
 
- 			return {}
 
- 		},
 
- 		computed: {
 
- 			// TODO 兼容 vue2 和 vue3
 
- 			dataValue() {
 
- 				let value = (typeof this.value === 'string' && this.value === '') ||
 
- 					(Array.isArray(this.value) && this.value.length === 0)
 
- 				let modelValue = (typeof this.modelValue === 'string' && this.modelValue === '') ||
 
- 					(Array.isArray(this.modelValue) && this.modelValue.length === 0)
 
- 				if (value) {
 
- 					return this.modelValue
 
- 				}
 
- 				if (modelValue) {
 
- 					return this.value
 
- 				}
 
- 				return this.value
 
- 			}
 
- 		},
 
- 		watch: {
 
- 			dataValue(val) {
 
- 				this.setOpen(val)
 
- 			}
 
- 		},
 
- 		created() {
 
- 			this.childrens = []
 
- 			this.names = []
 
- 		},
 
- 		mounted() {
 
- 			this.$nextTick(()=>{
 
- 				this.setOpen(this.dataValue)
 
- 			})
 
- 		},
 
- 		methods: {
 
- 			setOpen(val) {
 
- 				let str = typeof val === 'string'
 
- 				let arr = Array.isArray(val)
 
- 				this.childrens.forEach((vm, index) => {
 
- 					if (str) {
 
- 						if (val === vm.nameSync) {
 
- 							if (!this.accordion) {
 
- 								console.warn('accordion 属性为 false ,v-model 类型应该为 array')
 
- 								return
 
- 							}
 
- 							vm.isOpen = true
 
- 						}
 
- 					}
 
- 					if (arr) {
 
- 						val.forEach(v => {
 
- 							if (v === vm.nameSync) {
 
- 								if (this.accordion) {
 
- 									console.warn('accordion 属性为 true ,v-model 类型应该为 string')
 
- 									return
 
- 								}
 
- 								vm.isOpen = true
 
- 							}
 
- 						})
 
- 					}
 
- 				})
 
- 				this.emit(val)
 
- 			},
 
- 			setAccordion(self) {
 
- 				if (!this.accordion) return
 
- 				this.childrens.forEach((vm, index) => {
 
- 					if (self !== vm) {
 
- 						vm.isOpen = false
 
- 					}
 
- 				})
 
- 			},
 
- 			resize() {
 
- 				this.childrens.forEach((vm, index) => {
 
- 					// #ifndef APP-NVUE
 
- 					vm.getCollapseHeight()
 
- 					// #endif
 
- 					// #ifdef APP-NVUE
 
- 					vm.getNvueHwight()
 
- 					// #endif
 
- 				})
 
- 			},
 
- 			onChange(isOpen, self) {
 
- 				let activeItem = []
 
- 				if (this.accordion) {
 
- 					activeItem = isOpen ? self.nameSync : ''
 
- 				} else {
 
- 					this.childrens.forEach((vm, index) => {
 
- 						if (vm.isOpen) {
 
- 							activeItem.push(vm.nameSync)
 
- 						}
 
- 					})
 
- 				}
 
- 				this.$emit('change', activeItem)
 
- 				this.emit(activeItem)
 
- 			},
 
- 			emit(val){
 
- 				this.$emit('input', val)
 
- 				this.$emit('update:modelValue', val)
 
- 			}
 
- 		}
 
- 	}
 
- </script>
 
- <style lang="scss" >
 
- 	.uni-collapse {
 
- 		/* #ifndef APP-NVUE */
 
- 		width: 100%;
 
- 		display: flex;
 
- 		/* #endif */
 
- 		/* #ifdef APP-NVUE */
 
- 		flex: 1;
 
- 		/* #endif */
 
- 		flex-direction: column;
 
- 		background-color: #fff;
 
- 	}
 
- </style>
 
 
  |