123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- <template>
- <view class="m-input-view">
- <input :focus="focus_" :type="inputType" :value="value" @input="onInput" class="m-input-input" :placeholder="placeholder"
- :password="type==='password'&&!showPassword" @focus="onFocus" @blur="onBlur" />
- <!-- 优先显示密码可见按钮 -->
- <view v-if="clearable_&&!displayable_&&value.length" class="m-input-icon">
- <m-icon color="#666666" type="clear" size="20" @click="clear"></m-icon>
- </view>
- <view v-if="displayable_" class="m-input-icon">
- <m-icon :color="showPassword?'#666666':'#cccccc'" type="eye" size="20" @click="display"></m-icon>
- </view>
- </view>
- </template>
- <script>
- import mIcon from './m-icon/m-icon.vue'
- export default {
- components: {
- mIcon
- },
- props: {
- /**
- * 输入类型
- */
- type: String,
- /**
- * 值
- */
- value: String,
- /**
- * 占位符
- */
- placeholder: String,
- /**
- * 是否显示清除按钮
- */
- clearable: {
- type: [Boolean, String],
- default: false
- },
- /**
- * 是否显示密码可见按钮
- */
- displayable: {
- type: [Boolean, String],
- default: false
- },
- /**
- * 自动获取焦点
- */
- focus: {
- type: [Boolean, String],
- default: false
- }
- },
- model: {
- prop: 'value',
- event: 'input'
- },
- data() {
- return {
- /**
- * 显示密码明文
- */
- showPassword: false,
- /**
- * 是否获取焦点
- */
- isFocus: false
- }
- },
- computed: {
- inputType() {
- const type = this.type
- return type === 'password' ? 'text' : type
- },
- clearable_() {
- return String(this.clearable) !== 'false'
- },
- displayable_() {
- return String(this.displayable) !== 'false'
- },
- focus_() {
- return String(this.focus) !== 'false'
- }
- },
- methods: {
- clear() {
- this.$emit('input', '')
- },
- display() {
- this.showPassword = !this.showPassword
- },
- onFocus() {
- this.isFocus = true
- },
- onBlur() {
- this.$nextTick(() => {
- this.isFocus = false
- })
- },
- onInput(e) {
- this.$emit('input', e.target.value)
- }
- }
- }
- </script>
- <style>
- .m-input-view {
- display: flex;
- flex-direction: row;
- align-items: center;
- width: 100%;
- flex: 1;
- padding: 0 10rpx;
- }
- .m-input-input {
- flex: 1;
- width: 100%;
- height: 50px;
- line-height: 50px;
- font-size: 14px;
- }
- .m-input-icon {
- width: 20px;
- }
- </style>
|