原生的textarea已经把选择表情的按钮丢弃了,所以自己就模拟了一个表情选择器
下面是效果展示
实现原理
准备工作
表情可以在qq表情地带中查看
-
通过 escape() 和 unescape() 两个函数来对表情进行解析和重构
escape("?") // %uD83D%uDE04 unescape("%uD83D%uDE04") // ?
-
这里返回的表情是十六进制的,为了计算出后续的表情,将十六进制转换成10进制
parseInt("D83D",16) // 55357 parseInt("DE04",16) // 56836
-
通过加减来得到后续表情数据并转换成16进制用 unescape() 重构出表情
const high = parseInt("D83D",16) const low = parseInt("DE04",16) const U_high = "%u" + high.toString(16) const U_low = "%u" + (low+1).toString(16) unescape(U_high + U_low)
代码实现
组件代码
// components/emoji/index.js
Component({
/**
* 组件的属性列表
*/
properties: {
value: String, // 输入框的值
},
/**
* 组件的初始数据
*/
data: {
emojis: [],
},
/**
* 组件的方法列表
*/
methods: {
// 点击表情
onTapEmoji: function(e) {
const {
currentTarget: {
dataset: {
emoji
}
}
} = e;
const {
value
} = this.properties;
this.triggerEvent('clickEmoji', {
emoji: emoji,
value: value + emoji
})
},
},
lifetimes: {
attached: function() {
const _high = 55357;
const _low = 56832;
const _nums = 18;
const emojis = [];
for (let i = 0; i < _nums; i++) {
const U_high = "%u" + _high.toString(16)
const U_low = "%u" + (_low + i).toString(16)
emojis.push(unescape(U_high + U_low))
}
this.setData({
emojis
})
},
}
})
调用
index.wmxl
<textarea value="{{textareaValue}}" bindinput="onInputTextarea"></textarea>
<emoji bind:clickEmoji="clickEmoji" value="{{textareaValue}}" />
index.js
Page({
/**
* 页面的初始数据
*/
data: {
textareaValue: "",
},
/**
* 生命周期函数--监听页面加载
*/
clickEmoji: function(e) {
const {
detail: {
value
}
} = e;
this.setData({
textareaValue: value
})
},
onInputTextarea: function(e) {
const {
detail: {
value
}
} = e;
this.setData({
textareaValue: value
})
}
})
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。