首页 > 其他分享 >基于uni-app+vue3渲染markdown格式|uniapp软键盘顶起问题解决方案

基于uni-app+vue3渲染markdown格式|uniapp软键盘顶起问题解决方案

时间:2023-06-25 09:12:22浏览次数:50  
标签:uniapp markdown app value let highlight uni

前些时候有给大家分享一篇uni-app+vite4+uview-plus搭建跨端项目。今天主要分享下在uniapp中渲染markdown语法及uniapp中软键盘弹起,页面tabbar或顶部自定义navbar导航栏被撑起挤压的问题。

如上图:支持h5+小程序+App端markdown解析渲染。

上面则是演示了在App端+小程序端键盘弹起,整体页面及自定义导航条不会被顶跑的问题。

好了,话不多说,接下来就主要介绍下如何实现的吧。

uniapp+vue3解析markdown语法/高亮

虽说uniapp插件市场也有一些markdown渲染插件,但大多兼容性不好。于是就使用了markdown-it及highlight.js插件进行了简单的封装处理。经调试目前可以支持h5/小程序/App端的markdown语法解析。

// 引入markdown-it和highlight.js插件
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'

highlight.js高亮样式大家可以根据需要自行下载,这里使用的浅色样式。

  • 初始化markdownIt插件

接下来是初始化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;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
}

最后使用rich-text组件来渲染处理后的结果。

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

代码复制功能则是使用rich-text提供的itemclick方法来实现。

// 复制代码
const handleItemClick = (e) => {
  let {attrs} = e.detail.node
  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语法了。

如果大家有一些其它不错的解决方案,欢迎交流讨论分享哈~~

uni-app软键盘撑起顶跑问题

在使用uniapp开发的时候,经常会遇到input输入框键盘会顶跑页面。导致顶部自定义导航栏会不见了。

接下来就介绍一种简单的方法,经测试是可行的,如果大家有其它方法,也欢迎交流分享。

说白了,就是在input编辑框外层加一个view标签,然后给设置padding-bottom为键盘弹起高度。

uniapp也提供了监听键盘高度变化函数 uni.onKeyboardHeightChange 

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

这里减去50是底部有自定义tabbar,大家可以根据实际情况调整。

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

目前通过这种方法解决了键盘撑起问题。如果大家有其它解决方法,欢迎下方留言讨论哈~~

标签:uniapp,markdown,app,value,let,highlight,uni
From: https://www.cnblogs.com/xiaoyan2017/p/17502105.html

相关文章

  • esp-idf apptrace功能实验
    应用层跟踪库Apptrace功能简介:主要功能一共有四个,目前探索了3个收集来自特定应用程序的数据。具体请参阅特定应用程序的跟踪。记录到主机的轻量级日志。具体请参阅记录日志到主机。系统行为分析。具体请参阅基于SEGGERSystemView的系统行为分析。(同时连jtag还有uar......
  • markdown 笔记转 html 单文件
    markdown笔记转html单文件图片转base64![image][imageid][imageid]:yourimage'sbase64markdown转html工具i5ting_toc安装安装nodejs环境:https://nodejs.org/en/npminstalli5ting_toc-g使用进入md文件所在目录,打开cmd窗口输入命令i5ting_toc-fin......
  • 学习 | App自启动和关联启动
    一、监管要求1.1监管条例164号文(《工业和信息化部关于开展纵深推进APP侵害用户权益专项整治行动的通知》)中有提到,App在无合理场景、且未经用户明示告知和同意的情况下,禁止频繁自启动和关联启动:《工业和信息化部关于进一步提升移动互联网应用服务能力的通知》1.2被通报案......
  • Xcode 15 beta 2 (15A5161b) 发布下载 - Apple 平台 IDE (visonOS 1 beta 已发布)
    Xcode15beta2(15A5161b)发布下载-Apple平台IDE(visonOS1beta已发布)IDEforiOS/iPadOS/macOS/watchOS/tvOS/visonOS此版本已加入visonOS支持。请访问原文链接:https://sysin.org/blog/apple-xcode-15/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org......
  • 用applescript脚本实现检测手机号码是否注册imessage的原理
    一、检测数据的两种方式:1.人工筛选,将要验证的号码输出到文件中,以逗号分隔。再将文件中的号码粘贴到iMessage客户端的地址栏,iMessage客户端会自动逐个检验该号码是否为iMessage账号,检验速度视网速而定。红色表示不是iMessage账号,蓝色表示iMessage账号。2.编写脚本控制Macos/iphon......
  • 使用Markdown
    使用Markdown介绍Markdown相关编辑器的安装和使用一、Markdown简介​ Markdown是一种轻量级标记语言,常被用来编写开发文档、帮助文档、博客、电子书,使用Markdown编写的文档后缀为.md。二、安装Typora安装Typora0.10之前的版本0.9.96Windows版:https://pan.baidu.com/......
  • 逆向分析某信营业厅APP
    逆向分析某信营业厅APPAPP版本号10.3.2工具IDAFRIDAJEB抓包分析可以看到显示红色的,抓包失败。从ua中可以看到,采用的okhttp通信框架,接下来的思路就是反编译客户端,静态分析。查壳、脱壳经工具查询,得知其采用的是爱加密的壳。FridaHookfrida-U-fcom.ct.client-l1.js--no-pau......
  • 逆向分析某信营业厅APP
    逆向分析某信营业厅APPAPP版本号10.3.2工具IDAFRIDAJEB抓包分析可以看到显示红色的,抓包失败。从ua中可以看到,采用的okhttp通信框架,接下来的思路就是反编译客户端,静态分析。查壳、脱壳经工具查询,得知其采用的是爱加密的壳。FridaHookfrida-U-fcom.ct.client......
  • 连接app的封装方法
    importpsutilfrompywinauto.applicationimportApplicationfrompywinautoimportDesktop,WindowSpecificationclassConnApp:@staticmethoddefconn_single_proc_app(proc_name:str,proc_path:str,app_backend:str="win32",......
  • idea的创建与使用mapper映射文件
    一.创建mapper映射文件在设置中模板<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="&......