解决vue-element-admin 组件Markdown 预览窗口太小问题

5 篇文章 0 订阅
4 篇文章 0 订阅

问题展示

最近在使用 vue-element-admin ,然后当在使用Markdown 编辑器的时候发现了Markdown 输出样式有问题,如图:

在这里插入图片描述

修复后的效果

 

问题解释

大致意思是vue-element-admin master 分支使用的markdown 编辑器是基于tui.editor 这个库。

  • Markdown is based on tui.editor ,simply wrapped with Vue. Documentation
  • Originally used simplemde-markdown-editor as the markdown editor, but this library has not been updated and maintained for a long time, and there is also the risk of xss. So after the v3.9.3+ version, use tui.editor as the new editor. All the next documents are Based on tui.editor it. More Content.

翻译下就是:

最初使用simplemde-markdown-editor作为markdown编辑器,但是该库很长时间没有更新和维护,并且还存在xss的风险。 因此,在v3.9.3 +版本之后,请使用 tui.editor 作为新编辑器。 接下来的所有文档都基于tui.editor它。

但是tui.editor在后来的版本更新中改名成了@toast-ui/editor

问题解决

1.修改package.json

方法一:修改package.json

// 1.将package.json中的
"dependencies": {
    "tui-editor": "1.3.3",
}
// 替换为
"dependencies": {
    "@toast-ui/editor": "^2.2.0",
}
// 2.删除node_modules文件
// 3.重新安装依赖
npm i

 方法二:使用命令行

// 1.删除node_modules文件夹

// 2.卸载有问题的插件
npm uninstall tui-editor

// 3.安装@toast-ui/editor
npm i @toast-ui/editor

// 4.重新安装依赖
npm i 

2.更改组件内容

components/MarkdownEditor/index.vue

<template>
  <div :id="id" />
</template>

<script>
// deps for editor
import "codemirror/lib/codemirror.css"; // Editor's Dependency Style
import "@toast-ui/editor/dist/toastui-editor.css"; // Editor's Style

// import Editor from 'tui-editor' 有markdown预览窗口问题
import Editor from "@toast-ui/editor"; // 新版
import defaultOptions from "./default-options"; // 导入默认选项参数

export default {
  name: "MarkdownEditor",
  props: {
    value: {
      type: String,
      default: "",
    },
    id: {
      type: String,
      required: false, // 是否必须设置
      default() {
        return (
          "markdown-editor-" +
          +new Date() +
          ((Math.random() * 1000).toFixed(0) + "")
        );
      },
    },
    options: {
      // 创建tui-editor初始化参数
      type: Object,
      default() {
        return defaultOptions;
      },
    },
    mode: {
      // 默认模式为markdown格式
      type: String,
      default: "markdown",
    },
    height: {
      // 高度
      type: String,
      required: false, // 是否必须设置
      default: "300px", // 默认高度
    },
    language: {
      // 语言
      type: String,
      required: false, // 是否必须设置
      default: "en_US", // https://github.com/nhnent/tui.editor/tree/master/src/js/langs
    },
  },
  data() {
    return {
      editor: null,
    };
  },
  computed: {
    // 编辑器选项
    editorOptions() {
      // Object.assign(): 用于将所有可枚举属性的值从一个或多个源对象分配到目标对象
      const options = Object.assign({}, defaultOptions, this.options);

      // 设置默认编辑类型
      options.initialEditType = this.mode;

      // 设置高度
      options.height = this.height;

      // 设置语言
      options.language = this.language;
      return options;
    },
  },
  watch: {
    // 监控value发生改变后执行方法
    value(newValue, preValue) {
      if (newValue !== preValue && newValue !== this.editor.getValue()) {
        // 设置当前编辑新值
        this.editor.setValue(newValue);
      }
    },
    // 语言发生改变执行方法
    language(val) {
      // 重置编辑器
      this.destroyEditor();
      // 初始化编辑器
      this.initEditor();
    },
    // 高度发生改变执行
    height(newValue) {
      // 设置新的高度
      this.editor.height(newValue);
    },
    // 模式发生改变执行
    mode(newValue) {
      // 不更改原有参数,创建新的参数存储模式
      this.editor.changeMode(newValue);
    },
  },
  // 页面初始化执行
  mounted() {
    this.initEditor();
  },
  // 退出时执行
  destroyed() {
    this.destroyEditor();
  },
  methods: {
    // 初始化编辑器
    initEditor() {
      // 创建一个tui-editor对象,并赋值给当然的editor
      this.editor = new Editor({
        // 绑定编辑器的id
        el: document.getElementById(this.id),
        // 设置初始化参数
        ...this.editorOptions,
      });
      // 判断当前value是否为空
      if (this.value) {
        // 不为空设置编辑的内容
        this.editor.setMarkdown(this.value);
      }
      // 子组件可以使用 $emit 触发父组件的自定义事件
      // 为editor属性绑定change事件
      this.editor.on("change", () => {
        // 触发当前实例上的事件,获取编辑属性中的内容
        this.$emit("input", this.editor.getMarkdown());
      });
    },
    // 销毁编辑器
    destroyEditor() {
      // 如果为空return
      if (!this.editor) return;

      // 从事件类型解除绑定change事件
      this.editor.off("change");
      // 删除工具栏项
      this.editor.remove();
    },
    setValue(value) {
      // 设置内容
      this.editor.setMarkdown(value);
    },
    getValue() {
      // 获取内容
      return this.editor.getMarkdown();
    },
    setHtml(value) {
      // 设置html
      this.editor.setHtml(value);
    },
    getHtml() {
      // 获取html
      return this.editor.getHtml();
    },
  },
};
</script>

