From 8dbf0346020d7fbed10be174628700558bb8f3e4 Mon Sep 17 00:00:00 2001 From: rex Date: Thu, 29 Aug 2019 20:21:52 +0800 Subject: [PATCH] [bugfix] Field: never change value in blur event & handle style difference between iOS and Android fix #1849 fix #1779 fix #1735 fix #1906 --- packages/common/utils.ts | 9 +++++++ packages/field/README.md | 27 +++++++++++++++++++ packages/field/index.less | 10 +++++++ packages/field/index.ts | 55 +++++++-------------------------------- packages/field/index.wxml | 14 +++++----- 5 files changed, 62 insertions(+), 53 deletions(-) diff --git a/packages/common/utils.ts b/packages/common/utils.ts index bfe310ee..064a17f9 100644 --- a/packages/common/utils.ts +++ b/packages/common/utils.ts @@ -20,3 +20,12 @@ export function nextTick(fn: Function) { fn(); }, 1000 / 30); } + +let systemInfo: WechatMiniprogram.GetSystemInfoSuccessCallbackResult = null; +export function getSystemInfoSync() { + if (systemInfo == null) { + systemInfo = wx.getSystemInfoSync(); + } + + return systemInfo; +} diff --git a/packages/field/README.md b/packages/field/README.md index 77b2e073..1ff6aa22 100644 --- a/packages/field/README.md +++ b/packages/field/README.md @@ -134,6 +134,33 @@ Page({ ``` +## 常见问题 + +### 真机上为什么会出现聚焦时 placeholder 加粗、闪烁的现象? + +由于微信小程序的 input 组件和 textarea 组件是原生组件,聚焦时会将原生的输入框覆盖在对应位置上,导致了这个现象的产生。 +相关的讨论可以查看[微信开放社区](https://developers.weixin.qq.com/community/search?query=placeholder%20%E9%97%AA%E7%83%81%20%E5%8A%A0%E7%B2%97) + +### 真机上 placeholder 为什么会盖过 popup 等其它组件? + +由于微信小程序的 input 组件和 textarea 组件是原生组件,遵循原生组件的限制,详情可以查看[原生组件说明](https://developers.weixin.qq.com/miniprogram/dev/component/native-component.html) + +### textarea 的 placeholder 在真机上为什么会偏移? + +微信小程序的 textarea 组件在 Android 和 iOS 中默认样式不同,在 iOS 中会有默认的 `padding`,且无法置 0。 + +同时 `placeholder-style` 对 `vertical-align`、`line-height` 等大量css属性都不生效。 + +这一系列的问题导致了 placeholder 在真机上可能会出现偏移。vant-weapp 已经尽量抹平 textarea 在不同环境下的差异。 + +微信已经将 `padding` 的问题列为修复中的问题,可以查看[微信开放社区](https://developers.weixin.qq.com/community/develop/issue/96) + +### 手写输入法为什么会丢失部分字符 / 手写输入法为什么不会触发 input 事件? + +这是微信小程序的 input 组件本身的问题,如果需要兼容手写输入法的场景,可以在 `blur` 事件中取到输入的值。 + +相关的讨论可以查看[微信开放社区](https://developers.weixin.qq.com/community/search?query=input%20%E6%89%8B%E5%86%99%E8%BE%93%E5%85%A5&page=1&block=1&random=1567079239098) + ### Props | 参数 | 说明 | 类型 | 默认值 | diff --git a/packages/field/index.less b/packages/field/index.less index 93c88abf..fd451ae5 100644 --- a/packages/field/index.less +++ b/packages/field/index.less @@ -7,6 +7,11 @@ &--textarea { min-height: 24px; + line-height: 1.2em; + } + + &--textarea&--ios { + margin-top: -4.5px; } } @@ -26,6 +31,11 @@ box-sizing: border-box; resize: none; + &--textarea { + height: 18px; + min-height: 18px; + } + &--error { color: @red; } diff --git a/packages/field/index.ts b/packages/field/index.ts index 16faad8e..07c12543 100644 --- a/packages/field/index.ts +++ b/packages/field/index.ts @@ -1,5 +1,6 @@ import { VantComponent } from '../common/component'; import { Weapp } from 'definitions/weapp'; +import { getSystemInfoSync } from '../common/utils'; VantComponent({ field: true, @@ -71,73 +72,35 @@ VantComponent({ }, data: { - showClear: false - }, - - beforeCreate() { - this.focused = false; + focused: false, + system: getSystemInfoSync().system.split(' ').shift().toLowerCase() }, methods: { onInput(event: Weapp.Event) { const { value = '' } = event.detail || {}; - this.set({ - value, - showClear: this.getShowClear(value) - }, () => { + this.set({ value }, () => { this.emitChange(value); }); }, onFocus(event: Weapp.Event) { - const { value = '', height = 0 } = event.detail || {}; - this.$emit('focus', { value, height }); - this.focused = true; - this.blurFromClear = false; - this.set({ - showClear: this.getShowClear() - }); + this.set({ focused: true }); + this.$emit('focus', event.detail); }, onBlur(event: Weapp.Event) { - const { value = '', cursor = 0 } = event.detail || {}; - this.$emit('blur', { value, cursor }); - this.focused = false; - const showClear = this.getShowClear(); - - if (this.data.value === value) { - this.set({ - showClear - }); - } else if (!this.blurFromClear) { - // fix: the handwritten keyboard does not trigger input change - this.set({ - value, - showClear - }, () => { - this.emitChange(value); - }); - } + this.set({ focused: false }); + this.$emit('blur', event.detail); }, onClickIcon() { this.$emit('click-icon'); }, - getShowClear(value?: string): boolean { - value = value === undefined ? this.data.value : value; - return ( - this.data.clearable && this.focused && value && !this.data.readonly - ); - }, - onClear() { - this.blurFromClear = true; - this.set({ - value: '', - showClear: this.getShowClear('') - }, () => { + this.set({ value: '' }, () => { this.emitChange(''); this.$emit('clear', ''); }); diff --git a/packages/field/index.wxml b/packages/field/index.wxml index 1a3e9afd..d5e70cc1 100644 --- a/packages/field/index.wxml +++ b/packages/field/index.wxml @@ -14,15 +14,18 @@ > - +