探索uniapp+vue3解析markdown语法|uniapp键盘撑起

这篇具有很好参考价值的文章主要介绍了探索uniapp+vue3解析markdown语法|uniapp键盘撑起。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近正在尝试使用uniapp+vue3开发仿制chatgpt会话功能。

探索uniapp+vue3解析markdown语法|uniapp键盘撑起
如上图:经过测试在h5/App端/小程序端 均支持markdown语法解析,键盘撑起后,整体页面和顶部自定义导航栏不会被顶起。

uniapp markdown解析及语法高亮

使用了markdown-ithighlight.js插件实现markdown语法解析及高亮代码。

// 引入uniapp markdown插件
import MarkdownIt from '@/plugins/markdown-it.min.js'
import hljs from '@/plugins/highlight/highlight.min.js'
// import '@/plugins/highlight/github-dark.min.css'
import '@/plugins/highlight/atom-one-light.css'
import parseHtml from '@/plugins/html-parser.js'

探索uniapp+vue3解析markdown语法|uniapp键盘撑起

  • 初始化markdown插件
const markdown = MarkdownIt({
	 html: true,
	 highlight: function(str, lang) {
		let preCode = ""
		try {
			preCode = hljs.highlightAuto(str).value
		} catch (err) {
			preCode = markdown.utils.escapeHtml(str);
		}
		// 自定义行号
		const lines = preCode.split(/\n/).slice(0, -1)
		let html = lines.map((item, index) => {
			// 去掉空行
			if( item == ''){
				return ''
			}
			return '<li><span class="line-num" data-line="' + (index + 1) + '"></span>' + item +'</li>'
		}).join('')
		html = '<ol style="padding: 0px 30px;">' + html + '</ol>'
		
		// 代码复制
		copyCode.push(str)
		let htmlCode = `<div class="markdown-wrap">`
			// #ifndef MP-WEIXIN
				htmlCode += `<div style="color: #aaa;text-align: right;font-size: 12px;padding:8px;">`
					htmlCode += `${lang}<a class="copy-btn" code-data-index="${copyCode.length - 1}" style="margin-left: 8px;">复制代码</a>`
				htmlCode += `</div>`
			// #endif
				htmlCode += `<pre class="hljs" style="padding:0 8px;margin-bottom:5px;overflow: auto;display: block;border-radius: 5px;"><code>${html}</code></pre>`;
			htmlCode += '</div>'
		return htmlCode
	}
})
  • 解析markdown语法
const parseNodes = (value) => {
	 if(!value) return
	 
	 let htmlString = ''
	if (value.split("```").length % 2) {
		let msgContent = value
		if(msgContent[msgContent.length-1] != '\n'){
			msgContent += '\n'
		}
		htmlString = markdown.render(msgContent)
	} else {
		htmlString = markdown.render(msgContent.value)
	}
	
	// #ifndef APP-NVUE
	return htmlString
	// #endif
	
	// nvue模式下将htmlString转成htmlArray,其他情况rich-text内部转
	// 注:本示例项目还没使用nvue编译
	// #ifdef APP-NVUE
	return parseHtml(htmlString)
	// #endif
}

在会话消息地方调用parseNodes方法。

<rich-text space="nbsp" :nodes="parseNodes(item.content)" @itemclick="handleItemClick"></rich-text>

uniapp中的rich-text组件提供了itemclick方法。拦截点击事件(只支持 a、img标签),返回当前node信息 event.detail={node}

// 复制代码
const handleItemClick = (e) => {
	console.log(e);
	let {attrs} = e.detail.node
	console.log({attrs});
	let {"code-data-index": codeDataIndex, "class": className} = attrs
	if(className == 'copy-btn'){
		uni.setClipboardData({
			data:copyCode[codeDataIndex],
			showToast:false,
			success() {
				uni.showToast({
					title: '复制成功',
					icon: 'none'
				});
			}
		})
	}
}

到这里就基本上可以支持markdown语法解析了。

探索uniapp+vue3解析markdown语法|uniapp键盘撑起

uniapp 键盘撑起页面问题

uniapp中使用flex布局一个聊天页面,input输入框随着键盘弹起,整个页面会被向上顶起,导致顶部导航栏会不见了。
就想着能否在键盘弹起的时候,获取键盘高度,然后给弹起div层加个padding,经过一番尝试,此方案可行~~

探索uniapp+vue3解析markdown语法|uniapp键盘撑起
如上图:给编辑器外层加一个view层,设置 padding-bottom 为键盘弹起高度。

const fixPaddingBottom = computed(() => {
	let keyH = keyboardHeight.value > 70 ? keyboardHeight.value - 70 : keyboardHeight.value
	return (keyH || 10) + 'px'
})

这里的70可以根据实际情况调整。

然后在onMounted中获取键盘弹起高度。

onMounted(() => {
	nextTick(() => {
		scrollToLast()
	})
	
	// #ifndef H5
	uni.onKeyboardHeightChange(e => {
		keyboardHeight.value = e.height
		// 在dom渲染完毕 滚动到最后一条消息
		nextTick(() => {
			scrollToLast()
		})
	})
	// #endif
})

