基于uniapp做的聊天系统中,使用scroll-view实现动态滚动到最底部

uniapp中scroll-view组件scroll-into-view的使用 目的:让 scroll-view组件自动定位到当前月份,比如11月。 阅读详情
AI摘要

本文介绍了如何在uni-app中使用两种方法滚动聊天页至底部,一是通过计算高度差,二是利用scroll-into-view属性。同时,详细展示了聊天组件的封装和布局,包括自定义输入栏和表情/工具栏的交互。

这里提到两个方法
方法一:用整个scroll-view的高度减去所有聊天内容的高度,得到的就是滚动条需要下拉的距离,即可使聊天页下拉至最底部。
参考文章:《uni-app 之 聊天室滚到最底部》
方法二:利用uniapp中的scroll-view组件的scroll-into-view属性 具体使用方法请参考官网文档

第一种方法:

  1. 将聊天框封装成组件,并判断是谁发送的信息
    首先要给聊天内容部分封装成一个组件(不封装也可以),将组件中的对方和自己用v-if做一个判断,当接收的用户名(或者id,只要是唯一值就可以)等于自己的用户名就显示自己的聊天框,不是自己的用户名就显示对方的。这里接受过来的用户名是服务器传过来的,信息一般包含:(发信人,接受的人(如果是给本人发的,那么这里的接受人就等于本人的用户名),信息,类型等等)
//聊天组件
<!-- 本人 -->
		<view class=" position-relative" style="margin-top: 30rpx;"  v-if="userId === item.payload.owner" >
			<u-row>
				<u-col span="2"></u-col>
				<u-col span="10">
					<view class="d-flex a-center j-end">
						<view class="text-muted font-sm">{{dateFormat2(item.meta.timestamp)}}</view>
					</view>
				</u-col>
			</u-row>
			<u-row>
				<u-col span="10.5">
					<view class="d-flex j-end a-start position-relative top-0" v-if="item.payload.type === 'text' || item.payload.type === 'image'">
						<view class="customer px-2 py-1 d-flex j-end a-center position-relative top-0 baseStyle" 
						style=" right: -10rpx; z-index: 5;" >
							<text style="word-break:break-all;" v-if="item.payload.type === 'text'" :selectable="true">{{item.payload.data}}</text>
							<u-image v-if="item.payload.type === 'image'" :src="item.payload.data" width="300rpx" mode="widthFix" class="pt-1" @click="previewImage(item)"></u-image>
							<!-- <u-image :src="avatar" width="100%" mode="aspectFit"></u-image> -->
						</view>
						<u-icon name="play-right-fill" color="#98E165" class="position-relative mt-2 top-0"></u-icon>
					</view>
					
					<audio v-if="item.payload.type === 'music'" :src="item.payload.data" controls></audio>
					<video v-if="item.payload.type === 'video'" :src="item.payload.data" controls></video>
				</u-col>
				<u-col span="1.5">
					<view class="d-flex j-center a-center position-absolute" style="top: 40rpx;">
						<u-avatar :src="avatar" size="mini" mode="circle"></u-avatar>
					</view>
				</u-col>
			</u-row>
		</view>
	<!-- 对方 -->
		<view class=" position-relative" style="margin-top: 30rpx;" v-else>
			<u-row>
				<u-col span="10">
					<view class="d-flex a-center">
						<!-- <view class="pr-1">{{item.meta.client}}</view> -->
						<view class="font-sm text-muted">{{dateFormat2(item.meta.timestamp)}}</view>
					</view>
				</u-col>
				<u-col span="2"></u-col>
			</u-row>
			<u-row>
				<u-col span="1.5">
					<view class="d-flex j-center position-absolute " style="top: 40rpx;" >
						<u-avatar :src="avatar" size="mini" mode="circle"></u-avatar>
					</view>
				</u-col>
				<u-col span="10">
					<view class="d-flex j-start a-start position-relative top-0" v-if="item.payload.type === 'text' || item.payload.type === 'image'">
						<u-icon name="play-left-fill" color="#fff" class="mt-2 top-0"></u-icon>
						<view class="kefu px-2 py-1 d-flex j-start a-center position-relative top-0 baseStyle" 
						style="left: -10rpx;">
							<text style="word-break:break-all;" v-if="item.payload.type === 'text'" :selectable="true">{{item.payload.data}}</text>
							<u-image v-if="item.payload.type === 'image'" :src="item.payload.data" width="300rpx" mode="widthFix" class="pt-1" @click="previewImage(item)"></u-image>
						</view>
					</view>
					<audio v-if="item.payload.type === 'music'" :src="item.payload.data" controls></audio>
					<video v-if="item.payload.type === 'video'" :src="item.payload.data" controls></video>
				</u-col>
			</u-row>
		</view>
  1. 在script的methods中添加一个滚动到底部的函数
    在scroll-view上添加一个id或者是类名,再在包裹聊天组件的标签上添加一个类或者id,在script中的methods中添加一个滚动到底部的方法,
