国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【uni-app】uni-app實(shí)現(xiàn)聊天頁(yè)面功能——功能篇(上)

這篇具有很好參考價(jià)值的文章主要介紹了【uni-app】uni-app實(shí)現(xiàn)聊天頁(yè)面功能——功能篇(上)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

上一篇講到了如何布局,這一篇將講一下如何用uni-app實(shí)現(xiàn)小程序聊天頁(yè)面的最主要的功能——發(fā)消息后頁(yè)面滾動(dòng)到最底部(參考過(guò)很多文章最后找到比較適合的方法)。

其他的功能(參考微信),之后的文章會(huì)講述到具體實(shí)現(xiàn)方法

  • 點(diǎn)擊聊天框的時(shí)候,聊天框隨鍵盤抬起且聊天消息列表滾動(dòng)到最底部,但整體頁(yè)面不抬起
  • 聊天框textarea根據(jù)內(nèi)容自適應(yīng)高度,且聊天消息列表隨著聊天框的增高而滾動(dòng)到最底部(說(shuō)白了就是最底部的消息不會(huì)被增高的聊天框給擋?。?/li>

思路

由于我們?cè)诓季稚狭奶鞚L動(dòng)用的是scroll-view,里面嵌套著一個(gè)存放消息列表的容器(如左圖所示),scroll-view中的一個(gè)重要屬性是scroll-top,官方文檔解釋設(shè)置豎向滾動(dòng)條位置。

當(dāng)消息列表的長(zhǎng)度超過(guò)scroll-view的高度時(shí),它們之間的高度差就是scroll-view要滾動(dòng)的距離(如右圖所示)。

【uni-app】uni-app實(shí)現(xiàn)聊天頁(yè)面功能——功能篇(上)

獲取節(jié)點(diǎn)信息用boundingClientRect這個(gè)函數(shù),具體方法可以參考官網(wǎng)uni.createSelectorQuery() | uni-app官網(wǎng) (dcloud.net.cn)

原本js部分的代碼是這樣寫的:

scrollToBottom(){
	let query = uni.createSelectorQuery().in(this);
     // 獲取節(jié)點(diǎn)信息
	query.select('#scrollview').boundingClientRect();
	query.select('#msglistview').boundingClientRect();
	query.exec((res) =>{
		if(res[1].height > res[0].height){
			this.scrollTop = res[1].height - res[0].height
		}
	})
},

但是,在實(shí)測(cè)時(shí)(小程序模擬器和真機(jī))發(fā)現(xiàn)滾動(dòng)的位置有時(shí)滾動(dòng)不到最底部(如圖所示,其實(shí)下面還有一條消息被遮住了沒顯示出來(lái)),有時(shí)又可以滾動(dòng)到最底部。

【uni-app】uni-app實(shí)現(xiàn)聊天頁(yè)面功能——功能篇(上)

初步懷疑是節(jié)點(diǎn)信息獲取不準(zhǔn)確,我就去搜了關(guān)于boundingClientRect()這個(gè)函數(shù)的相關(guān)信息,官方文檔上并沒有對(duì)這個(gè)問(wèn)題的解釋,后來(lái)找到解決方案

參考文章:微信小程序 boundingClientRect 獲取元素節(jié)點(diǎn)位置信息不準(zhǔn)確_LGDmar的博客-CSDN博客

問(wèn)題所在:頁(yè)面未渲染完成而去獲取了節(jié)點(diǎn)信息

解決方案

方法一:可以設(shè)置一個(gè)延時(shí)函數(shù)setTimeout,因?yàn)槲覀儾恢冷秩镜臅r(shí)間是多少,所以我是經(jīng)過(guò)試驗(yàn)得出一個(gè)滿足需求的延時(shí)時(shí)間。