探索uniapp+vue3解析markdown语法|uniapp键盘撑起
经过一番调试,键盘弹起,只是内容区被顶起,而顶部的自定义导航栏则不会被顶跑,完美解决了页面整体被顶跑的问题。

如果大家有其它比较优的解决方法,欢迎一起交流讨论哈~~文章来源地址https://www.toymoban.com/news/detail-501934.html

到了这里,关于探索uniapp+vue3解析markdown语法|uniapp键盘撑起的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#探索之路基础夯实篇(5):语法糖概念解析

    从之前一开始接触lua的时候开始,开始第一次接触到语法糖,后续在看电子书籍的时候屡屡提及到语法糖这个概念,那么语法糖到底是什么呢? 语法糖的概念可以理解为某一段代码的简写或简化形式。它并不是新增功能或语言结构,而是一种更便捷的书写方式,可以使代码更

    2024年04月29日
    浏览(37)
  • 【Vue3 知识第三讲】模板语法、Vue3指令

    插值表达式 {{ data }} 可以用于渲染 Vue 中提供的数据。 数字化管理平台 Vue3+Vite+VueRouter+Pinia+Axios+ElementPlus 权限系统-商城 个人博客地址 注:vue中的插值提供了真正的js环境,因此我们可以直接使用 JS 表达式 2.1 概述 指令是什么 指令就是一个自定义属性,Vue中的指令都是以 v

    2024年02月10日
    浏览(30)
  • Vue3语法大全

    Vue.js是一个渐进式JavaScript框架,旨在通过尽可能简单的 API 实现响应式的数据绑定和组合的视图组件。Vue3是Vue.js框架的下一个主要版本,在这个版本中,Vue.js团队不仅优化了性能,而且还引入了一些新的语法。本篇博客将介绍Vue3中的所有语法。 组合式API是Vue3中最重要的新特

    2024年02月10日
    浏览(32)
  • 04 - Vue3语法系统进阶 - 全面掌握Vue3特性

    Vue是基于MVVM设计模式进行实现的,视图与数据不直接进行通信,但是Vue并没有完全遵循这一原则,而是允许开发者直接进行原生DOM操作。 在Vue中可通过 ref 属性来完成这一行为,通过给标签添加 ref 属性,然后再通过 vm.$refs 来获取DOM 把 ref 属性添加给组件,可以获取到组件的

    2024年02月12日
    浏览(27)
  • 前端系列-Vue3基本语法

    # 插值操作 1、插值:{{}} 2、指令:v-     在{{}}和v-指令进行数据绑定时,支持js单个表达式     p v-once{{msg}}/p 数据只第一次时显示,不响应式     p v-pre{{msg}}/p 内容原封不动的展示     p v-text=\\\'msg\\\'/p 相当于插值表达式的功能     p v-html=\\\'title\\\'/p 可以解析标签     # 绑定属

    2024年02月09日
    浏览(36)
  • vue3模板-vscode设置(语法糖)

    选择菜单里的 文件 首选项 用户代码片段 vscode模板 结果 useCurrentInstance.ts

    2024年02月07日
    浏览(32)
  • vue3中使用ref语法糖

    自从引入组合式 API 的概念以来,一个主要的未解决的问题就是 ref 和响应式对象到底用哪个。响应式对象存在解构丢失响应性的问题,而 ref 需要到处使用 .value 则感觉很繁琐,并且在没有类型系统的帮助时很容易漏掉 .value 以上是官方原话,大概就是新的语法糖,可以让我们更

    2023年04月09日
    浏览(35)
  • vue3探索——pinia高阶使用

    以下是一些 Pinia 的其他高阶功能: storeToRefs() :响应式解构仓库,保证解构出来的数据是响应式的数据。 状态持久化 :Pinia 并没有内置的状态持久化功能,但你可以使用第三方库或自定义插件来实现状态的持久化。例如,你可以使用  localStorage  或  sessionStorage  来将状态

    2024年02月08日
    浏览(25)
  • TypeScript快速上手语法+结合vue3用法

            前言:             本篇内容不涉及TypeScript安装以及配置,具体安装及配置篇可以看下面目录,本篇只涉及TypeScript语法相关内容,及结合vue3的用法。不讲废话,简单直接直接开撸。 目录      TypeScript的具体安装及配置  TypeScript快速上手语法+结合vue3用法 1、

    2024年02月03日
    浏览(26)
  • ts语法如何在Vue3中运用?

    一、父子传值的用法 父传子:defineProps的TS写法 补充: 如果需要给 props 设置默认值,需要使用  withDefaults  函数: 子传父:defineEmits的TS写法 二、ref/reactive的TS用法 1.简单数据类型可以不定义ts类型 ref()  会隐式的依据数据推导类型  2.如果是复杂类型,建议用泛型 三、com

    2024年02月06日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包