文章目录

  • 1. uniapp的js的API由两个部分组成
    • 标准ECMAScript的jsAPI
    • uniapp扩展的APi
  • 2.uniapp常用的api(看官网)
  • 3.使用uniapp常用的api完善模拟聊天框
    • 3.1.把静态的聊天内容和聊天图片渲染成动态绑定
    • 3.2.点击"照片.png"可以选择要发送的图片
      • 第一步:使用uni.chooseImage从本地相册选择图片并发送消息
      • 第二步:使用uni.pageScrollTop将聊天页面滚动到目标位置
      • 第三步:使用uni.setStorageSync将数据异步存储在本地缓存中指定的 key以及uni.getStorageSync从本地缓存中异步获取指定 key 对应的内容
    • 3.3.点击"发送"可以发送input框中的文本信息到聊天记录中
  • 4. 完整代码

1. uniapp的js的API由两个部分组成

uniapp的js代码,h5端运于浏览器中,非h5端:Android平台运行于w8引擎中,IOS平台运行于IOS自带的jscore引擎中,
因此uniapp的js的API由两个部分组成:标准ECMAScript的jsAPIuni扩展的API

标准ECMAScript的jsAPI

ECMAScript由ECMA国际管理,是基础js语法,

  • 浏览器基于标准js扩充了window,document等jsAPI
  • Node.js基于标准js扩充了fs等模块
  • 小程序也基于标准js扩展了各种wx.xxx,my.xxx,swan.xxx等等API

标准ECMAScript的AP非常多,比如console,setTimeout等等

非h5端虽然不支持window,document等浏览器的api,单页支持标准ECMAScript
(浏览器里的js不等同域标准js)

uniapp扩展的APi

uniapp 的非h5端一样支持标准js,支持if,for等语法,支持字符串,数组,时间等等变量以及各种处理方法
即:它仅仅不支持浏览器专用对象(比如window和document等等)

https://uniapp.dcloud.net.cn/api/#标准-js-和浏览器-js-的区别

2.uniapp常用的api(看官网)

官网位置:https://uniapp.dcloud.net.cn/api/global.html

3.使用uniapp常用的api完善模拟聊天框

项目地址:2022-09-08 uni-app学习笔记(五) uniapp常用组件:view,text,navigator等,使用常见组件写一个模拟聊天页面

