| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473 | <template>	<!-- #ifdef APP-NVUE -->	<cell>		<!-- #endif -->		<view			:class="{ 'uni-list-item--disabled': disabled }"			:hover-class="(!clickable && !link) || disabled || showSwitch ? '' : 'uni-list-item--hover'"			class="uni-list-item"			@click="onClick"		>			<view v-if="!isFirstChild" class="border--left" :class="{ 'uni-list--border': border }"></view>			<view				class="uni-list-item__container"				:class="{ 'container--right': showArrow || link, 'flex--direction': direction === 'column' }"			>				<slot name="header">					<view class="uni-list-item__header">						<view v-if="thumb" class="uni-list-item__icon">							<image :src="thumb" class="uni-list-item__icon-img" :class="['uni-list--' + thumbSize]" />						</view>						<view v-else-if="showExtraIcon" class="uni-list-item__icon">							<uni-icons :color="extraIcon.color" :size="extraIcon.size" :type="extraIcon.type" />						</view>					</view>				</slot>				<slot name="body">					<view						class="uni-list-item__content"						:class="{ 'uni-list-item__content--center': thumb || showExtraIcon || showBadge || showSwitch }"					>						<text							v-if="title"							class="uni-list-item__content-title"							:class="[ellipsis !== 0 && ellipsis <= 2 ? 'uni-ellipsis-' + ellipsis : '']"						>							{{ title }}						</text>						<text v-if="note" class="uni-list-item__content-note">{{ note }}</text>					</view>				</slot>				<slot name="footer">					<view						v-if="rightText || showBadge || showSwitch"						class="uni-list-item__extra"						:class="{ 'flex--justify': direction === 'column' }"					>						<text v-if="rightText" class="uni-list-item__extra-text">{{ rightText }}</text>						<uni-badge v-if="showBadge" :type="badgeType" :text="badgeText" :custom-style="badgeStyle" />						<switch							v-if="showSwitch"							:disabled="disabled"							:checked="switchChecked"							@change="onSwitchChange"						/>					</view>				</slot>			</view>			<uni-icons v-if="showArrow || link" :size="16" class="uni-icon-wrapper" color="#bbb" type="arrowright" />		</view>		<!-- #ifdef APP-NVUE -->	</cell>	<!-- #endif --></template><script>/** * ListItem 列表子组件 * @description 列表子组件 * @tutorial https://ext.dcloud.net.cn/plugin?id=24 * @property {String} 	title 							标题 * @property {String} 	note 							描述 * @property {String} 	thumb 							左侧缩略图,若thumb有值,则不会显示扩展图标 * @property {String}  	thumbSize = [lg|base|sm]		略缩图大小 * 	@value 	 lg			大图 * 	@value 	 base		一般 * 	@value 	 sm			小图 * @property {String} 	badgeText						数字角标内容 * @property {String} 	badgeType 						数字角标类型,参考[uni-icons](https://ext.dcloud.net.cn/plugin?id=21) * @property {Object}   badgeStyle           数字角标样式 * @property {String} 	rightText 						右侧文字内容 * @property {Boolean} 	disabled = [true|false]			是否禁用 * @property {Boolean} 	clickable = [true|false] 		是否开启点击反馈 * @property {String} 	link = [navigateTo|redirectTo|reLaunch|switchTab] 是否展示右侧箭头并开启点击反馈 *  @value 	navigateTo 	同 uni.navigateTo() * 	@value redirectTo 	同 uni.redirectTo() * 	@value reLaunch   	同 uni.reLaunch() * 	@value switchTab  	同 uni.switchTab() * @property {String | PageURIString} 	to  			跳转目标页面 * @property {Boolean} 	showBadge = [true|false] 		是否显示数字角标 * @property {Boolean} 	showSwitch = [true|false] 		是否显示Switch * @property {Boolean} 	switchChecked = [true|false] 	Switch是否被选中 * @property {Boolean} 	showExtraIcon = [true|false] 	左侧是否显示扩展图标 * @property {Object} 	extraIcon 						扩展图标参数,格式为 {color: '#4cd964',size: '22',type: 'spinner'} * @property {String} 	direction = [row|column]		排版方向 * @value row 			水平排列 * @value column 		垂直排列 * @event {Function} 	click 							点击 uniListItem 触发事件 * @event {Function} 	switchChange 					点击切换 Switch 时触发 */export default {	name: 'UniListItem',	emits: ['click', 'switchChange'],	props: {		direction: {			type: String,			default: 'row'		},		title: {			type: String,			default: ''		},		note: {			type: String,			default: ''		},		ellipsis: {			type: [Number, String],			default: 0		},		disabled: {			type: [Boolean, String],			default: false		},		clickable: {			type: Boolean,			default: false		},		showArrow: {			type: [Boolean, String],			default: false		},		link: {			type: [Boolean, String],			default: false		},		to: {			type: String,			default: ''		},		showBadge: {			type: [Boolean, String],			default: false		},		showSwitch: {			type: [Boolean, String],			default: false		},		switchChecked: {			type: [Boolean, String],			default: false		},		badgeText: {			type: String,			default: ''		},		badgeType: {			type: String,			default: 'success'		},		badgeStyle: {			type: Object,			default() {				return {};			}		},		rightText: {			type: String,			default: ''		},		thumb: {			type: String,			default: ''		},		thumbSize: {			type: String,			default: 'base'		},		showExtraIcon: {			type: [Boolean, String],			default: false		},		extraIcon: {			type: Object,			default() {				return {					type: '',					color: '#000000',					size: 20				};			}		},		border: {			type: Boolean,			default: true		}	},	// inject: ['list'],	data() {		return {			isFirstChild: false		};	},	mounted() {		this.list = this.getForm();		// 判断是否存在 uni-list 组件		if (this.list) {			if (!this.list.firstChildAppend) {				this.list.firstChildAppend = true;				this.isFirstChild = true;			}		}	},	methods: {		/**		 * 获取父元素实例		 */		getForm(name = 'uniList') {			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;		},		onClick() {			if (this.to !== '') {				this.openPage();				return;			}			if (this.clickable || this.link) {				this.$emit('click', {					data: {}				});			}		},		onSwitchChange(e) {			this.$emit('switchChange', e.detail);		},		openPage() {			if (['navigateTo', 'redirectTo', 'reLaunch', 'switchTab'].indexOf(this.link) !== -1) {				this.pageApi(this.link);			} else {				this.pageApi('navigateTo');			}		},		pageApi(api) {			let callback = {				url: this.to,				success: res => {					this.$emit('click', {						data: res					});				},				fail: err => {					this.$emit('click', {						data: err					});				}			};			switch (api) {				case 'navigateTo':					uni.navigateTo(callback);					break;				case 'redirectTo':					uni.redirectTo(callback);					break;				case 'reLaunch':					uni.reLaunch(callback);					break;				case 'switchTab':					uni.switchTab(callback);					break;				default:					uni.navigateTo(callback);			}		}	}};</script><style lang="scss">$uni-font-size-sm: 12px;$uni-font-size-base: 14px;$uni-font-size-lg: 16px;$uni-spacing-col-lg: 12px;$uni-spacing-row-lg: 15px;$uni-img-size-sm: 20px;$uni-img-size-base: 26px;$uni-img-size-lg: 40px;$uni-border-color: #e5e5e5;$uni-bg-color-hover: #f1f1f1;$uni-text-color-grey: #999;$list-item-pd: $uni-spacing-col-lg $uni-spacing-row-lg;.uni-list-item {	/* #ifndef APP-NVUE */	display: flex;	/* #endif */	font-size: $uni-font-size-lg;	position: relative;	justify-content: space-between;	align-items: center;	// background-color: #fff;	flex-direction: row;	/* #ifdef H5 */	cursor: pointer;	/* #endif */}.uni-list-item--disabled {	opacity: 0.3;}.uni-list-item--hover {	background-color: $uni-bg-color-hover;}.uni-list-item__container {	position: relative;	/* #ifndef APP-NVUE */	display: flex;	/* #endif */	flex-direction: row;	padding: $list-item-pd;	padding-left: $uni-spacing-row-lg;	flex: 1;	overflow: hidden;	// align-items: center;}.container--right {	padding-right: 0;}// .border--left {// 	margin-left: $uni-spacing-row-lg;// }.uni-list--border {	position: absolute;	top: 0;	right: 0;	left: 0;	/* #ifdef APP-NVUE */	border-top-color: $uni-border-color;	border-top-style: solid;	border-top-width: 0.5px;	/* #endif */}/* #ifndef APP-NVUE */.uni-list--border:after {	position: absolute;	top: 0;	right: 0;	left: 0;	height: 1px;	content: '';	-webkit-transform: scaleY(0.5);	transform: scaleY(0.5);	background-color: $uni-border-color;}/* #endif */.uni-list-item__content {	/* #ifndef APP-NVUE */	display: flex;	/* #endif */	padding-right: 8px;	flex: 1;	color: #3b4144;	// overflow: hidden;	flex-direction: column;	justify-content: space-between;	overflow: hidden;}.uni-list-item__content--center {	justify-content: center;}.uni-list-item__content-title {	font-size: $uni-font-size-base;	color: #3b4144;	overflow: hidden;}.uni-list-item__content-note {	margin-top: 6rpx;	color: $uni-text-color-grey;	font-size: $uni-font-size-sm;	overflow: hidden;}.uni-list-item__extra {	// width: 25%;	/* #ifndef APP-NVUE */	display: flex;	/* #endif */	flex-direction: row;	justify-content: flex-end;	align-items: center;}.uni-list-item__header {	/* #ifndef APP-NVUE */	display: flex;	/* #endif */	flex-direction: row;	align-items: center;}.uni-list-item__icon {	margin-right: 18rpx;	flex-direction: row;	justify-content: center;	align-items: center;}.uni-list-item__icon-img {	/* #ifndef APP-NVUE */	display: block;	/* #endif */	height: $uni-img-size-base;	width: $uni-img-size-base;	margin-right: 10px;}.uni-icon-wrapper {	/* #ifndef APP-NVUE */	display: flex;	/* #endif */	align-items: center;	padding: 0 10px;}.flex--direction {	flex-direction: column;	/* #ifndef APP-NVUE */	align-items: initial;	/* #endif */}.flex--justify {	/* #ifndef APP-NVUE */	justify-content: initial;	/* #endif */}.uni-list--lg {	height: $uni-img-size-lg;	width: $uni-img-size-lg;}.uni-list--base {	height: $uni-img-size-base;	width: $uni-img-size-base;}.uni-list--sm {	height: $uni-img-size-sm;	width: $uni-img-size-sm;}.uni-list-item__extra-text {	color: $uni-text-color-grey;	font-size: $uni-font-size-sm;}.uni-ellipsis-1 {	/* #ifndef APP-NVUE */	overflow: hidden;	white-space: nowrap;	text-overflow: ellipsis;	/* #endif */	/* #ifdef APP-NVUE */	lines: 1;	text-overflow: ellipsis;	/* #endif */}.uni-ellipsis-2 {	/* #ifndef APP-NVUE */	overflow: hidden;	text-overflow: ellipsis;	display: -webkit-box;	-webkit-line-clamp: 2;	-webkit-box-orient: vertical;	/* #endif */	/* #ifdef APP-NVUE */	lines: 2;	text-overflow: ellipsis;	/* #endif */}</style>
 |