最近大模型的应用很是火热,闲来无事顺手也写一个自己的基于大模型的对话问答小程序。其中遇到的主要问题就是大模型的流式输出,页面内容不断动态增加,为了良好的用户体验,需要页面自动往下滚动,这个其实在web端很容易实现,由于微信小程序没有dom节点,在实现的过程中还是遇到了一些坑,特此记录。
1、 基于scroll-view的使用
微信小程序提供原生视图scroll-view, 可滚动视图区域。用于区域滚动。提供scroll滑动监听事件,scroll-top、scroll-left等属性。由于我是基于uniapp开发的,使用的代码和方法等是基于vue3+uniapp,但和微信小程序原生使用是一脉相承的。 主要实现是获取元素的高度,并且改变scroll-top属性值来实现滚动,但是实验中发现scrollTop的值改变了,页面并没有滚动。不知道为何。希望有看到的大神可以帮忙解惑,多谢!!
<view>
<customNavbarVue title="消息页"></customNavbarVue>
<view class="mess-box" :style="{'paddingTop': navHeight+'px'}">
<scroll-view class="scroll-box"
:scroll-top="scrollTop" scroll-with-animation scroll-y="true"
@scroll="scroll">
<view id="contentBox">
<view class="top-box-icon">
<up-icon name="/static/renwu.png" size="20"></up-icon>
<view class="top-text">{{question}}</view>
</view>
<view v-for="i in 15" :key="i">{{i}}:这是测试哈哈哈哈哈哈哈哈哈哈啊哈哈
哈哈哈哈啊哈哈哈啊哈哈哈哈哈哈哈哈哈哈哈哈哈</view>
</view>
<!-- <zero-markdown-view :markdown="sparkResult" themeColor="#000000"></zero-markdown-view> -->
</scroll-view>
<bottomTabVue></bottomTabVue>
</view>
</view>
</template>
js代码
onMounted(()=>{
setScroll()
})
function setScroll(){
const query = uni.createSelectorQuery().in(instance.proxy);
query.select('#contentBox').boundingClientRect((data) => {
console.log("得到布局位置信息" + JSON.stringify(data));
scrollTop.value = data.height
}).exec();
}
const scrollTop = ref(0.001)
2、基于页面的滚动
使用uni.pageScrollTo方法实现页面滚动,生效!!
js代码
onMounted(()=>{
setScroll()
})
function setScroll(){
const query = uni.createSelectorQuery().in(instance.proxy);
query.select('#contentBox').boundingClientRect((data) => {
console.log("得到布局位置信息" + JSON.stringify(data));
uni.pageScrollTo({
scrollTop: data.height
})
}).exec();
}
const scrollTop = ref(0.001)
两边都是一样的css代码
.mess-box{
background: rgba(246,248,252,1);
box-sizing: border-box;
// min-height: 100vh;
padding-bottom: 180rpx;
font-size: 28rpx;
// line-height: 1.5;
color: #2e2e23;
margin-top: 20rpx;
text-align: justify;
}
.top-box-icon{
display: flex;align-items: center;
.top-text{
margin-left: 20rpx;
font-size: 26rpx;
color: #2e2e2e;
}
}
.scroll-box{
background-color: #fff;
border-radius: 10rpx;
padding: 20rpx;
box-sizing: border-box;
}
</style>