WeChat 文章评论页(二)

Unsplash 本次的系列博文的知识点讲解和代码,主要是来自于 七月老师 的书籍《微信小程序开发:入门与实践》,由个人总结并编写,关于更多微信小程序开发中的各项技能,以及常见问题的解决方案,还请大家购买书籍进行学习实践,该系列博文的发布已得到七月老师的授权许可 授权许可 0 系列文章目录 01 WeChat 从一个简单的“Welcome”页面来开启小程序之旅吧 02 WeChat 文章列表页面(一) 03 WeChat 文章列表页面(二) 04 WeChat 模块、模板与缓存 05 WeChat 文章详情页 06 WeChat 文章评论页(一) 07 WeChat 文章评论页(二) 08 WeChat 文章评论页(三) 1 评论框实现 评论框左侧的声音按钮,可以切换文本类型评论或语音类型评论,右侧加号图标可以选择图片和拍照,最右侧为发送按钮,通过 useKeyboardFlag 变量来切换语音输入框和键盘输入框,useKeyboardFlag 变量将由 catchtap="switchInputType" 这个事件来控制,catchtouchstart="recordStart" 和 catchtouchend="recordEnd" 将开启录音和结束录音,catchtap="sendMoreMsg" 将实现向内容中添加图片和拍照选择框的功能,catchtap="submitComment" 将实现评论内容的最终发送功能 ... 发送 /* pages/post/post-comment/post-comment.wxss */ .input-box {position:absolute;bottom:0;left:0;right:0;background-color:#eae8e8;border-top:1rpx solid #d5d5d5;min-height:100rpx;z-index:1000;} .input-box .send-msg-box {width:100%;height:100%;display:flex;padding:20rpx 0;} .input-box .send-more-box {margin:20rpx 35rpx 35rpx 35rpx;} .input-box .input-item {margin:0 5rpx;flex:1;width:0%;position:relative;} .input-box .input-item .comment-icon {position:absolute;left:5rpx;top:6rpx;} .input-box .input-item .input {border:1rpx solid #d5d5d5;background-color:#fff;border-radius:3px;line-height:65rpx;margin:5rpx 0 5rpx 75rpx;font-size:24rpx;color:#838383;padding:0 2%;} .input-box .input-item .keyboard-input {width:auto;max-height:500rpx;height:65rpx;word-break:break-all;overflow:auto;} .input-box .input-item .speak-input {text-align:center;color:#212121;height:65rpx;} .input-box .input-item .recoding {background-color:#ccc;} .input-box .input-item .comment-icon.speak-icon {height:62rpx;width:62rpx;} .input-box .input-item .comment-icon.keyboard-icon {height:60rpx;width:60rpx;left:6rpx;} .input-box .add-icon {margin:0 5rpx;height:65rpx;width:65rpx;transform:scale(0.9);margin-top:2px;} .input-box .submit-btn {font-size:24rpx;margin-top:5rpx;margin-right:8rpx;line-height:60rpx;width:120rpx;height:60rpx;background-color:#4a6141;border-radius:5rpx;color:#fff;text-align:center;font-family:Microsoft Yahei;} .send-more-box .more-btn-item {display:inline-block;width:110rpx;height:145rpx;margin-right:35rpx;text-align:center;} .more-btn-main {width:100%;height:60rpx;text-align:center;border:1px solid #d5d5d5;border-radius:10rpx;background-color:#fbfbfc;margin:0 auto;padding:25rpx 0;} .more-btn-main image {width:60rpx;height:60rpx;} .send-more-box .more-btn-item .btn-txt {color:#888888;font-size:24rpx;margin:10rpx 0;} .send-more-result-main {margin-top:30rpx;} .send-more-result-main .file-box {margin-right:14rpx;height:160rpx;width:160rpx;position:relative;display:inline-block;} .send-more-result-main .file-box.deleting {animation:deleting 0.5s ease;animation-fill-mode:forwards;} @keyframes deleting {0% {transform:scale(1);} 100% {transform:scale(0);} } .send-more-result-main image {height:100%;width:100%;} .send-more-result-main .remove-icon {position:absolute;right:5rpx;top:5rpx;} .send-more-result-main .file-box .img-box {height:100%;width:100%;} // pages/post/post-comment/post-comment.js //切换语音和键盘输入 switchInputType: function (event) { this.setData({ useKeyboardFlag: !this.data.useKeyboardFlag }) } 运行结果 2 实现新增评论功能 编写 bindinput 事件,获取用户输入内容,小程序没有数据双向绑定功能,只能在表单内容发生变化时,触发表单元素上绑定的方法,将表单上的值赋值给 data 里的对应值 // pages/post/post-comment/post-comment.js // 获取用户输入 bindCommentInput: function (event) { let val = event.detail.value; this.data.keyboardInputValue = val; } 我们在成功获取用户的输入后,需要将其保存到 this.data 变量中,发送按钮的事件响应函数是 submitComment,这个方法中我们需要将 newData 保存到缓存数据库中,而我们曾在 DBPost.js 中的 updatePostData 方法中处理新增评论,在这里就不再复述;显示评论发表成功的提示;将当前发表的评论添加到评论列表中,并显示这条新添加的评论;清空 input 组件,准备接受下一条评论 // db/DBPost.js // 发表评论 newComment(newComment) { this.updatePostData('comment', newComment); } // pages/post/post-comment/post-comment.js // 提交用户评论 submitComment: function (event) { let newData = { username: "青石", avatar: "/images/avatar/avatar-3.png", create_time: new Date().getTime() / 1000, content: { txt: this.data.keyboardInputValue }, } if(!newData.content.txt) { return; } //保存新评论到缓存数据库中 this.dbPost.newComment(newData) //显示操作结果 this.showCommitSuccessToast() //重新渲染并绑定所有评论 this.bindCommentData() //恢复初始状态 this.resetAllDefaultStatus() }, //评论成功 showCommitSuccessToast: function () { //显示操作结果 wx.showToast({ title: "评论成功", duration: 1000, icon: "success" }) }, bindCommentData: function () { let comments = this.dbPost.getCommentData() // 绑定评论数据 this.setData({ comments: comments }) }, //将所有相关的按钮状态,输入状态都回到初始化状态 resetAllDefaultStatus: function () { //清空评论框 this.setData({ keyboardInputValue: '' }) } 运行结果 3 实现图片与拍照评论功能 ... ... 随后设置切换面板的变量 // pages/post/post-comment/post-comment.js Page({ data: { // 控制使用键盘还是发送语音 useKeyboardFlag: true, // 控制input组件的初始值 keyboardInputValue: '', // 控制是否显示图片选择面板 sendMoreMsgFlag: false, }, ... //显示 选择照片、拍照等按钮 sendMoreMsg: function () { this.setData({ sendMoreMsgFlag: !this.data.sendMoreMsgFlag }) } }) 运行结果 小程序提供了 wx.chooseImage(object) API 用来实现从相册选择照片和拍照上传功能,我们设定一次评论内容最多只允许发送 3 张照片,对应 wx.chooseImage(object) 方法中的 count 参数,该方法接收的另一个参数是 sourceType,用于指定是拍照生成照片还是从手机相册选择照片,该参数是一个数组,可以有以下几个取值:['album'] 直接打开相册,并可以选择照片,无论是在开发工具还是真机上都可以支持多选;['camera'] 直接打开相机并拍照生成照片;['album', 'camera'] 可以让用户自行选择拍照还是从手机相册选择 // pages/post/post-comment/post-comment.js Page({ data: { ... // 保存已选择图片 chooseFiles: [] }, ... //选择本地照片与拍照 chooseImage: function (event) { // 已选择图片数组 let imgArr = this.data.chooseFiles; //只能上传3张照片,包括拍照 let leftCount = 3 - imgArr.length; if (leftCount <= 0) { return } let sourceType = [event.currentTarget.dataset.category], that = this; wx.chooseImage({ count: leftCount, sourceType: sourceType, success: function (res) { // 可以分次选择图片,但总数不能超过3张 that.setData({ chooseFiles: imgArr.concat(res.tempFilePaths) }) } }) } }) 运行结果 我们在编写 wxml 代码的 icon 组件时,注册了 deleteImage 事件,用于删除已选择图片,获取当前删除图片的序号,并将该图片的 url 从 this.data.chooseFiles 数组中删除,重新绑定 chooseFiles 变量即可 我们在编写 wxss 代码时,给删除图片添加了一段动画效果,通过 deleteIndex == idx ? 'deleting' : '' 进行判断,所以我们需要定义一个 deleteIndex 变量,将所需要删除图片的序号赋值给该变量,使被删除的图片立即添加并执行一个 deleting 动画,并在删除之后将该变量恢复为初始值,否则动画执行将会出错 // pages/post/post-comment/post-comment.js Page({ data: { ... // 被删除的图片序号 deleteIndex: -1 }, ... //删除已经选择的图片 deleteImage: function (event) { let index = event.currentTarget.dataset.idx, that = this; that.setData({ deleteIndex: index }) that.data.chooseFiles.splice(index, 1) setTimeout(function () { that.setData({ deleteIndex: -1, chooseFiles: that.data.chooseFiles }) }, 500) } }) 运行结果 4 实现图片评论功能 实现发送图片评论的方法非常简单,只需要将当前 this.data.chooseFilse 所保存的图片地址存入数据缓存中,并重新渲染评论列表即可,在发送完图片评论后,重置 chooserFiles 变量和 sendMoreMsgFlag 变量,清空图片选择面板中已选择的图片,并再次隐藏图片选择面板 // pages/post/post-comment/post-comment.js // 提交用户评论 submitComment: function (event) { let imgs = this.data.chooseFiles; let newData = { username: "青石", avatar: "/images/avatar/avatar-3.png", create_time: new Date().getTime() / 1000, content: { txt: this.data.keyboardInputValue, img: imgs }, } if(!newData.content.txt && imgs.length === 0) { return; } //保存新评论到缓存数据库中 this.dbPost.newComment(newData) //显示操作结果 this.showCommitSuccessToast() //重新渲染并绑定所有评论 this.bindCommentData() //恢复初始状态 this.resetAllDefaultStatus() }, //将所有相关的按钮状态,输入状态都回到初始化状态 resetAllDefaultStatus: function () { //清空评论框 this.setData({ keyboardInputValue: '', chooseFiles: [], sendMoreMsgFlag: false }) } 该章节的内容到这里就全部结束了,源码我已经发到了 GitHub WeChat_07 上了,有需要的同学可自行下载 End of File 行文过程中出现错误或不妥之处在所难免,希望大家能够给予指正,以免误导更多人,最后,如果你觉得我的文章写的还不错,希望能够点一下喜欢和关注,为了我能早日成为简书优秀作者献上一发助攻吧,谢谢!^ ^

本文章由javascript技术分享原创和收集

发表评论 (审核通过后显示评论):