255 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			255 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Python
		
	
	
	
<template>
 | 
						||
	<view class="uni-searchbar">
 | 
						||
		<view :style="{borderRadius:radius+'px',backgroundColor: bgColor}" class="uni-searchbar__box" @click="searchClick">
 | 
						||
			<view class="uni-searchbar__box-icon-search">
 | 
						||
				<slot name="searchIcon">
 | 
						||
					<uni-icons color="#999999" size="18" type="search" />
 | 
						||
				</slot>
 | 
						||
			</view>
 | 
						||
			<input v-if="show || searchVal" :focus="showSync" :placeholder="placeholder" :maxlength="maxlength" class="uni-searchbar__box-search-input"
 | 
						||
			 confirm-type="search" type="text" v-model="searchVal" @confirm="confirm" @blur="blur" @focus="emitFocus" />
 | 
						||
			<text v-else class="uni-searchbar__text-placeholder">{{ placeholder }}</text>
 | 
						||
			<view v-if="show && (clearButton==='always'||clearButton==='auto'&&searchVal!=='')" class="uni-searchbar__box-icon-clear"
 | 
						||
			 @click="clear">
 | 
						||
				<slot name="clearIcon">
 | 
						||
					<uni-icons color="#c0c4cc" size="15" type="clear" />
 | 
						||
				</slot>
 | 
						||
			</view>
 | 
						||
		</view>
 | 
						||
		<text @click="cancel" class="uni-searchbar__cancel" v-if="cancelButton ==='always' || show && cancelButton ==='auto'">{{cancelText}}</text>
 | 
						||
	</view>
 | 
						||
</template>
 | 
						||
 | 
						||
<script>
 | 
						||
 | 
						||
	/**
 | 
						||
	 * SearchBar 搜索栏
 | 
						||
	 * @description 评分组件
 | 
						||
	 * @tutorial https://ext.dcloud.net.cn/plugin?id=866
 | 
						||
	 * @property {Number} radius 搜索栏圆角
 | 
						||
	 * @property {Number} maxlength 输入最大长度
 | 
						||
	 * @property {String} placeholder 搜索栏Placeholder
 | 
						||
	 * @property {String} clearButton = [always|auto|none] 是否显示清除按钮
 | 
						||
	 * 	@value always 一直显示
 | 
						||
	 * 	@value auto 输入框不为空时显示
 | 
						||
	 * 	@value none 一直不显示
 | 
						||
	 * @property {String} cancelButton = [always|auto|none] 是否显示取消按钮
 | 
						||
	 * 	@value always 一直显示
 | 
						||
	 * 	@value auto 输入框不为空时显示
 | 
						||
	 * 	@value none 一直不显示
 | 
						||
	 * @property {String} cancelText 取消按钮的文字
 | 
						||
	 * @property {String} bgColor 输入框背景颜色
 | 
						||
	 * @property {Boolean} focus 是否自动聚焦
 | 
						||
	 * @event {Function} confirm uniSearchBar 的输入框 confirm 事件,返回参数为uniSearchBar的value,e={value:Number}
 | 
						||
	 * @event {Function} input uniSearchBar 的 value 改变时触发事件,返回参数为uniSearchBar的value,e=value
 | 
						||
	 * @event {Function} cancel 点击取消按钮时触发事件,返回参数为uniSearchBar的value,e={value:Number}
 | 
						||
	 * @event {Function} clear 点击清除按钮时触发事件,返回参数为uniSearchBar的value,e={value:Number}
 | 
						||
	 * @event {Function} blur input失去焦点时触发事件,返回参数为uniSearchBar的value,e={value:Number}
 | 
						||
	 */
 | 
						||
 | 
						||
	export default {
 | 
						||
		name: "UniSearchBar",
 | 
						||
		props: {
 | 
						||
			placeholder: {
 | 
						||
				type: String,
 | 
						||
				default: "请输入搜索内容"
 | 
						||
			},
 | 
						||
			radius: {
 | 
						||
				type: [Number, String],
 | 
						||
				default: 5
 | 
						||
			},
 | 
						||
			clearButton: {
 | 
						||
				type: String,
 | 
						||
				default: "auto"
 | 
						||
			},
 | 
						||
			cancelButton: {
 | 
						||
				type: String,
 | 
						||
				default: "auto"
 | 
						||
			},
 | 
						||
			cancelText: {
 | 
						||
				type: String,
 | 
						||
				default: '取消'
 | 
						||
			},
 | 
						||
			bgColor: {
 | 
						||
				type: String,
 | 
						||
				default: "#F8F8F8"
 | 
						||
			},
 | 
						||
			maxlength: {
 | 
						||
				type: [Number, String],
 | 
						||
				default: 100
 | 
						||
			},
 | 
						||
			value: {
 | 
						||
				type: [Number, String],
 | 
						||
				default: ""
 | 
						||
			},
 | 
						||
			focus: {
 | 
						||
				type: Boolean,
 | 
						||
				default: false
 | 
						||
			}
 | 
						||
		},
 | 
						||
		data() {
 | 
						||
			return {
 | 
						||
				show: false,
 | 
						||
				showSync: false,
 | 
						||
				searchVal: ''
 | 
						||
			}
 | 
						||
		},
 | 
						||
		watch: {
 | 
						||
			value: {
 | 
						||
				immediate: true,
 | 
						||
				handler(newVal) {
 | 
						||
					this.searchVal = newVal
 | 
						||
					if (newVal) {
 | 
						||
						this.show = true
 | 
						||
					}
 | 
						||
				}
 | 
						||
			},
 | 
						||
			focus: {
 | 
						||
				immediate: true,
 | 
						||
				handler(newVal) {
 | 
						||
					if (newVal) {
 | 
						||
						this.show = true;
 | 
						||
						this.$nextTick(() => {
 | 
						||
							this.showSync = true
 | 
						||
						})
 | 
						||
					}
 | 
						||
				}
 | 
						||
			},
 | 
						||
			searchVal(newVal, oldVal) {
 | 
						||
				this.$emit("input", newVal)
 | 
						||
			}
 | 
						||
		},
 | 
						||
		methods: {
 | 
						||
			searchClick() {
 | 
						||
				if (this.show) {
 | 
						||
					return
 | 
						||
				}
 | 
						||
				this.show = true;
 | 
						||
				this.$nextTick(() => {
 | 
						||
					this.showSync = true
 | 
						||
				})
 | 
						||
			},
 | 
						||
			clear() {
 | 
						||
				this.$emit("clear", {
 | 
						||
					value: this.searchVal
 | 
						||
				})
 | 
						||
				this.searchVal = ""
 | 
						||
			},
 | 
						||
			cancel() {
 | 
						||
				this.$emit("cancel", {
 | 
						||
					value: this.searchVal
 | 
						||
				});
 | 
						||
				this.searchVal = ""
 | 
						||
				this.show = false
 | 
						||
				this.showSync = false
 | 
						||
				// #ifndef APP-PLUS
 | 
						||
				uni.hideKeyboard()
 | 
						||
				// #endif
 | 
						||
				// #ifdef APP-PLUS
 | 
						||
				plus.key.hideSoftKeybord()
 | 
						||
				// #endif
 | 
						||
			},
 | 
						||
			confirm() {
 | 
						||
				// #ifndef APP-PLUS
 | 
						||
				uni.hideKeyboard();
 | 
						||
				// #endif
 | 
						||
				// #ifdef APP-PLUS
 | 
						||
				plus.key.hideSoftKeybord()
 | 
						||
				// #endif
 | 
						||
				this.$emit("confirm", {
 | 
						||
					value: this.searchVal
 | 
						||
				})
 | 
						||
			},
 | 
						||
			blur() {
 | 
						||
				// #ifndef APP-PLUS
 | 
						||
				uni.hideKeyboard();
 | 
						||
				// #endif
 | 
						||
				// #ifdef APP-PLUS
 | 
						||
				plus.key.hideSoftKeybord()
 | 
						||
				// #endif
 | 
						||
				this.$emit("blur", {
 | 
						||
					value: this.searchVal
 | 
						||
				})
 | 
						||
			},
 | 
						||
			emitFocus(e) {
 | 
						||
				this.$emit("focus", e.detail)
 | 
						||
			}
 | 
						||
		}
 | 
						||
	};
 | 
						||
