input-data.vue 2.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
<script lang="uts">
	export default {
		name: "input-data",
		props: {
			title: {
				type: String,
				required: true
			},
			type: {
				type: String,
				required: true
			},
			defaultValue: {
				type: String,
				required: true,
				default: ''
			}
		},
		data() {
			return {
				inputClearValue: '' as any,
				showClearIcon: false,
				inputType: 'text'
			}
		},
		created() {
			switch (this.type) {
				case 'number':
					this.inputType = 'number'
					break;
			}
			this.inputClearValue = this.getValue(this.defaultValue)
		},
		methods: {
			input: function (event : InputEvent) {
				// @ts-ignore
				this.inputClearValue = event.detail.value
38
				if ((this.inputClearValue as string).length > 0) {
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
					this.showClearIcon = true
				} else {
					this.showClearIcon = false
				}

				this.$emit('confirm', this.getValue(this.inputClearValue))
			},
			clearIcon: function () {
				this.inputClearValue = ''
				this.showClearIcon = false
			},
			// @ts-ignore
			confirm(e : InputConfirmEvent) {
				// this.$emit('confirm', this.getValue(e.detail.value))
			},
54 55 56 57 58 59 60 61 62 63 64 65 66 67
			blur() {
				this.showClearIcon = false
			},
			focus() {
				let inputValue = this.inputClearValue
				if (typeof inputValue !== 'string') {
					inputValue = inputValue.toString()
				}
				if ((inputValue as string).length > 0) {
					this.showClearIcon = true
				} else {
					this.showClearIcon = false
				}
			},
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
			getValue(value : any) : any {
				switch (this.type) {
					case 'number':
						return parseFloat(value as string)
				}

				return value
			}
		}
	}
</script>

<template>
	<view class="uni-padding-wrap">
		<view class="uni-title uni-common-mt">
			<text class="uni-title-text"> {{title}} </text>
		</view>
	</view>
86
	<view class="uni-input-wrapper input-wrapper">
87
		<input class="uni-input" :type="inputType" :value="inputClearValue" :placeholder="title" @input="input"
88
			@confirm="confirm" @blur="blur" @focus="focus"/>
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
		<image class="input-wrapper_image" src="/static/icons/clear.png" v-if="showClearIcon" @click="clearIcon">
		</image>
	</view>
</template>


<style>
	.input-wrapper {
		border: 1px solid rgba(0, 0, 0, .08);
		justify-content: center;
		padding: 0;
		margin: 0 20rpx;
		background-color: #FFF;
	}

	.input-wrapper_image {
		width: 22px;
		height: 22px;
D
DCloud_LXH 已提交
107
		align-self: center;
108 109
		margin-right: 10rpx;
	}
110
</style>