//标题导航栏
<view class="navBar-bg top-0" :style="'height:' + navBarHeight + 'px;'">
	<view :style="'height:' + statusBarHeight + 'px;'"></view>
	<u-row>
		<u-col span="2"><u-icon name="arrow-left" class="pl-2" @click="back"></u-icon></u-col>
		<u-col span="8">
			<view class="d-flex j-center a-center flex-column">
				<view class="u-font-19">{{ title }}</view>
				<view class="u-font-12">{{ subTitle }}</view>
			</view>
		</u-col>
		<u-col span="2"><view @click="manpower">转人工</view></u-col>
	</u-row>
</view>
//内容框
<scroll-view id="scrollview" style=" background-color: #71D5A1;" scroll-y :style="'height:' + contentH + 'px;'" :scroll-top="scrollTop" :scroll-into-view="scrollIntoIndex">
     <view id="msglistview" class="pb-3">
      <block v-for="(item, index) in simulation" :key="index" :id="'chatItem_'+index"><chat-item :clientId="clientId" :item="item"></chat-item></block>
     </view>
</scroll-view>

//底部输入框
<view>
	//这里调用的是一个自定义组件,组件中有一个获取底部输入栏的高度,详情见下。
	<chat-footer
		:KeyboardHeight="KeyboardHeight"
		:tagList="tagList"
		:isExpression="isExpression"
		:isMoreTool="isMoreTool"
		:moreList="moreList"
		@focusInput="focusInput"
		@expressionBtn="expressionBtn"
		@moreTool="moreTool"
		@sendMsgs="sendMsgs"
		@clickCard="clickCard"
		@fillInput="fillInput"
	></chat-footer>
</view>

这里是底部输入栏组件的全部代码

<template>
	<view>
		<view class="position-fixed left-0 right-0 py-2  footerview" style="width: 100%; background-color: #A0CFFF;" :style="'bottom:' + KeyboardHeight + 'px;'">
			<block v-for="(item, index) in tagList" :key="index">
				<u-tag :text="item.text" mode="light" shape="circle" type="info" class="mx-1" @click="fillInput(item)"></u-tag>
			</block>
			<view class="my-1"><u-divider></u-divider></view>
			<view class="d-flex j-center a-center">
				<view style="width: 80%;" class="px-1">
					<input
						type="text"
						v-model="inputContext"
						placeholder="请输入..."
						class="py-1"
						@focus="focusInput('text')"
						style="background-color: #FFFFFF; border-radius: 10rpx;"
					/>
				</view>
				<view class="d-flex j-center mr-1" @click="expressionBtn"><u-image :src="expression" width="60rpx" height="60rpx"></u-image></view>
				<view class="d-flex j-center mr-1" v-if="!inputContext" @click="moreTool"><u-image :src="addition" width="60rpx" height="60rpx"></u-image></view>
				<u-button type="success" size="mini" class="mr-1" v-if="inputContext" @click="sendMsgs">发送</u-button>
			</view>
			<view v-if="isExpression" class="">
				<!-- <swiper class="slider" :current="emojiData.length - 1">
					<swiper-item v-for="(item, key) in emojiData" :key="key" class="slider-emoji" :class="[key == emojiData.length - 1 ? 'lastbox' : '']">
						<text v-for="(emoji, index) in item" :key="index" @click="selemoji(emoji)" class="slider-emoji-icon font-lg">{{ emoji }}</text>
					</swiper-item>
				</swiper> -->
			</view>
			<view v-if="isMoreTool">
				<u-grid :col="4" :border="false">
					<u-grid-item v-for="(item, index) in moreList" :key="index" bg-color="rgba(255,255,255,0)" @click="clickCard(item)">
						<view style="background-color: #FFFFFF;  border-radius: 40rpx;" class="p-2"><u-image :src="item.icon" width="60rpx" height="60rpx"></u-image></view>
						<view>{{ item.text }}</view>
					</u-grid-item>
				</u-grid>
			</view>
			
		</view>
	</view>