// 滾動(dòng)至聊天底部
scrollToBottom(){
    // 外層加一個(gè)延時(shí)函數(shù)是為了能獲取到節(jié)點(diǎn)的準(zhǔn)確信息
	setTimeout(()=>{
		let query = uni.createSelectorQuery().in(this);
        // 獲取節(jié)點(diǎn)信息
		query.select('#scrollview').boundingClientRect();
		query.select('#msglistview').boundingClientRect();
		query.exec((res) =>{
			if(res[1].height > res[0].height){
				this.scrollTop = this.rpxTopx(res[1].height - res[0].height)
			}
		})
	},15)
},

方法二:

使用$nextTick,意為在下次DOM更新完之后執(zhí)行一個(gè)回調(diào)函數(shù)。

//滾動(dòng)至聊天底部
scrollToBottom(){
	let query = uni.createSelectorQuery().in(this);
    //獲取節(jié)點(diǎn)信息
	query.select('#scrollview').boundingClientRect();
	query.select('#msglistview').boundingClientRect();
	query.exec((res) =>{
		if(res[1].height > res[0].height){
            this.$nextTick(()=>{
                this.scrollTop = this.rpxTopx(res[1].height - res[0].height)
			})
		}
	})
},

代碼實(shí)現(xiàn)

vue頁(yè)面:
(如果需要參考css部分,請(qǐng)看我發(fā)布的上篇文章布局篇)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-500884.html

<template>
	<view class="chat">
		<scroll-view  :style="{height: `${windowHeight}rpx`}"
		id="scrollview"
		scroll-y="true" 
		:scroll-top="scrollTop"
		:scroll-with-animation="true"
		class="scroll-view"
		>
			<!-- 聊天主體 -->
			<view id="msglistview" class="chat-body">
				<!-- 聊天記錄 -->
				<view v-for="(item,index) in msgList" :key="index">
					<!-- 自己發(fā)的消息 -->
					<view class="item self" v-if="item.userContent != ''" >
						<!-- 文字內(nèi)容 -->
						<view class="content right">
						{{item.userContent}}
						</view>
						<!-- 頭像 -->
						<view class="avatar">
						</view>
					</view>
					<!-- 機(jī)器人發(fā)的消息 -->
					<view class="item Ai" v-if="item.botContent != ''">
						<!-- 頭像 -->     
						<view class="avatar">
						</view>
						<!-- 文字內(nèi)容 -->
						<view class="content left">
							{{item.botContent}}
						</view>
					</view>
				</view>
			</view>
		</scroll-view>
		<!-- 底部消息發(fā)送欄 -->
		<!-- 用來(lái)占位,防止聊天消息被發(fā)送框遮擋 -->
		<view class="chat-bottom">
			<view class="send-msg">
                <view class="uni-textarea">
					<textarea v-model="chatMsg"
					  maxlength="300"
					  :show-confirm-bar="false"
					 auto-height></textarea>
				</view>
				<button @click="handleSend" class="send-btn">發(fā)送</button>
			</view>
		</view>
	</view>
