uni-app 含有代码块的富文本组件(带有编辑和预览功能)

uni-app 含有代码块的富文本组件(带有编辑和预览功能)

含有代码块的富文本组件(带有编辑和预览功能)
有偿++

2 回复

可以做 专业插件开发 q 1196097915 https://ask.dcloud.net.cn/question/91948

更多关于uni-app 含有代码块的富文本组件(带有编辑和预览功能)的实战教程也可以访问 https://www.itying.com/category-93-b0.html


uni-app 中实现一个包含代码块的富文本组件,并支持编辑和预览功能,可以借助 rich-text 组件和一些自定义逻辑来实现。以下是一个简化的实现示例,包括编辑和预览功能:

1. 创建基础页面结构

首先,创建一个页面,包含编辑区和预览区:

<template>
  <view class="container">
    <view class="editor-area">
      <textarea v-model="content" placeholder="请输入内容(支持Markdown)"></textarea>
      <button @click="togglePreview">切换预览</button>
    </view>
    <view class="preview-area" v-if="isPreview">
      <rich-text :nodes="parsedContent"></rich-text>
    </view>
    <view class="editor-area" v-else>
      <!-- 编辑区保持显示 -->
    </view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      content: '',
      isPreview: false,
      parsedContent: []
    };
  },
  methods: {
    togglePreview() {
      this.isPreview = !this.isPreview;
      if (this.isPreview) {
        this.parseContent();
      }
    },
    parseContent() {
      // 假设这里有一个markdown解析器,将markdown转换为rich-text可识别的nodes
      // 这里简单模拟,只处理代码块,其他markdown语法需自行扩展
      const lines = this.content.split('\n');
      let nodes = [];
      let inCodeBlock = false;
      lines.forEach(line => {
        if (line.trim() === '```') {
          inCodeBlock = !inCodeBlock;
          if (!inCodeBlock) {
            nodes.push({
              name: 'text',
              attrs: {
                class: 'code-block',
                decode: true
              },
              children: [{
                type: 'text',
                text: lines.slice(lines.indexOf('```') + 1, lines.indexOfLast('```')).join('\n')
              }]
            });
            lines.splice(lines.indexOfLast('```') + 1, lines.length - lines.indexOfLast('```') - 1); // 移除代码块后的内容(简化处理)
          } else {
            nodes.push({ name: 'element', attrs: { class: 'code-block-start' }, children: [] }); // 标记代码块开始(样式处理需自行添加)
          }
        } else if (inCodeBlock) {
          // 这里暂时不处理代码块内部内容,仅作为占位
        } else {
          // 非代码块内容处理(需自行扩展)
        }
      });
      this.parsedContent = nodes;
    }
  }
};
</script>

<style>
.container {
  display: flex;
  flex-direction: column;
}
.editor-area, .preview-area {
  padding: 10px;
  border: 1px solid #ddd;
  margin-bottom: 10px;
}
.code-block {
  background-color: #f5f5f5;
  padding: 5px;
  border-radius: 3px;
}
</style>

2. 注意事项

  • 上述代码仅实现了基础的代码块处理逻辑,对于完整的Markdown解析,建议使用第三方库,如 markedmarkdown-it,并在 parseContent 方法中进行集成。
  • rich-text 组件的 nodes 属性接受一个数组,数组中的每个对象代表一个节点,需根据Markdown内容动态生成。
  • 样式部分需根据实际需求进行调整,特别是代码块的样式。
  • 本示例未处理复杂的Markdown语法和嵌套结构,需根据具体需求进行扩展。
回到顶部