</template>

<script>
export default {
	name: 'chat-footer',
	props: {
		// classes: Array,
		KeyboardHeight:Number,
		tagList:Array,
		// inputContext:String,
		moreList:Array,
		gridStyle:Object,
		isMoreTool:Boolean,
		isExpression:Boolean
	},
	data() {
		return {
			// isExpression:false,
			// isMoreTool:false,
			expression: require('../static/expression.png'),
			addition: require('../static/addition.png'),
			inputContext:''
		};
	},
	updated() {
		// this.getFooterHeight();
	},
	methods:{
		focusInput(type,) {
			this.$emit('focusInput',type,)
		},
		expressionBtn() {
			this.$emit('expressionBtn')
		},
		moreTool() {
			this.$emit('moreTool')
		},
		// 键盘enter回车发送
		submit() {
			this.sendMsgs()
		},
		sendMsgs() {
			const text = this.inputContext
			this.$emit('sendMsgs', text)
			this.inputContext = ''
		},
		clickCard(item) {
			// console.log(this.inde);
			this.$emit('clickCard',item)
		},
		fillInput(item) {
			this.inputContext = item.text
			const type = 'text'
			this.$emit('fillInput', type)
			this.sendMsgs()
		}
	}
};
</script>

<style></style>

这个组件输入栏的样式是
在这里插入图片描述

//设置页面滚动到底部
scrollToBottom() {
 	let that = this
    let query = uni.createSelectorQuery()
    query.select('#scrollview').boundingClientRect()
    query.select('#msglistview').boundingClientRect()
    query.exec((res) => {
   	  	 // console.log(res)
	     //获取所有内部子元素的高度
	     //判断子元素高度是否大于显示高度
	     if(res[1].height > res[0].height){
		      // 用子元素的高度减去显示的高度就获益获得滚动的高度
		      that.scrollTop = res[1].height - res[0].height
	     }
    })
  },
// 获取底部菜单栏的高度
getFooterHeight() {
	let that = this;
	let query = uni.createSelectorQuery();
	query.select('.footerview').boundingClientRect();
	query.exec(function(res) {
		if (res[0]) {
			that.footViewHeight = res[0].height;
		}
		console.log(that.footViewHeight);
	});
	this.scrollToBottom();

	// console.log(this.footViewHeight);
}
  1. 在updated中调用scrollToBottom()方法,每次发生改变时都会调用滚动到底部的方法
updated() {
	//调用滚动到底部的方法
	this.scrollToBottom();
	this.getFooterHeight();
},

完成!!!

第二种方法

将聊天框封装成组件,和方法一中一样。这里就不在赘述。
样式布局除了scroll-view聊天框部分。其他顶部和底部输入栏都和方法一 一样。这里主要写聊天框部分,如下

//在scroll-view上添加scroll-into-view的属性,在循环聊天组件的id设置为'chatItem_' + index  这里style绑定chatBodyBottom来定位内容框的位置
<scroll-view scroll-y="true" class="main-scroll" :style="chatBodyBottom" :scroll-into-view="scrollIntoIndex" :scroll-with-animation="true" @click="showChat">
	<view v-for="(item, index) in chatData" :key="index" :id="'chatItem_' + index">
		<chat-item :userId="clientInfoData.userId" :item="item" ref="chatItem" @previewImage="previewImage"></chat-item>
	</view>
</scroll-view>