</script>
 | 
						||
 | 
						||
<style lang="scss" scoped>
 | 
						||
	$uni-searchbar-height: 36px;
 | 
						||
 | 
						||
	.uni-searchbar {
 | 
						||
		/* #ifndef APP-NVUE */
 | 
						||
		display: flex;
 | 
						||
		/* #endif */
 | 
						||
		flex-direction: row;
 | 
						||
		position: relative;
 | 
						||
		padding: $uni-spacing-col-base;
 | 
						||
		// background-color: $uni-bg-color;
 | 
						||
	}
 | 
						||
 | 
						||
	.uni-searchbar__box {
 | 
						||
		/* #ifndef APP-NVUE */
 | 
						||
		display: flex;
 | 
						||
		box-sizing: border-box;
 | 
						||
		/* #endif */
 | 
						||
		overflow: hidden;
 | 
						||
		position: relative;
 | 
						||
		flex: 1;
 | 
						||
		justify-content: center;
 | 
						||
		flex-direction: row;
 | 
						||
		align-items: center;
 | 
						||
		height: $uni-searchbar-height;
 | 
						||
		padding: 5px 8px 5px 0px;
 | 
						||
		border-width: 0.5px;
 | 
						||
		border-style: solid;
 | 
						||
		border-color: $uni-border-color;
 | 
						||
	}
 | 
						||
 | 
						||
	.uni-searchbar__box-icon-search {
 | 
						||
		/* #ifndef APP-NVUE */
 | 
						||
		display: flex;
 | 
						||
		/* #endif */
 | 
						||
		flex-direction: row;
 | 
						||
		// width: 32px;
 | 
						||
		padding: 0 8px;
 | 
						||
		justify-content: center;
 | 
						||
		align-items: center;
 | 
						||
		color: $uni-text-color-placeholder;
 | 
						||
	}
 | 
						||
 | 
						||
	.uni-searchbar__box-search-input {
 | 
						||
		flex: 1;
 | 
						||
		font-size: $uni-font-size-base;
 | 
						||
		color: $uni-text-color;
 | 
						||
	}
 | 
						||
 | 
						||
	.uni-searchbar__box-icon-clear {
 | 
						||
		align-items: center;
 | 
						||
		line-height: 24px;
 | 
						||
		padding-left: 8px;
 | 
						||
		/* #ifdef H5 */
 | 
						||
		cursor: pointer;
 | 
						||
		/* #endif */
 | 
						||
	}
 | 
						||
 | 
						||
	.uni-searchbar__text-placeholder {
 | 
						||
		font-size: $uni-font-size-base;
 | 
						||
		color: $uni-text-color-placeholder;
 | 
						||
		margin-left: 5px;
 | 
						||
	}
 | 
						||
 | 
						||
	.uni-searchbar__cancel {
 | 
						||
		padding-left: 10px;
 | 
						||
		line-height: $uni-searchbar-height;
 | 
						||
		font-size: 14px;
 | 
						||
		color: $uni-text-color;
 | 
						||
		/* #ifdef H5 */
 | 
						||
		cursor: pointer;
 | 
						||
		/* #endif */
 | 
						||
	}
 | 
						||
</style>
 |