</template>
<script>
	export default {
		data() {
			return {
				//滾動(dòng)距離
				scrollTop: 0,
				userId:'',
				//發(fā)送的消息
				chatMsg:"",
				msgList:[
					{
					    botContent: "hello,請(qǐng)問(wèn)我有什么可以幫助你的嗎?",
					    recordId: 0,
					    titleId: 0,
					    userContent: "",
					    userId: 0
					},
					{
					    botContent: "",
					    recordId: 0,
					    titleId: 0,
					    userContent: "你好呀我想問(wèn)你一件事",
					    userId: 0
					},
				]	
			}
		},
		computed: {
			windowHeight() {
			    return this.rpxTopx(uni.getSystemInfoSync().windowHeight)
			}
		},
		methods: {
			// px轉(zhuǎn)換成rpx
			rpxTopx(px){
				let deviceWidth = wx.getSystemInfoSync().windowWidth
				let rpx = ( 750 / deviceWidth ) * Number(px)
				return Math.floor(rpx)
			},
			//滾動(dòng)至聊天底部
			scrollToBottom(){
   				 //外層加一個(gè)延時(shí)函數(shù)是為了能獲取到節(jié)點(diǎn)的準(zhǔn)確信息
				setTimeout(()=>{
					let query = uni.createSelectorQuery().in(this);
       				 //獲取節(jié)點(diǎn)信息
					query.select('#scrollview').boundingClientRect();
					query.select('#msglistview').boundingClientRect();
					query.exec((res) =>{
					if(res[1].height > res[0].height){
						this.scrollTop = this.rpxTopx(res[1].height - res[0].height)
					}
				})
			},15)
			},
			// 發(fā)送消息
			handleSend() {
				//如果消息不為空
				if(!this.chatMsg||!/^\s+$/.test(this.chatMsg)){
					let obj = {
						botContent: "",
						recordId: 0,
						titleId: 0,
						userContent: this.chatMsg,
						userId: 0
					}
					this.msgList.push(obj);
					this.chatMsg = '';
				}else {
					this.$modal.showToast('不能發(fā)送空白消息')
				}
			},
		}
	}
</script>