是聊天页滚动到最底部的方法是:

// 跳转页面底部
scrollToBottom() {
	this.$nextTick(() => {
		//这里将 最后一条聊天的下标'chatItem_' + index 赋值给 刚刚绑定的scrollIntoIndex。这样就可以实现滚动到底部
		let index = this.chatData.length - 1;
		this.scrollIntoIndex = 'chatItem_' + index;
	});
},

其他和方法一中的一样
这里提到怎么适配 有顶部标题栏和底部输入栏
在computed计算属性中添加

computed: {
	//设置聊天内容框距顶部和底部的距离。以此来了定位内容框的位置
	chatBodyBottom() {
		return `bottom:${this.footViewHeight + this.KeyboardHeight}px;top:${this.navBarHeight}px;`;
	}
},

在data中都有定义KeyboardHeight和navBarHeight。分别是键盘高度和顶部标题栏高度

结束最后,我要说几点,以上布局样式中有很多方法以及数据,在文章的methods和data中没有体现。没用过uniapp的可能难理解,见谅。

【uniapp-scrollView滚动到底部+滚动到顶部加载更多】 【代码】【uniapp-scrollView滚动到底部+滚动到顶部加载更多】 阅读详情

相关推荐

uni-app(vue3)中scroll-view实现聊天界面自动滚动到底部的实战技巧

本文详细介绍了在uni-app(vue3)中使用scroll-view组件实现聊天界面自动滚动到底部的实战技巧。通过scroll-into-view属性结合Vue3的watch响应式监听,确保新消息到达时自动平滑滚动。文章还提供了性能优化、滚动抖动处理等常见问题的解决方案,帮助开发者高效构建跨平台聊天应用。

weixin_29001655的博客 663

【uniapp】scroll-view 实现自动滚动到最底部

在做uniapp项目中,有个滚动视图组件,跟微信小程序里的组件一样的,想要实现自动滚动到最底部,是一件容易忽略的,小事情。

2万+

Spring Boot + uni-app 构建校园二手交易平台:全栈开发实战解析

在当今的互联网应用开发中,微服务架构与跨平台开发已成为主流技术范式。Spring Boot 作为 Java 领域构建独立、生产级微服务的首选框架,以其“约定大于配置”的理念,通过内嵌服务器和自动配置,极大地简化了后端 RESTful API 的开发与部署流程。uni-app 则基于 Vue.js 生态,凭借其“一次开发,多端发布”的跨平台能力,成为高效构建小程序、H5及App前端的有力工具。这两项技术的结合,为快速实现一个功能完整、体验流畅的商业级应用提供了坚实的技术底座,尤其适用于校园二手交易这类需要快速

weixin_30595035的博客 366

【Uniapp 】scroll-view 滚动条滚动到最底部

实时聊天等视图滚动到最底部,该方法不用计算容器的大小,宽高等问题

weixin_44435242的博客 8855

【学习记录】IIC驱动ICM42670+卡尔曼滤波+四元数姿态角解算

ICM42670陀螺仪可以使用iic驱动,单片机平台使用GD32f305VE。

liarsup的博客 8265

在 Linux/Debian/Ubuntu 上使用 Brasero 刻录光盘

在 Ubuntu 系统中,Brasero 是一个非常方便的光盘刻录工具。无论是创建数据光盘、音频光盘还是刻录光盘镜像文件,Brasero 都能轻松胜任。本文将介绍如何在 Ubuntu 上安装和使用 Brasero 进行光盘刻录。

I AM COMING BACK... 3543

uniapp scroll-view 怎么通过代码控制滚动到底部

这些方法都可以实现将 scroll-view 滚动到底部的效果[1][2][4]。选择哪种方法取决于你的具体需求和场景。第一种方法最简单,第二种方法可以更精确地控制滚动位置,第三种方法则更加灵活,可以适应不同的布局情况。在使用这些方法时,记得在适当的时机调用滚动方法,比如在数据更新后或者在用户触发某个操作后[4]。另外,为了提高性能,可以考虑使用节流函数来控制滚动方法的调用频率[4]。

前端原创分享,常年坚持记录和分享,全网阅读量超百万 6929