components/MarkdownEditor/default-options

// doc: https://nhnent.github.io/tui.editor/api/latest/ToastUIEditor.html#ToastUIEditor
// 默认选项
export default {
  minHeight: "200px", // 最小高度
  previewStyle: "vertical", // 预览风格   vertical 垂直
  useCommandShortcut: true, // 使用命令快捷键
  useDefaultHTMLSanitizer: true, // 使用默认html清洁
  usageStatistics: false, // 使用情况统计
  hideModeSwitch: false, // 隐藏模式开关
  toolbarItems: [
    // 工具栏选项按钮布局顺序
    "heading", // 文字标题
    "bold", // 文字加粗
    "italic", // 文字倾斜
    "strike", // 文字删除线
    "divider", // 分割线
    "hr", // 水平分隔线
    "quote", // 引述
    "divider", // 分割线
    "ul", // 无序列表
    "ol", // 有序列表
    "task", // 任务
    "indent", // 向右缩进
    "outdent", // 向左缩进
    "divider", // 分割线
    "table", // 插入表格
    "image", // 插入图标
    "link", // 引用链接
    "divider", // 分割线
    "code", // 代码
    "codeblock", // 代码块
  ],
};

最后npm run dev运行代码即可

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 关于vue-element-admin的抽屉组件,我可以回答。抽屉组件Vue-Element-Admin中一种常见的UI组件,通常用于在界面上打开一个侧边栏,展示与当前页面相关的信息或操作。抽屉组件通常由一个触发按钮和一个侧边栏组成,在点击触发按钮后,侧边栏会从页面的侧边滑出,显示出其中的内容。这个组件Vue-Element-Admin中的使用也比较简单,只需要在相应的页面组件中引入抽屉组件,然后在template中使用即可。 ### 回答2: vue-element-admin 是一个基于 Vue.js 和 Element UI 的后台管理系统框架。其中的抽屉组件是一种常见的界面元素,以便在用户点击某个触发按钮时,将一个侧边栏或抽屉式的面板从屏幕边缘展开。下面是关于 vue-element-admin 的抽屉组件的一些特点和用法。 首先,vue-element-admin 的抽屉组件支持多种触发方式,包括按钮点击、链接点击、图标点击等。通过简单的配置即可实现不同的触发效果。 其次,抽屉组件可以在页面内的任何位置进行配置,并且可以自定义属性,比如宽度、位置等。这样可以根据实际需求,将抽屉组件放在不同的区域展示,并具有灵活的布局。 另外,抽屉组件还支持多种动画效果,比如淡入淡出、滑动等。这些效果可以通过简单的配置进行设置,使页面展示更加流畅和动感。 在使用方面,只需在模板中调用抽屉组件的标签,并设置相应的属性和事件,就可以实现抽屉的展开和关闭操作。同时,可以结合其他组件和数据进行交互,实现更加复杂的功能。 总之,vue-element-admin 的抽屉组件提供了一种简单、灵活的方式来实现抽屉式的界面效果,可以方便地用于后台管理系统的开发。无论是在布局美观性还是交互体验上,都具有很高的可定制性和扩展性。 ### 回答3: vue-element-admin是一个基于Vue.js和Element UI的后台管理系统模板,它提供了丰富的组件和功能,包括抽屉组件(Drawer)。 抽屉组件vue-element-admin中常用的一个组件,用于实现侧边栏的展开和收缩功能。在vue-element-admin中,抽屉组件通常用于显示左侧菜单栏,在点击菜单项时展开或收缩对应的子菜单。 抽屉组件的主要特点有: 1. 支持多级菜单:抽屉组件可以嵌套使用,实现多级菜单的展开和收缩。 2. 可配置性强:通过配置数据源,可以自定义菜单项的文本、图标、路径等属性,灵活地适应不同的需求。 3. 用户友好的交互效果:在抽屉组件中,菜单项的展开或收缩通过动画效果呈现,使用户操作更加流畅,并且可以通过点击菜单项外的区域来关闭抽屉,提供更好的用户体验。 4. 状态管理灵活:抽屉组件采用Vue.js的响应式数据机制,在抽屉展开或收缩时,组件会自动更新状态,例如更新菜单项的选中状态。 要在vue-element-admin中使用抽屉组件,首先需要在代码中导入抽屉组件,然后根据需要进行配置和使用。例如,可以通过v-for指令循环遍历菜单项,动态生成抽屉中的菜单,并通过点击事件监听菜单项的点击事件,实现展开子菜单或跳转到对应页面的功能。 总之,vue-element-admin的抽屉组件是一个功能强大且灵活的组件,可以帮助开发者快速实现后台管理系统中的菜单展开和收缩功能,提供良好的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值