vue实现多行文字打印效果,支持流式文本格式添加输出

效果展示:

1.gif

组件代码:

<template>
	<view class="type-writer-container">
		<text>{{ contentText }}</text>
		<text v-show="initPosition !== contentText.length" :style="{ display: initPosition % 2 == 0 || initPosition == total ? 'hidden' : 'inline-block' }">|</text>
	</view>
</template>

<script>
export default {
	name: 'type-writer',
	props: {
		contentList: {
			type: Array,
			required: true
		},
		delaytime: {
			type: Number,
			default: 100
		},
		uid: {
			type: String | Number
		}
	},
	data() {
		return {
			timer: null,
			contentText: '',
			initPosition: 0,
			total: 0
		};
	},
	watch: {
		contentList(newvalue) {
			const me = this;
			clearInterval(me.timer);
			me.timer = null;
			me.initWriter(newvalue);
		}
	},
	mounted() {
		const me = this;
		console.log(me);
		me.initWriter(me.contentList);
	},
	methods: {
		initWriter(messageList) {
			const me = this;
			const text = messageList.join('');
			// me.initPosition =;
			me.total = text.length;
			me.getChatContent(text);
		},
		// 逐字显示内容,text:全部聊天内容
		getChatContent(text) {
			const me = this;
			// 定义当前定时器
			let timer = setInterval(() => {
				me.initPosition++;
				// 判断是否全部拼接
				if (me.initPosition == me.total) {
					console.log(' me.total', me.total);
					// 拼接内容
					let nowStr = text.substring(0, me.initPosition);
					me.contentText = nowStr;
					// 重置起始值
					// me.initPosition = 0;

					// 拼接完成清除定时器
					clearInterval(me.timer);
					me.$emit('finish', me.uid, true);
					return;
				}

				// 未拼接完成的取字符串子串进行拼接更新
				let nowStr = text.substring(0, me.initPosition);
				me.contentText = nowStr;
			}, 200);
			me.timer = timer;
		},
		pause() {
			const me = this;
			clearInterval(me.timer);
			me.$emit('pause', me.uid, true);
		},
		continues() {
			const me = this;
			me.initWriter(me.contentList);
		},
		reset() {
			const me = this;
			me.initPosition = 0;
			me.initWriter(me.contentList);
		}
	}
};
</script>

<style scoped lang="scss">
.type-writer-container {
	width: 100%;
	height: auto;
}
</style>

使用方式


<template>
	<view class="container">
		<view class="type-writer-content" v-for="(item,index) in list" :key="index">
		<type-writer   :uid="item.uid" :ref="`writer${item.uid}`" :contentList="item.contentList" :delaytime="item.delaytime"></type-writer>
		</view>
		<button @click="pause(0)">暂停打字</button>
		<button @click="continues(0)">继续打字</button>
		<button @click="reset(0)">重置</button>
	</view>
</template>

<script>
import typeWriter from '../../components/type-writer.vue';
export default {
	components: { typeWriter },
	data() {
		return {
			list: [
				{
					contentList: ['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'],
					delayTime: 300,
					uid: 0
				}
			]
		};
	},
	onLoad() {
		setTimeout(() => {
			this.list.push({
				contentList: ['bbbbbbbbbbbbbbbbbbbbbbbbbbb', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'],
				delayTime: 500,
				uid: 1
			});
		}, 2000);

		setTimeout(() => {
			this.list[1].contentList = this.list[1].contentList.concat(['ccccccccccccccccccccccccccccccccccc']);
		}, 5000);
	},
	methods: {
		finish(id, status) {
			console.log(1, id, status);
		},
		pause(id, status) {
			this.$refs[`writer${id}`][0].pause();
		},
		continues(id, status) {
			this.$refs[`writer${id}`][0].continues();
		},
		reset(id, status) {
			this.$refs[`writer${id}`][0].reset();
		}
	}
};
</script>

<style lang="scss">
.container {
	padding: 50upx;
	.type-writer-content {
		max-width: 60vw;
		border: 1upx solid #ccc;
		white-space: pre-wrap;
		word-wrap: break-word;
		padding: 15upx 30upx;
		border-radius: 50upx;
		margin: 20upx auto;
	}
}
</style>



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Vue实现多行文本的展开收起功能可以通过计算多行文本的高度来进行判断,并使用Vue的条件渲染来实现展开收起效果。 首先,在data中定义一个变量,例如`isExpanded`,用于控制文本的展开和收起状态,默认值设为`false`。 然后,在模板中使用条件渲染来根据`isExpanded`的值展示不同的内容。 例如,使用`v-if`指令来判断是否展开,如果展开则显示完整文本,否则只显示指定行数的文本。可以使用`v-text`指令来绑定文本内容。通过CSS的`line-clamp`属性来设置文本行数,超出的部分将被省略。 ``` <template> <div> <div v-if="isExpanded"> <div v-text="text"></div> </div> <div v-else> <div class="clamp-line" v-text="text"></div> </div> <button @click="toggleExpand"> {{ isExpanded ? '收起' : '展开' }} </button> </div> </template> <script> export default { data() { return { isExpanded: false, text: "这是一段多行文本" }; }, methods: { toggleExpand() { this.isExpanded = !this.isExpanded; } } }; </script> <style scoped> .clamp-line { display: -webkit-box; overflow: hidden; text-overflow: ellipsis; -webkit-line-clamp: 3; /* 设置为需要显示的行数 */ -webkit-box-orient: vertical; } </style> ``` 以上代码中,点击按钮时会触发`toggleExpand`方法,通过修改`isExpanded`的值来切换展开和收起状态。根据`isExpanded`的值,使用不同的模板来渲染文本内容。 按钮的文本内容也根据`isExpanded`的值来显示“展开”或“收起”。点击按钮时,会调用`toggleExpand`方法切换`isExpanded`的值。 通过以上代码和样式设置,就可以实现一个简单的多行文本展开收起的功能。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值