手把手教你用Excel自动化处理G14大额风险暴露报表(含211版模板)

本文针对G14大额风险暴露报表(含211版)手工填报效率低、易出错的核心痛点,提供了一套基于Excel VBA的完整自动化解决方案。文章详细讲解了如何构建从数据采集、清洗、关联客户识别、风险暴露计算到自动化校验与归档的完整工作流,并附有可操作的代码示例,旨在帮助银行风控人员大幅提升报表处理效率与准确性。

weixin_29304985的博客 447

uniapp小程序让页面滚动到底部_uni-app开发之使用scroll-view实现QQ小程序自动滑动到底部(二)...

版权声明:本文为博主原创文章,如果转载请给出原文链接:http://doofuu.com/article/4156212.html最近在开发一款情侣星座测试类型的QQ小程序。小程序中用到了类似聊天的界面,其中需要每次发完信息自动滑动到底部的需求。小程序滑动不像HTML那么简单,可以直接定位元素位置。不慌! 在小程序中虽然不像HTML中实现自动滑动到底部那么简单,不管是QQ小程序、还是微信小程序都有...

weixin_33374400的博客 3435

手把手用瑞萨E1仿真器调试RH850 CAN通信:从报文收发到底层寄存器监控

本文详细介绍了使用瑞萨E1仿真器调试RH850 CAN通信的全过程,包括硬件连接、CS+开发环境配置、CAN控制器寄存器解析以及双通道网关实战开发。通过实战案例和错误诊断技巧,帮助开发者快速掌握RH850F1L的RS-CAN控制器应用,提升车载网络开发效率。

weixin_30919429的博客 163

C8T6和ZET6选型更换过程中出现.\Obj\Project.sct(7): error: L6235E: More than one section matches selector - cann

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、问题原因二、解决方法三、现象总结 前言 又一件离谱的事情发生了,我之前转换过程中没有发生的错误,今天拿出来程序重新编译了一下,结果他奶奶滴一个新的错误出现了,而且我还完全不知道是什么原因导致的,先上图: 一、问题原因 之前我已经尝试过更换芯片选型,但是没有出现此类问题,今天更改的时候发现了,我还以为是个偶然错误,结果换来换去,还是有这个问题,那我之前说c8t6的程序更改成zet6上跑只需改芯片选型和宏定义岂不是啪啪打.

wx18045623090的博客 1489

uniapp滑到元素底部

uniapp滑到元素底部 需要用到scroll-view这个标签: scroll-y 允许纵向滚动 scroll-top 设置竖向滚动条位置 scroll-with-animation 在设置滚动条位置时使用动画过渡’ <scroll-view scroll-y="true" :scroll-top="scrollTop" scroll-with-animation="true"> // do some thing </scroll-view> scrol

letnewworld的博客 4138

HyperMesh二次开发实战:自动化Comp与材料属性批量绑定

本文详细介绍了HyperMesh二次开发中自动化Comp与材料属性批量绑定的实战技巧。通过TCL脚本实现批量创建属性卡、智能材料分配和异常处理,大幅提升前处理效率,适用于汽车、航空航天等领域的复杂模型处理。

weixin_29214691的博客 691

uniapp自动滚动到底部

scroll-into-view使用 <scroll-view scroll-y="true" style="height: 400rpx;" :scroll-into-view="bottomId" scroll-with-animation="true"> <view v-for="(item,index) in list"> <view :style=" 'height: 180rpx; background-color:' + ...

qq_34631220的博客 4718

构建OneService:打造高效、安全、灵活的企业级数据服务平台

数据服务(OneService)作为统一的数据服务出口,实现了数据的统一市场化管理,有效地降低数据开放门槛的同时,保障了数据开放的安全。

数据与算法架构提升之路专栏 2106

基于改进YOLOv5的小目标检测 | 添加CBAM注意机制 + 更换Neck网络之BiFPN + 增加高分辨率检测头

