uni-app textarea 设置ignoreCompositionEvent=false 和 auto-height 时输入文字时 textarea的高度会来回变动
uni-app textarea 设置ignoreCompositionEvent=false 和 auto-height 时输入文字时 textarea的高度会来回变动
| 开发环境 | 版本号 | 项目创建方式 |
|------------------|--------|--------------|
| Windows | 10 | HBuilderX |
# 操作步骤
文本合成前的内容时,textarea的高度会变动
# 预期结果
高度会是内容撑开的,但输入时(文本合成前)高度会变到初始高度
# 实际结果
文本合成前的内容时,textarea的高度会变动
# bug描述
文本合成前的内容时,textarea的高度会变动
在uni-app中,textarea
组件的ignoreCompositionEvent
和auto-height
属性通常用于处理用户输入时的不同需求。ignoreCompositionEvent
设置为false
时,可以确保在输入法(IME)组合输入过程中触发input
事件,而auto-height
则根据内容自动调整文本域的高度。
然而,当这两个属性同时使用时,特别是在中文等需要输入法组合的场景下,确实可能会导致textarea
的高度在输入过程中频繁变动,因为每次输入法的组合字符变化都会触发内容的变化,从而导致高度重新计算。
以下是一个简化的代码示例,展示了如何在uni-app中使用textarea
组件,并尝试通过编程方式控制高度变化,尽管直接解决高度频繁变动的问题可能比较复杂,因为这涉及到输入法行为本身。这里我们主要展示如何设置这些属性以及如何通过事件监听来观察高度变化。
<template>
<view>
<textarea
v-model="inputText"
:ignore-composition-event="false"
auto-height
placeholder="请输入内容"
@input="handleInput"
@compositionstart="handleCompositionStart"
@compositionend="handleCompositionEnd"
style="border: 1px solid #000; padding: 10px;"
/>
<view>当前高度: {{ textareaHeight }}px</view>
</view>
</template>
<script>
export default {
data() {
return {
inputText: '',
textareaHeight: 0,
isComposing: false,
};
},
methods: {
handleInput(e) {
// 在输入法组合过程中,避免处理高度变化
if (!this.isComposing) {
this.$nextTick(() => {
const textarea = this.$el.querySelector('textarea');
this.textareaHeight = textarea.scrollHeight;
});
}
},
handleCompositionStart() {
this.isComposing = true;
},
handleCompositionEnd() {
this.isComposing = false;
// 可以在这里手动触发一次高度调整
this.handleInput({});
},
},
};
</script>
在上述代码中,我们通过监听compositionstart
和compositionend
事件来标记输入法组合输入的开始和结束。在input
事件处理函数中,我们检查isComposing
状态,以避免在输入法组合过程中处理高度变化。当组合输入结束时,我们手动触发一次高度调整。
这种方法不能完全解决所有情况下的高度频繁变动问题,但提供了一种思路来控制和处理这种情况。实际应用中,可能需要根据具体需求进行进一步的调整和优化。