到了這里,關(guān)于【uni-app】uni-app實(shí)現(xiàn)聊天頁(yè)面功能——功能篇(上)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 三分鐘完成小程序 uni-app、網(wǎng)站接入chatgpt實(shí)現(xiàn)聊天效果

    三分鐘完成小程序 uni-app、網(wǎng)站接入chatgpt實(shí)現(xiàn)聊天效果

    1.實(shí)現(xiàn)后臺(tái)接口 注冊(cè)laf云開發(fā)賬號(hào) https://laf.dev/ 注冊(cè)一個(gè)應(yīng)用后進(jìn)入這個(gè)頁(yè)面: 下載依賴 chatgpt 配置apiKey 寫send函數(shù) 配置你的apiKey 2.uni-app小程序代碼中 //封裝cloud 發(fā)送消息方法 微信小程序中使用 3.實(shí)現(xiàn)效果 在這里插入圖片描述

    2024年02月11日
    瀏覽(92)
  • uni-app實(shí)現(xiàn)圖片上傳功能

    uni-app實(shí)現(xiàn)圖片上傳功能

    效果 代碼 ?

    2024年02月13日
    瀏覽(108)
  • uni-app小程序分享功能實(shí)現(xiàn)

    通過(guò)onShareAppMessage(OBJECT) 將小程序到分享微信聊天,onShareTimeline()將小程序分享到朋友圈。 api中的參數(shù)配置參考文檔:https://uniapp.dcloud.net.cn/api/plugins/share.html#onshareappmessage 分為全局引入、單頁(yè)面引兩種方式 全局引入只需要在小程序main.js中引入一次,可以復(fù)用,便于維護(hù); 單

    2024年02月05日
    瀏覽(96)
  • 【uni-app】通過(guò)uni-app基礎(chǔ)組件picker實(shí)現(xiàn)選擇日期、時(shí)間的功能示例(完整代碼+圖文)

    【uni-app】通過(guò)uni-app基礎(chǔ)組件picker實(shí)現(xiàn)選擇日期、時(shí)間的功能示例(完整代碼+圖文)

    一、獲取日期(基礎(chǔ)) 二、獲取日期和時(shí)間(改進(jìn)) ?

    2024年02月11日
    瀏覽(94)
  • 【uni-app微信小程序】實(shí)現(xiàn)支付功能

    實(shí)現(xiàn)微信支付功能需要在小程序后臺(tái)配置支付相關(guān)信息,并且在前端代碼中調(diào)用微信支付API進(jìn)行支付操作。好的, uni-app微信小程序?qū)崿F(xiàn)支付功能整體流程 大致如下: 注冊(cè)微信公眾平臺(tái),并完成開發(fā)者資質(zhì)認(rèn)證; 在微信商戶平臺(tái)注冊(cè)商戶賬號(hào),并完成商戶資質(zhì)認(rèn)證; 在商戶

    2024年02月13日
    瀏覽(114)
  • Uni-app實(shí)現(xiàn)左右滑動(dòng)頁(yè)面內(nèi)容切換(兼容微信小程序)

    提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 ? ? ? ? 前言 ? ? ? ? 整體思路 ? ? ? ??一、HTML部分 ????????二、Script部分 ????????三、Style部分 ? ? ? ? ? (先聲明哦我可不是偷懶,只是想學(xué)術(shù)借鑒一下)因?yàn)樽罱性谧鲎笥一瑒?dòng)功能,

    2024年02月07日
    瀏覽(112)
  • 【uni-app2.0】實(shí)現(xiàn)登錄頁(yè)記住密碼功能

    【uni-app2.0】實(shí)現(xiàn)登錄頁(yè)記住密碼功能

    使用uni-app的 uni.setStorageSync() 和 uni.getStorageSync() 方法來(lái)存儲(chǔ)和讀取密碼 在登錄頁(yè)中添加一個(gè)記住密碼的 u-checkbox 選項(xiàng),并在data里面添加一個(gè) rememberPwd 的布爾值,在每次點(diǎn)擊記住密碼 change 的時(shí)候來(lái)記錄用戶的選擇 在點(diǎn)擊登錄按鈕執(zhí)行的事件中,使用 uni.setStorageSync() 方法將【

    2024年02月15日
    瀏覽(29)
  • uni-app 實(shí)現(xiàn)navigateBack返回修改前一頁(yè)面數(shù)據(jù)(H5、APP、小程序)

    uni-app 實(shí)現(xiàn)navigateBack返回修改前一頁(yè)面數(shù)據(jù)(H5、APP、小程序)

    先自我介紹一下,小編浙江大學(xué)畢業(yè),去過(guò)華為、字節(jié)跳動(dòng)等大廠,目前阿里P7 深知大多數(shù)程序員,想要提升技能,往往是自己摸索成長(zhǎng),但自己不成體系的自學(xué)效果低效又漫長(zhǎng),而且極易碰到天花板技術(shù)停滯不前! 因此收集整理了一份《2024年最新Web前端全套學(xué)習(xí)資料》,

    2024年04月29日
    瀏覽(21)
  • uni-app實(shí)現(xiàn) app 小程序 手機(jī)端H5掃碼功能

    uni-app實(shí)現(xiàn) app 小程序 手機(jī)端H5掃碼功能

    首先 掃碼這個(gè)功能小程序和App都是有現(xiàn)成的方法 但是H5是不行的 我們可以看這樣一段代碼 這里 我們用了條件編譯 App和小程序中的代碼是 一樣的 他們都可以正常執(zhí)行scanCode進(jìn)行掃碼 至于H5手機(jī)端界面 我用web-view套了個(gè)百度的鏈接進(jìn)來(lái) 其實(shí) 大家可以參考我的文章 vue實(shí)現(xiàn)二維

    2024年02月11日
    瀏覽(109)
  • 如何在uni-app小程序端實(shí)現(xiàn)長(zhǎng)按復(fù)制功能

    在開發(fā)小程序應(yīng)用中,常常需要使用到長(zhǎng)按復(fù)制功能。本文將介紹如何在uni-app小程序端實(shí)現(xiàn)長(zhǎng)按復(fù)制功能。 uni-app是一個(gè)跨平臺(tái)的開發(fā)框架,可以基于vue.js語(yǔ)法開發(fā)小程序、H5、APP等多個(gè)平臺(tái)的應(yīng)用。uni-app提供了一些內(nèi)置組件和API,可以方便地實(shí)現(xiàn)各種功能。其中,uni.setCl

    2024年02月05日
    瀏覽(63)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包