本文针对图像中小目标难以检测的问题,提出了一种基于YOLOv5的改进模型。在主干网络中,加入CBAM注意力模块增强网络特征提取能力;在颈部网络部分,使用BiFPN结构替换PANet结构,强化底层特征利用;在检测头部分,增加高分辨率检测头,改善对于微小目标的检测能力。本文算法在无人机数据集VisDrone2019数据集上进行了多次对比实验,结果表明本文算法可以有效地检测小目标。🌈

小哥谈 2937

【uni-app】uni-app中scroll-into-view的使用

在使用的时候需要注意: 需要给sroll-view组件设置宽或者高(根据横纵情况) `white-space:nowrap` 这行代码让组件能够滑动(之前自己写的时候踩的坑) 使用`scroll-into-view`,需要开启动画效果,并且动态绑定的值必须是字符串 并且子组件的上绑定一个id值用于定位......

Trees__的博客 9104

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

uni-app(vue3)实现对话界面,滚动条处于最下方!

最近在做一个自己的全栈项目,前端用的,主要也是想巩固一下uni-app这方面的知识,其中有一个页面,涉及到ai聊天的功能,我理想型是类似文心一言或者微信聊天页面的效果,但是研究半天,发现uni-app的scroll-view这个内置组件并不能像写pc的滚动条那么灵活,因为在小程序或者app没有dom这个概念,网上找了一堆资源,基本上全是vue2版本的,密密麻麻的文字,真是看不下去,自己动手,丰衣足食。

weixin_48373171的博客 6333

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

vue和uniapp页面自动滚动到最底部

vue项目中自动滚动到最底部 首先可以通过这个方法 获取到当前滚动的元素是哪一个 这个方法定义script标签里 export default外面 然后滚动的时候可以在控制台中打印出当前滚动的什么元素 function findScroller(element) { element.onscroll = function() { console.log(element)} Array.from(element.children).forEach(findScroller); }

haosicx的博客 1万+

uniapp关于scroll-view一直自动滚动到底部的功能

文章目录scroll-into-view使用scroll-top使用 需求:一般在scroll-view中会放置一个list列表,当列表条目增加的时候,使其自动滚动到底部显示最后一条 官方文档:scroll-view 有两个可用属性:声明scroll-into-view或者scroll-top 个人尝试后的结果,使用scroll-into-view在h5上有效,在微信小程序上无效;使用scroll-top在微信小程序也正常 scroll-into-view使用 <scroll-view scroll-

snoto的专栏 1万+

uni-app, 实现 scroll-view 自动滚动到底部,并控制触发频率

在频繁触发场景下,为了降低执行频率,可以增加节流函数 throttle,让 chatScrollTop 方法在规定时间内只执行一次,如果不需要可以忽略。当 scroll-view 内容改变时,调用 chatScrollTop 方法,就可以实现 scroll-view 内容区域自动滚动到底部效果。通过类名获取 scroll-view、和 scroll-view内容容器,得到两个元素的高度,动态设置 scrollTop 值。想要实现 scroll-view 滚动到底部,只需要让。

weixin_45559449的博客 8184

uni-app 聊天界面滚动到消息底部

那么思路已经很清晰了,使用uni.pageScrollTo 让滚动到目标位置(scrollTop)设置为页面的高度不就可以了?uni.createSelectorQuery()锁定scroll-view的id,使用NodesRef对象返回的只有height信息。

weixin_72254790的博客 2943

Uniapp滚动到底部

scrollToBottom() { this.$nextTick(function() { setTimeout(() => { uni.pageScrollTo({ scrollTop: 99999, duration: 0 }) }, 200) // 要加点延迟, 不然有可能不生效 }); } ...

shuleijia的博客 4912

uniapp聊天界面滚动到底部

uniapp中scroll-view聊天界面滚动到底部展示最新消息

奔跑吧代码 2540

uniapp 商品分类点击/滚动定位 scroll-view

左分类,右商品 左点击跳到其商品区 右滑动,左跳到其分类

MELANCHOLY ❤ ◁ ❚❚ ▷ 5868
上一篇: 分享在做vue项目时遇到的几个比较好的网站 vue导出EXCEL表格 和 vue中使用富文本编辑器
下一篇: uniapp中使用socket IO
Boo_crob
博客等级 码龄7年 14粉丝 29原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值