在 UniApp 中,实现 Textarea 输入框的表情插入功能,可以通过以下步骤完成:
实现思路
- 使用
textarea 组件作为输入框。
- 添加表情选择器(例如按钮或弹窗选择表情)。
- 将选中的表情插入到
textarea 的光标位置或末尾。
- 使用
v-model 绑定输入内容,确保数据同步。
示例代码
<template>
<view>
<!-- 输入框 -->
<textarea v-model="inputText" placeholder="请输入内容" />
<!-- 表情选择按钮 -->
<button @click="showEmojiPicker = true">选择表情</button>
<!-- 表情选择弹窗 -->
<view v-if="showEmojiPicker" class="emoji-picker">
<view
v-for="emoji in emojiList"
:key="emoji"
@click="insertEmoji(emoji)"
>
{{ emoji }}
</view>
<button @click="showEmojiPicker = false">关闭</button>
</view>
</view>
</template>
<script>
export default {
data() {
return {
inputText: '', // 绑定输入内容
showEmojiPicker: false, // 控制表情选择器显示
emojiList: ['😀', '😂', '❤️', '👍', '🎉'] // 示例表情列表
};
},
methods: {
// 插入表情到光标位置
insertEmoji(emoji) {
// 获取 textarea 元素(需通过 ref 或查询节点,这里简化处理)
// 实际开发中,可通过 ref 获取 textarea 并操作 selectionStart/End
// 这里简单示例:直接追加到末尾
this.inputText += emoji;
this.showEmojiPicker = false; // 关闭选择器
}
}
};
</script>
<style>
.emoji-picker {
position: fixed;
bottom: 0;
width: 100%;
background: #fff;
border-top: 1px solid #ccc;
display: flex;
flex-wrap: wrap;
padding: 10px;
}
</style>
关键点说明
- 光标位置插入:如果需要精确插入到光标位置,需通过
ref 获取 textarea 节点,使用 selectionStart 和 selectionEnd 属性计算位置(H5 端支持,部分小程序端可能需兼容处理)。
- 表情数据:可使用第三方表情库(如
node-emoji)或自定义映射表。
- 兼容性:小程序端对 DOM 操作限制较多,建议优先使用数据驱动方式更新内容。
优化建议
- 使用
uni.createSelectorQuery() 获取输入框节点(小程序端兼容)。
- 封装表情选择组件,提升复用性。
- 根据平台差异调整实现方式(如 H5 可用原生 DOM 操作)。
以上代码提供了基础实现,可根据实际需求调整样式和交互逻辑。