init
This commit is contained in:
		
							
								
								
									
										36
									
								
								uni_modules/uni-collapse/changelog.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								uni_modules/uni-collapse/changelog.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
			
		||||
## 1.4.3(2022-01-25)
 | 
			
		||||
- 修复 初始化的时候 ,open 属性失效的bug
 | 
			
		||||
## 1.4.2(2022-01-21)
 | 
			
		||||
- 修复 微信小程序resize后组件收起的bug
 | 
			
		||||
## 1.4.1(2021-11-22)
 | 
			
		||||
- 修复 vue3中个别scss变量无法找到的问题
 | 
			
		||||
## 1.4.0(2021-11-19)
 | 
			
		||||
- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
 | 
			
		||||
- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-collapse](https://uniapp.dcloud.io/component/uniui/uni-collapse)
 | 
			
		||||
## 1.3.3(2021-08-17)
 | 
			
		||||
- 优化 show-arrow 属性默认为true
 | 
			
		||||
## 1.3.2(2021-08-17)
 | 
			
		||||
- 新增 show-arrow 属性,控制是否显示右侧箭头
 | 
			
		||||
## 1.3.1(2021-07-30)
 | 
			
		||||
- 优化 vue3下小程序事件警告的问题
 | 
			
		||||
## 1.3.0(2021-07-30)
 | 
			
		||||
- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
 | 
			
		||||
## 1.2.2(2021-07-21)
 | 
			
		||||
- 修复 由1.2.0版本引起的 change 事件返回 undefined 的Bug
 | 
			
		||||
## 1.2.1(2021-07-21)
 | 
			
		||||
- 优化 组件示例
 | 
			
		||||
## 1.2.0(2021-07-21)
 | 
			
		||||
- 新增 组件折叠动画
 | 
			
		||||
- 新增 value\v-model 属性 ,动态修改面板折叠状态
 | 
			
		||||
- 新增 title 插槽 ,可定义面板标题
 | 
			
		||||
- 新增 border 属性 ,显示隐藏面板内容分隔线
 | 
			
		||||
- 新增 title-border 属性 ,显示隐藏面板标题分隔线
 | 
			
		||||
- 修复 resize 方法失效的Bug
 | 
			
		||||
- 修复 change 事件返回参数不正确的Bug
 | 
			
		||||
- 优化 H5、App 平台自动更具内容更新高度,无需调用 reszie() 方法
 | 
			
		||||
## 1.1.7(2021-05-12)
 | 
			
		||||
- 新增 组件示例地址
 | 
			
		||||
## 1.1.6(2021-02-05)
 | 
			
		||||
- 优化 组件引用关系,通过uni_modules引用组件
 | 
			
		||||
## 1.1.5(2021-02-05)
 | 
			
		||||
- 调整为uni_modules目录规范
 | 
			
		||||
@@ -0,0 +1,402 @@
 | 
			
		||||
<template>
 | 
			
		||||
	<view class="uni-collapse-item">
 | 
			
		||||
		<!-- onClick(!isOpen) -->
 | 
			
		||||
		<view @click="onClick(!isOpen)" class="uni-collapse-item__title"
 | 
			
		||||
			:class="{'is-open':isOpen &&titleBorder === 'auto' ,'uni-collapse-item-border':titleBorder !== 'none'}">
 | 
			
		||||
			<view class="uni-collapse-item__title-wrap">
 | 
			
		||||
				<slot name="title">
 | 
			
		||||
					<view class="uni-collapse-item__title-box" :class="{'is-disabled':disabled}">
 | 
			
		||||
						<image v-if="thumb" :src="thumb" class="uni-collapse-item__title-img" />
 | 
			
		||||
						<text class="uni-collapse-item__title-text">{{ title }}</text>
 | 
			
		||||
					</view>
 | 
			
		||||
				</slot>
 | 
			
		||||
			</view>
 | 
			
		||||
			<view v-if="showArrow"
 | 
			
		||||
				:class="{ 'uni-collapse-item__title-arrow-active': isOpen, 'uni-collapse-item--animation': showAnimation === true }"
 | 
			
		||||
				class="uni-collapse-item__title-arrow">
 | 
			
		||||
				<uni-icons :color="disabled?'#ddd':'#bbb'" size="14" type="bottom" />
 | 
			
		||||
			</view>
 | 
			
		||||
		</view>
 | 
			
		||||
		<view class="uni-collapse-item__wrap" :class="{'is--transition':showAnimation}"
 | 
			
		||||
			:style="{height: (isOpen?height:0) +'px'}">
 | 
			
		||||
			<view :id="elId" ref="collapse--hook" class="uni-collapse-item__wrap-content"
 | 
			
		||||
				:class="{open:isheight,'uni-collapse-item--border':border&&isOpen}">
 | 
			
		||||
				<slot></slot>
 | 
			
		||||
			</view>
 | 
			
		||||
		</view>
 | 
			
		||||
 | 
			
		||||
	</view>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
	// #ifdef APP-NVUE
 | 
			
		||||
	const dom = weex.requireModule('dom')
 | 
			
		||||
	// #endif
 | 
			
		||||
	/**
 | 
			
		||||
	 * CollapseItem 折叠面板子组件
 | 
			
		||||
	 * @description 折叠面板子组件
 | 
			
		||||
	 * @property {String} title 标题文字
 | 
			
		||||
	 * @property {String} thumb 标题左侧缩略图
 | 
			
		||||
	 * @property {String} name 唯一标志符
 | 
			
		||||
	 * @property {Boolean} open = [true|false] 是否展开组件
 | 
			
		||||
	 * @property {Boolean} titleBorder = [true|false] 是否显示标题分隔线
 | 
			
		||||
	 * @property {Boolean} border = [true|false] 是否显示分隔线
 | 
			
		||||
	 * @property {Boolean} disabled = [true|false] 是否展开面板
 | 
			
		||||
	 * @property {Boolean} showAnimation = [true|false] 开启动画
 | 
			
		||||
	 * @property {Boolean} showArrow = [true|false] 是否显示右侧箭头
 | 
			
		||||
	 */
 | 
			
		||||
	export default {
 | 
			
		||||
		name: 'uniCollapseItem',
 | 
			
		||||
		props: {
 | 
			
		||||
			// 列表标题
 | 
			
		||||
			title: {
 | 
			
		||||
				type: String,
 | 
			
		||||
				default: ''
 | 
			
		||||
			},
 | 
			
		||||
			name: {
 | 
			
		||||
				type: [Number, String],
 | 
			
		||||
				default: ''
 | 
			
		||||
			},
 | 
			
		||||
			// 是否禁用
 | 
			
		||||
			disabled: {
 | 
			
		||||
				type: Boolean,
 | 
			
		||||
				default: false
 | 
			
		||||
			},
 | 
			
		||||
			// #ifdef APP-PLUS
 | 
			
		||||
			// 是否显示动画,app 端默认不开启动画,卡顿严重
 | 
			
		||||
			showAnimation: {
 | 
			
		||||
				type: Boolean,
 | 
			
		||||
				default: false
 | 
			
		||||
			},
 | 
			
		||||
			// #endif
 | 
			
		||||
			// #ifndef APP-PLUS
 | 
			
		||||
			// 是否显示动画
 | 
			
		||||
			showAnimation: {
 | 
			
		||||
				type: Boolean,
 | 
			
		||||
				default: true
 | 
			
		||||
			},
 | 
			
		||||
			// #endif
 | 
			
		||||
			// 是否展开
 | 
			
		||||
			open: {
 | 
			
		||||
				type: Boolean,
 | 
			
		||||
				default: false
 | 
			
		||||
			},
 | 
			
		||||
			// 缩略图
 | 
			
		||||
			thumb: {
 | 
			
		||||
				type: String,
 | 
			
		||||
				default: ''
 | 
			
		||||
			},
 | 
			
		||||
			// 标题分隔线显示类型
 | 
			
		||||
			titleBorder: {
 | 
			
		||||
				type: String,
 | 
			
		||||
				default: 'auto'
 | 
			
		||||
			},
 | 
			
		||||
			border: {
 | 
			
		||||
				type: Boolean,
 | 
			
		||||
				default: true
 | 
			
		||||
			},
 | 
			
		||||
			showArrow: {
 | 
			
		||||
				type: Boolean,
 | 
			
		||||
				default: true
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		data() {
 | 
			
		||||
			// TODO 随机生生元素ID,解决百度小程序获取同一个元素位置信息的bug
 | 
			
		||||
			const elId = `Uni_${Math.ceil(Math.random() * 10e5).toString(36)}`
 | 
			
		||||
			return {
 | 
			
		||||
				isOpen: false,
 | 
			
		||||
				isheight: null,
 | 
			
		||||
				height: 0,
 | 
			
		||||
				elId,
 | 
			
		||||
				nameSync: 0
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		watch: {
 | 
			
		||||
			open(val) {
 | 
			
		||||
				this.isOpen = val
 | 
			
		||||
				this.onClick(val, 'init')
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		updated(e) {
 | 
			
		||||
			this.$nextTick(() => {
 | 
			
		||||
				this.init(true)
 | 
			
		||||
			})
 | 
			
		||||
		},
 | 
			
		||||
		created() {
 | 
			
		||||
			this.collapse = this.getCollapse()
 | 
			
		||||
			this.oldHeight = 0
 | 
			
		||||
			this.onClick(this.open, 'init')
 | 
			
		||||
		},
 | 
			
		||||
		// #ifndef VUE3
 | 
			
		||||
		// TODO vue2
 | 
			
		||||
		destroyed() {
 | 
			
		||||
			if (this.__isUnmounted) return
 | 
			
		||||
			this.uninstall()
 | 
			
		||||
		},
 | 
			
		||||
		// #endif
 | 
			
		||||
		// #ifdef VUE3
 | 
			
		||||
		// TODO vue3
 | 
			
		||||
		unmounted() {
 | 
			
		||||
			this.__isUnmounted = true
 | 
			
		||||
			this.uninstall()
 | 
			
		||||
		},
 | 
			
		||||
		// #endif
 | 
			
		||||
		mounted() {
 | 
			
		||||
			if (!this.collapse) return
 | 
			
		||||
			if (this.name !== '') {
 | 
			
		||||
				this.nameSync = this.name
 | 
			
		||||
			} else {
 | 
			
		||||
				this.nameSync = this.collapse.childrens.length + ''
 | 
			
		||||
			}
 | 
			
		||||
			if (this.collapse.names.indexOf(this.nameSync) === -1) {
 | 
			
		||||
				this.collapse.names.push(this.nameSync)
 | 
			
		||||
			} else {
 | 
			
		||||
				console.warn(`name 值 ${this.nameSync} 重复`);
 | 
			
		||||
			}
 | 
			
		||||
			if (this.collapse.childrens.indexOf(this) === -1) {
 | 
			
		||||
				this.collapse.childrens.push(this)
 | 
			
		||||
			}
 | 
			
		||||
			this.init()
 | 
			
		||||
		},
 | 
			
		||||
		methods: {
 | 
			
		||||
			init(type) {
 | 
			
		||||
				// #ifndef APP-NVUE
 | 
			
		||||
				this.getCollapseHeight(type)
 | 
			
		||||
				// #endif
 | 
			
		||||
				// #ifdef APP-NVUE
 | 
			
		||||
				this.getNvueHwight(type)
 | 
			
		||||
				// #endif
 | 
			
		||||
			},
 | 
			
		||||
			uninstall() {
 | 
			
		||||
				if (this.collapse) {
 | 
			
		||||
					this.collapse.childrens.forEach((item, index) => {
 | 
			
		||||
						if (item === this) {
 | 
			
		||||
							this.collapse.childrens.splice(index, 1)
 | 
			
		||||
						}
 | 
			
		||||
					})
 | 
			
		||||
					this.collapse.names.forEach((item, index) => {
 | 
			
		||||
						if (item === this.nameSync) {
 | 
			
		||||
							this.collapse.names.splice(index, 1)
 | 
			
		||||
						}
 | 
			
		||||
					})
 | 
			
		||||
				}
 | 
			
		||||
			},
 | 
			
		||||
			onClick(isOpen, type) {
 | 
			
		||||
				if (this.disabled) return
 | 
			
		||||
				this.isOpen = isOpen
 | 
			
		||||
				if (this.isOpen && this.collapse) {
 | 
			
		||||
					this.collapse.setAccordion(this)
 | 
			
		||||
				}
 | 
			
		||||
				if (type !== 'init') {
 | 
			
		||||
					this.collapse.onChange(isOpen, this)
 | 
			
		||||
				}
 | 
			
		||||
			},
 | 
			
		||||
			getCollapseHeight(type, index = 0) {
 | 
			
		||||
				const views = uni.createSelectorQuery().in(this)
 | 
			
		||||
				views
 | 
			
		||||
					.select(`#${this.elId}`)
 | 
			
		||||
					.fields({
 | 
			
		||||
						size: true
 | 
			
		||||
					}, data => {
 | 
			
		||||
						// TODO 百度中可能获取不到节点信息 ,需要循环获取
 | 
			
		||||
						if (index >= 10) return
 | 
			
		||||
						if (!data) {
 | 
			
		||||
							index++
 | 
			
		||||
							this.getCollapseHeight(false, index)
 | 
			
		||||
							return
 | 
			
		||||
						}
 | 
			
		||||
						// #ifdef APP-NVUE
 | 
			
		||||
						this.height = data.height + 1
 | 
			
		||||
						// #endif
 | 
			
		||||
						// #ifndef APP-NVUE
 | 
			
		||||
						this.height = data.height
 | 
			
		||||
						// #endif
 | 
			
		||||
						this.isheight = true
 | 
			
		||||
						if (type) return
 | 
			
		||||
						this.onClick(this.isOpen, 'init')
 | 
			
		||||
					})
 | 
			
		||||
					.exec()
 | 
			
		||||
			},
 | 
			
		||||
			getNvueHwight(type) {
 | 
			
		||||
				const result = dom.getComponentRect(this.$refs['collapse--hook'], option => {
 | 
			
		||||
					if (option && option.result && option.size) {
 | 
			
		||||
						// #ifdef APP-NVUE
 | 
			
		||||
						this.height = option.size.height + 1
 | 
			
		||||
						// #endif
 | 
			
		||||
						// #ifndef APP-NVUE
 | 
			
		||||
						this.height = option.size.height
 | 
			
		||||
						// #endif
 | 
			
		||||
						this.isheight = true
 | 
			
		||||
						if (type) return
 | 
			
		||||
						this.onClick(this.open, 'init')
 | 
			
		||||
					}
 | 
			
		||||
				})
 | 
			
		||||
			},
 | 
			
		||||
			/**
 | 
			
		||||
			 * 获取父元素实例
 | 
			
		||||
			 */
 | 
			
		||||
			getCollapse(name = 'uniCollapse') {
 | 
			
		||||
				let parent = this.$parent;
 | 
			
		||||
				let parentName = parent.$options.name;
 | 
			
		||||
				while (parentName !== name) {
 | 
			
		||||
					parent = parent.$parent;
 | 
			
		||||
					if (!parent) return false;
 | 
			
		||||
					parentName = parent.$options.name;
 | 
			
		||||
				}
 | 
			
		||||
				return parent;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="scss">
 | 
			
		||||
	.uni-collapse-item {
 | 
			
		||||
		/* #ifndef APP-NVUE */
 | 
			
		||||
		box-sizing: border-box;
 | 
			
		||||
 | 
			
		||||
		/* #endif */
 | 
			
		||||
		&__title {
 | 
			
		||||
			/* #ifndef APP-NVUE */
 | 
			
		||||
			display: flex;
 | 
			
		||||
			width: 100%;
 | 
			
		||||
			box-sizing: border-box;
 | 
			
		||||
			/* #endif */
 | 
			
		||||
			flex-direction: row;
 | 
			
		||||
			align-items: center;
 | 
			
		||||
			transition: border-bottom-color .3s;
 | 
			
		||||
 | 
			
		||||
			// transition-property: border-bottom-color;
 | 
			
		||||
			// transition-duration: 5s;
 | 
			
		||||
			&-wrap {
 | 
			
		||||
				width: 100%;
 | 
			
		||||
				flex: 1;
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			&-box {
 | 
			
		||||
				padding: 0 15px;
 | 
			
		||||
				/* #ifndef APP-NVUE */
 | 
			
		||||
				display: flex;
 | 
			
		||||
				width: 100%;
 | 
			
		||||
				box-sizing: border-box;
 | 
			
		||||
				/* #endif */
 | 
			
		||||
				flex-direction: row;
 | 
			
		||||
				justify-content: space-between;
 | 
			
		||||
				align-items: center;
 | 
			
		||||
				height: 48px;
 | 
			
		||||
				line-height: 48px;
 | 
			
		||||
				background-color: #fff;
 | 
			
		||||
				color: #303133;
 | 
			
		||||
				font-size: 13px;
 | 
			
		||||
				font-weight: 500;
 | 
			
		||||
				/* #ifdef H5 */
 | 
			
		||||
				cursor: pointer;
 | 
			
		||||
				outline: none;
 | 
			
		||||
 | 
			
		||||
				/* #endif */
 | 
			
		||||
				&.is-disabled {
 | 
			
		||||
					.uni-collapse-item__title-text {
 | 
			
		||||
						color: #999;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			&.uni-collapse-item-border {
 | 
			
		||||
				border-bottom: 1px solid #ebeef5;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			&.is-open {
 | 
			
		||||
				border-bottom-color: transparent;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			&-img {
 | 
			
		||||
				height: 22px;
 | 
			
		||||
				width: 22px;
 | 
			
		||||
				margin-right: 10px;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			&-text {
 | 
			
		||||
				flex: 1;
 | 
			
		||||
				font-size: 14px;
 | 
			
		||||
				/* #ifndef APP-NVUE */
 | 
			
		||||
				white-space: nowrap;
 | 
			
		||||
				color: inherit;
 | 
			
		||||
				/* #endif */
 | 
			
		||||
				/* #ifdef APP-NVUE */
 | 
			
		||||
				lines: 1;
 | 
			
		||||
				/* #endif */
 | 
			
		||||
				overflow: hidden;
 | 
			
		||||
				text-overflow: ellipsis;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			&-arrow {
 | 
			
		||||
				/* #ifndef APP-NVUE */
 | 
			
		||||
				display: flex;
 | 
			
		||||
				box-sizing: border-box;
 | 
			
		||||
				/* #endif */
 | 
			
		||||
				align-items: center;
 | 
			
		||||
				justify-content: center;
 | 
			
		||||
				width: 20px;
 | 
			
		||||
				height: 20px;
 | 
			
		||||
				margin-right: 10px;
 | 
			
		||||
				transform: rotate(0deg);
 | 
			
		||||
 | 
			
		||||
				&-active {
 | 
			
		||||
					transform: rotate(-180deg);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		&__wrap {
 | 
			
		||||
			/* #ifndef APP-NVUE */
 | 
			
		||||
			will-change: height;
 | 
			
		||||
			box-sizing: border-box;
 | 
			
		||||
			/* #endif */
 | 
			
		||||
			background-color: #fff;
 | 
			
		||||
			overflow: hidden;
 | 
			
		||||
			position: relative;
 | 
			
		||||
			height: 0;
 | 
			
		||||
 | 
			
		||||
			&.is--transition {
 | 
			
		||||
				// transition: all 0.3s;
 | 
			
		||||
				transition-property: height, border-bottom-width;
 | 
			
		||||
				transition-duration: 0.3s;
 | 
			
		||||
				/* #ifndef APP-NVUE */
 | 
			
		||||
				will-change: height;
 | 
			
		||||
				/* #endif */
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
			&-content {
 | 
			
		||||
				position: absolute;
 | 
			
		||||
				font-size: 13px;
 | 
			
		||||
				color: #303133;
 | 
			
		||||
				// transition: height 0.3s;
 | 
			
		||||
				border-bottom-color: transparent;
 | 
			
		||||
				border-bottom-style: solid;
 | 
			
		||||
				border-bottom-width: 0;
 | 
			
		||||
 | 
			
		||||
				&.uni-collapse-item--border {
 | 
			
		||||
					border-bottom-width: 1px;
 | 
			
		||||
					border-bottom-color: red;
 | 
			
		||||
					border-bottom-color: #ebeef5;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				&.open {
 | 
			
		||||
					position: relative;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		&--animation {
 | 
			
		||||
			transition-property: transform;
 | 
			
		||||
			transition-duration: 0.3s;
 | 
			
		||||
			transition-timing-function: ease;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
</style>
 | 
			
		||||
@@ -0,0 +1,147 @@
 | 
			
		||||
<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>
 | 
			
		||||
							
								
								
									
										89
									
								
								uni_modules/uni-collapse/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								uni_modules/uni-collapse/package.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,89 @@
 | 
			
		||||
{
 | 
			
		||||
  "id": "uni-collapse",
 | 
			
		||||
  "displayName": "uni-collapse 折叠面板",
 | 
			
		||||
  "version": "1.4.3",
 | 
			
		||||
  "description": "Collapse 组件,可以折叠 / 展开的内容区域。",
 | 
			
		||||
  "keywords": [
 | 
			
		||||
    "uni-ui",
 | 
			
		||||
    "折叠",
 | 
			
		||||
    "折叠面板",
 | 
			
		||||
    "手风琴"
 | 
			
		||||
],
 | 
			
		||||
  "repository": "https://github.com/dcloudio/uni-ui",
 | 
			
		||||
  "engines": {
 | 
			
		||||
    "HBuilderX": ""
 | 
			
		||||
  },
 | 
			
		||||
  "directories": {
 | 
			
		||||
    "example": "../../temps/example_temps"
 | 
			
		||||
  },
 | 
			
		||||
  "dcloudext": {
 | 
			
		||||
    "category": [
 | 
			
		||||
      "前端组件",
 | 
			
		||||
      "通用组件"
 | 
			
		||||
    ],
 | 
			
		||||
    "sale": {
 | 
			
		||||
      "regular": {
 | 
			
		||||
        "price": "0.00"
 | 
			
		||||
      },
 | 
			
		||||
      "sourcecode": {
 | 
			
		||||
        "price": "0.00"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "contact": {
 | 
			
		||||
      "qq": ""
 | 
			
		||||
    },
 | 
			
		||||
    "declaration": {
 | 
			
		||||
      "ads": "无",
 | 
			
		||||
      "data": "无",
 | 
			
		||||
      "permissions": "无"
 | 
			
		||||
    },
 | 
			
		||||
    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
 | 
			
		||||
  },
 | 
			
		||||
  "uni_modules": {
 | 
			
		||||
    "dependencies": [
 | 
			
		||||
			"uni-scss",
 | 
			
		||||
      "uni-icons"
 | 
			
		||||
    ],
 | 
			
		||||
    "encrypt": [],
 | 
			
		||||
    "platforms": {
 | 
			
		||||
      "cloud": {
 | 
			
		||||
        "tcb": "y",
 | 
			
		||||
        "aliyun": "y"
 | 
			
		||||
      },
 | 
			
		||||
      "client": {
 | 
			
		||||
        "App": {
 | 
			
		||||
          "app-vue": "y",
 | 
			
		||||
          "app-nvue": "y"
 | 
			
		||||
        },
 | 
			
		||||
        "H5-mobile": {
 | 
			
		||||
          "Safari": "y",
 | 
			
		||||
          "Android Browser": "y",
 | 
			
		||||
          "微信浏览器(Android)": "y",
 | 
			
		||||
          "QQ浏览器(Android)": "y"
 | 
			
		||||
        },
 | 
			
		||||
        "H5-pc": {
 | 
			
		||||
          "Chrome": "y",
 | 
			
		||||
          "IE": "y",
 | 
			
		||||
          "Edge": "y",
 | 
			
		||||
          "Firefox": "y",
 | 
			
		||||
          "Safari": "y"
 | 
			
		||||
        },
 | 
			
		||||
        "小程序": {
 | 
			
		||||
          "微信": "y",
 | 
			
		||||
          "阿里": "y",
 | 
			
		||||
          "百度": "y",
 | 
			
		||||
          "字节跳动": "y",
 | 
			
		||||
          "QQ": "y"
 | 
			
		||||
        },
 | 
			
		||||
        "快应用": {
 | 
			
		||||
          "华为": "u",
 | 
			
		||||
          "联盟": "u"
 | 
			
		||||
        },
 | 
			
		||||
        "Vue": {
 | 
			
		||||
            "vue2": "y",
 | 
			
		||||
            "vue3": "y"
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										12
									
								
								uni_modules/uni-collapse/readme.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								uni_modules/uni-collapse/readme.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Collapse 折叠面板
 | 
			
		||||
> **组件名:uni-collapse**
 | 
			
		||||
> 代码块: `uCollapse`
 | 
			
		||||
> 关联组件:`uni-collapse-item`、`uni-icons`。
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
折叠面板用来折叠/显示过长的内容或者是列表。通常是在多内容分类项使用,折叠不重要的内容,显示重要内容。点击可以展开折叠部分。
 | 
			
		||||
 | 
			
		||||
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-collapse)
 | 
			
		||||
#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 
 | 
			
		||||
		Reference in New Issue
	
	Block a user