3.1.把静态的聊天内容和聊天图片渲染成动态绑定
<template>
<view class="container"><!-- 聊天列表 --><view class="chat-body"><!-- step2:使用一个block标签包裹聊天列表并使用v-for遍历chatList数据 --><block v-for="(item,index) in chatList" :key="index"><!-- step3:使用v-if和v-else分支条件分别渲染对方消息和我方消息 --><view class="chat-one" v-if="!item.isMe">            <image class="chat-face" src="/static/chatImg/女孩.png"/><!-- 女孩:文字 --><view class="chat-box"><view class="chat-sender">客服小梅</view><view class="chat-content" v-if="item.type==='text'">{{item.content}}</view><image class="chat-img" v-if="item.type==='image'" :src="item.path"/></view></view><view class="chat-one chat-one-mine" v-else><!-- 男孩:图片 --><view class="chat-box"><image class="chat-img" v-if="item.type==='image'" :src="item.path"/><view class="chat-content" v-if="item.type==='text'">{{item.content}}</view></view><image class="chat-face" src="/static/chatImg/男孩.png"/></view></block></view><!-- 聊天输入 --><view class="chat-footer"><input type="text" class="msg-input" cursor-spacing="16"/><image class="img-chose" src="../../static/chatImg/图片.png"/><view class="send-btn">发送</view></view>
</view>
</template><script>export default {data() {return {// step1:创建chatList对象chatList:[{isMe:false,type:"text",content:"我是客服小梅,请问您想咨询什么问题?"},{isMe:false,type:"image",path:"/static/chatImg/gaara.png"},{isMe:true,type:"text",content:"你好,请问这是谁的头像?"},{isMe:true,type:"image",path:"/static/chatImg/gaara.png"},]}},}
</script><style lang="scss" scoped>
.....
</style>

此时显示效果不变,只是将数据改成动态绑定的

3.2.点击"照片.png"可以选择要发送的图片
第一步:使用uni.chooseImage从本地相册选择图片并发送消息

为"照片.png"绑定点击事件,并在点击事件中调用选择图片的事件uni.APIchooseImage

官网位置:https://uniapp.dcloud.net.cn/api/media/image.html#chooseimage

chooseImage的常用参数:

代码:
step1:给"图片.png"绑定点击事件

<image class="img-chose" src="../../static/chatImg/图片.png" @click="choseImgAndSend()"/>

step2: 在点击事件中调用uni.chooseImage

choseImgAndSend(){uni.chooseImage({count:1,sizeType:["original","compressed"],//原图和压缩图片二者都可以sourceType:["album","camera"],//从相册或者相机中选择图片success:res=>{//若成功,则返回用户选择的图片路径(本地文件路径列表:tempFilePaths)console.log("res:",res);//先看看res输出了什么:console.log(res.tempFilePaths[0]);// 新增我方消息:格式做成chatList中的元素的形式let myMsg={isMe:true,//代表我方信息type:"image",path:res.tempFilePaths[0]}this.chatList.push(myMsg);//把新增的我方信息push进chatList数组中// 新增对方消息let herMsg={isMe:false,//代表对方信息type:"image",path:res.tempFilePaths[0]}this.chatList.push(herMsg);//把新增的对方信息push进chatList数组中/*此由于path是一样的,聊天对话内容会呈现"发啥图回啥图"的效果*/}})
}

此时还需要解决两个问题

  • 聊天信息刷新后就会消失
  • 发送的聊天信息超过屏幕高度时,不会自动下滑到最新聊天对话记录
第二步:使用uni.pageScrollTop将聊天页面滚动到目标位置

官网位置:https://uniapp.dcloud.net.cn/api/ui/scroll.html#pagescrollto

第三步:使用uni.setStorageSync将数据异步存储在本地缓存中指定的 key以及uni.getStorageSync从本地缓存中异步获取指定 key 对应的内容

  • uni.setStorage:将数据异步存储在本地缓存中指定的 key 中

    官网地址:https://uniapp.dcloud.net.cn/api/storage/storage.html#setstorage

  • uni.setStorageSync:将数据同步存储在本地缓存中指定的 key 中
    同上,略

  • uni.getStorage:从本地缓存中异步获取指定 key 对应的内容。

  • uni.getStorageSync:从本地缓存中同步获取指定 key 对应的内容。
    同上,略

代码:

step1:存数据:

methods: {choseImgAndSend(){uni.chooseImage({...success:res=>{//若成功,则返回用户选择的图片路径(本地文件路径列表:tempFilePaths)...//把聊天信息的存储放在选择图片成功的回调中//第一个参数:本地缓存中的指定的 key//第二个参数:需要存储的内容(只支持原生类型以及能够JSON.stringify的对象)uni.setStorageSync("chatList",JSON.stringify(this.chatList));//页面自动滚动到最新聊天记录uni.pageScrollTo({scrollTop:999999,duration:1000});// 此处的bug:页面只显示到发送图片的我方,回复图片的对方消息不会显示出来//解决:在onShow中,也就是读取getStorage时,再调用一次uni.pageScrollTo//(并未解决问题,考虑在其他地方调用uni.pageScrollTo,先忽略)}})}
}

step2:取数据

onShow(){if(uni.getStorageSync('chatList')){//先判断是否有存储key为chatlist的信息//存的时候已经JSON.stringify,取的时候回自然要JSON.parsethis.chatList=JSON.parse(uni.getStorageSync('chatList'));//取出来的数据赋给chatlist数组//页面自动滚动到最新聊天记录uni.pageScrollTo({scrollTop:999999,duration:100});}
},
3.3.点击"发送"可以发送input框中的文本信息到聊天记录中
  • step1:给input框双向绑定字段myInput
<input type="text" class="msg-input" cursor-spacing="16" v-model='myInput'/>
  • step2:给发送按钮绑定点击事件
<view class="send-btn" @click="sendInputMsg()">发送</view>
  • step3:模仿发送图片的形式,在点击事件中发送文本信息
sendInputMsg(){if(!this.myInput) return;//input框为空就不发送// 新增我方文本消息let myMsg={isMe:true,//代表我方信息type:"text",content:this.myInput}this.chatList.push(myMsg);// 新增对方文本消息let herMsg={isMe:false,//代表对方信息type:"text",content:this.myInput}this.chatList.push(herMsg);//同样地:把存储聊天记录和自动下拉到最新聊天记录也复制进来uni.setStorageSync("chatList",JSON.stringify(this.chatList));uni.pageScrollTo({scrollTop:999999,duration:100});//完成发送后清空input框this.myInput="";
}

效果:略

4. 完整代码

<template>
<view class="container"><!-- 聊天列表 --><view class="chat-body"><!-- step2:使用一个block标签包裹聊天列表并使用v-for遍历chatList数据 --><block v-for="(item,index) in chatList" :key="index"><!-- step3:使用v-if和v-else分支条件分别渲染对方消息和我方消息 --><view class="chat-one" v-if="!item.isMe">            <image class="chat-face" src="/static/chatImg/女孩.png"/><!-- 女孩:文字 --><view class="chat-box"><view class="chat-sender">客服小梅</view><view class="chat-content" v-if="item.type==='text'">{{item.content}}</view><image class="chat-img" v-if="item.type==='image'" :src="item.path"/></view></view><view class="chat-one chat-one-mine" v-else><!-- 男孩:图片 --><view class="chat-box"><image class="chat-img" v-if="item.type==='image'" :src="item.path"/><view class="chat-content" v-if="item.type==='text'">{{item.content}}</view></view><image class="chat-face" src="/static/chatImg/男孩.png"/></view></block></view><!-- 聊天输入 --><view class="chat-footer"><input type="text" class="msg-input" cursor-spacing="16" v-model='myInput'/><image class="img-chose" src="../../static/chatImg/图片.png" @click="choseImgAndSend()"/><view class="send-btn" @click="sendInputMsg()">发送</view></view>
</view>
</template><script>export default {data() {return {// step1:创建chatList对象chatList:[{isMe:false,type:"text",content:"我是客服小梅,请问您想咨询什么问题?"},{isMe:false,type:"image",path:"/static/chatImg/gaara.png"},{isMe:true,type:"text",content:"你好,请问这是谁的头像?"},{isMe:true,type:"image",path:"/static/chatImg/gaara.png"},],myInput:''}},onShow(){if(uni.getStorageSync('chatList')){//先判断是否有存储key为chatlist的信息//存的时候已经JSON.stringify,取的时候回自然要JSON.parsethis.chatList=JSON.parse(uni.getStorageSync('chatList'));//取出来的数据赋给chatlist数组//页面自动滚动到最新聊天记录uni.pageScrollTo({scrollTop:999999,duration:100});}},methods: {choseImgAndSend(){uni.chooseImage({count:1,sizeType:["original","compressed"],//原图和压缩图片二者都可以sourceType:["album","camera"],//从相册或者相机中选择图片success:res=>{//若成功,则返回用户选择的图片路径(本地文件路径列表:tempFilePaths)console.log("res:",res);//先看看res输出了什么:console.log(res.tempFilePaths[0]);// 新增我方图片消息:格式做成chatList中的元素的形式let myMsg={isMe:true,//代表我方信息type:"image",path:res.tempFilePaths[0]}this.chatList.push(myMsg);//把新增的我方信息push进chatList数组中// 新增对方图片消息let herMsg={isMe:false,//代表对方信息type:"image",path:res.tempFilePaths[0]}this.chatList.push(herMsg);//把新增的对方信息push进chatList数组中// 把聊天信息的存储放在选择图片成功的回调中/*参数说明:key(第一个参数):本地缓存中的指定的 keydata(第二个参数):需要存储的内容(只支持原生类型以及能够JSON.stringify的对象)*/uni.setStorageSync("chatList",JSON.stringify(this.chatList));//页面自动滚动到最新聊天记录uni.pageScrollTo({scrollTop:999999,duration:100});// 此处的bug:页面只显示到发送图片的我方,回复图片的对方消息不会显示出来//解决:在onShow中,也就是读取getStorage时,再调用一次uni.pageScrollTo//(并未解决问题,考虑在其他地方调用uni.pageScrollTo,先忽略)}})},sendInputMsg(){if(!this.myInput) return;//input框为空就不发送// 新增我方文本消息let myMsg={isMe:true,//代表我方信息type:"text",content:this.myInput}this.chatList.push(myMsg);// 新增对方文本消息let herMsg={isMe:false,//代表对方信息type:"text",content:this.myInput}this.chatList.push(herMsg);//同样地:把存储聊天记录和自动下拉到最新聊天记录也复制进来uni.setStorageSync("chatList",JSON.stringify(this.chatList));uni.pageScrollTo({scrollTop:999999,duration:100});//完成发送后清空input框this.myInput="";}}}
</script><style lang="scss" scoped>
.container{background-color: #f1f1f1;min-height: 100vh;
}
// 聊天页面主体部分
.chat-body{padding-bottom:178upx;.chat-time{text-align: center;color: #888;padding:40upx 0 0;}.chat-one{display: flex;flex-direction: row;flex-wrap:wrap;justify-content: flex-start;align-items: flex-start;padding:20upx 0;}.chat-one-begin{padding:40upx 0 0;}.chat-one-mine{justify-content: flex-end;}// 头像.chat-face{width: 84upx;height: 84upx;border-radius: 10upx;margin-left:40upx;}.chat-one-mine .chat-face{margin-left:0;margin-right:40upx;}// 聊天盒子.chat-box{max-width:calc(100% - 290upx);margin-left:20upx;font-size:30upx;}.chat-one-mine .chat-box{margin-right:20upx;}// 用户昵称.chat-sender{color:#888;font-size: 20upx;margin-top:-8upx;margin-bottom:10upx;}// 聊天文字框.chat-content{background-color: #fff;border-radius: 5px;padding:10px;.micon{margin-right:20upx;color:#666;}}// 聊天图片.chat-img{float:left;max-width:60%;height:260upx;border-radius: 5px;}.chat-one-mine .chat-img{float:right;}
}
// 聊天页面底部
.chat-footer{width: 670upx;padding:0 40upx;height: 120upx;position:fixed;bottom:0;left:0;background-color: #f1f1f1;display: flex;flex-direction: row;flex-wrap:wrap;justify-content: space-between;align-items:space-between;align-content: center;border-top:1upx solid #ddd;// 输入框.msg-input{background-color: #fff;width: calc(100% - 250upx);height: 70upx;line-height: 70upx;font-size:30upx;border-radius: 10upx;padding:0 20upx;}// 选择图片发送.img-chose{height: 70upx;width:70upx;}
}
</style>

2022-09-09 uni-app学习笔记(六) uniapp常用API,使用uniapp常用API(uni.chooseImage等)实现聊天框的选择图片和input框发送文本信息功能相关推荐

  1. HBuilder X ——Uni app 学习笔记(一)

    HBuilder X --Uni app 学习笔记(一) 1.pages.json配置 *pages数组中第一项表示应用启动页,数组中其他项为项目中所有页面路径. enablePullDownRefr ...

  2. Ethernet/IP 学习笔记六

    Ethernet/IP 学习笔记六 EtherNet/IP defines two primary types of communications: explicit and implicit (Ta ...

  3. 吴恩达《机器学习》学习笔记六——过拟合与正则化

    吴恩达<机器学习>学习笔记六--过拟合与正则化 一. 过拟合问题 1.线性回归过拟合问题 2.逻辑回归过拟合问题 3.过拟合的解决 二. 正则化后的代价函数 1.正则化思想 2.实际使用的 ...

  4. ROS学习笔记六:理解ROS服务和参数

    ROS学习笔记六:理解ROS服务和参数 主要介绍ROS服务和参数,同时使用命令行工具rosservice和rosparam. ROS service service是节点之间互相通信的另一种方式,se ...

  5. opencv 手选roi区域_【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

  6. JS学习笔记六:js中的DOM操作

    1. JS学习笔记六:js中的DOM操作 文章目录 1. JS学习笔记六:js中的DOM操作 1.1. 获取Dom节点 1.2. 元素属性的操作方式 1.3. DOM节点的创建.插入和删除 1.4. ...

  7. Python学习笔记六——画小猪佩奇

    目录 Python学习笔记六--画小猪佩奇 画布 画笔 属性设置 操纵命令 运动命令 画笔控制命令 全局控制命令 其他命令 Python学习笔记六--画小猪佩奇 使用Python的turtle库可以绘 ...

  8. 得到app文稿导出_得到app学习笔记作为知识付费者,如何把所学内容快速输出?...

    原标题:得到app学习笔记作为知识付费者,如何把所学内容快速输出? 零.引子 昨天看到老公票圈更新了一条段子: 我就是那个伪勤奋者,在知识焦虑的胁迫下,这些年买了不知多少视频.微课.教程还有得到专栏. ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

最新文章

  1. 中介者模式小记【原创】
  2. Hyperledger Fabric 智能合约实战 (7) windows安装fabric
  3. linux fpga通信,基于Linux的FPGA通信技术研究与实现
  4. 混合云发展之路:前景广阔,巨头混战
  5. 【计算机科学基础】二进制加减法不用原码的原因
  6. IT项目中的6类知识转移
  7. 通过复制oracle软件方式安装oracle数据库
  8. 如何运行wifi服务器,技术:如何通过wifi进行文件传输?
  9. access数据库指定日期查询
  10. python创意动态图片_Python趣味创意编程
  11. ZCuPb10Sn10铸造锡青铜板ZCuPb10Sn10力学性能
  12. 五道口男子计算机职业技术学院,哈哈!双鸭山大学、五道口男子职业技术学校…盘点高校那些“天雷滚滚”的绰号...
  13. 2001年广西壮族自治区植被类型分布数据
  14. AutoCAD for Mac 性能低下或不佳
  15. LC - P03 机器人大冒险
  16. 微信内置浏览器导出Excel表格功能
  17. 老罗锤子手机(Smartisan T1)的一些感想
  18. 基于PHP的人才招聘网站设计
  19. 【翻译】Matching Restaurant Menus to Crowdsourced Food Data【KDD 2017】
  20. 2018-11-16学习笔记 读论文Advantages of high quality SWIR bands for ocean colour processing: Examples from

热门文章

  1. 设计模式 - 结构型设计模式小结
  2. 关于外网访问本地服务器 (家庭版)
  3. 安卓面试题(持续更新)
  4. 匈牙利算法(处理二分图最大匹配问题)
  5. vant 验证手机号_【uni app】vant weapp的引入和部分详细调用(表单输入框、验证码、弹出层搭配选择器、地图)...
  6. 售后工程师岗位是做什么的?
  7. 阿里巴巴Java开发手册个人总结
  8. html重要的form标签
  9. byte 与 int 转换
  10. Study Notes 之 回顾 HTML 基础