返回顶部
首页 > 资讯 > 前端开发 > JavaScript >在vue中完美使用ueditor组件(cdn)解读
  • 388
分享到

在vue中完美使用ueditor组件(cdn)解读

vue使用ueditor组件vueueditor组件vueueditor 2023-01-28 06:01:00 388人浏览 泡泡鱼
摘要

目录Vue使用ueditor组件(cdn)vue项目使用ueditor指南基本使用使用配置跳坑心得总结vue使用ueditor组件(cdn) 前言:无需main.js或页面全局或局部

vue使用ueditor组件(cdn)

前言:无需main.js或页面全局或局部引入,直接使用cdn将ueditor作为vue组件 

请直接创建vue文件,作为组件使用。复制粘贴,即可直接使用(此篇只展示前端代码,后端大家自由选择,图片资源存放建议使用阿里云oss或者七牛云对象存储)

component组件代码:

<template>
    <script :id="randomId" name="content" type="text/plain" :style="ueditorStyle"></script>
</template>
<script>
export default {
    name: 'Editor',
    props: {
        ueditorPath: {
            // UEditor 代码的路径
            type: String,
            default: '............',//cdn地址
        },
        ueditorConfig: {
            // UEditor 配置项
            type: Object,
            default: function() {
                return {
                    toolbars:[['source', 'bold', 'italic', 'underline', 'removefORMat', 'forecolor', 'backcolor', 'paragraph', 'fontfamily', 'fontsize', 'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', 'simpleupload']],
                    serverUrl: '............',//后台保存路由
                };
            }
        },
        ueditorStyle: {
        	type: Object,
        	default: function() {
                return {
                }
            }
        },
    },
    data() {
        return {
            // 为了避免麻烦,每个编辑器实例都用不同的 id
            randomId: 'editor_' + (Math.random() * 100000000000000000),
            instance: null,
            // scriptTagStatus -> 0:代码未加载,1:两个代码依赖加载了一个,2:两个代码依赖都已经加载完成
            scriptTagStatus: 0
        };
    },
    created() {
        if (window.UE !== undefined) {
            // 如果全局对象存在,说明编辑器代码已经初始化完成,直接加载编辑器
            this.scriptTagStatus = 2;
            this.initEditor();
        } else {
            // 如果全局对象不存在,说明编辑器代码还没有加载完成,需要加载编辑器代码
            this.insertScriptTag();
        }
        console.log(this)
    },
    beforeDestroy() {
        // 组件销毁的时候,要销毁 UEditor 实例
        if (this.instance !== null && this.instance.destroy) {
            this.instance.destroy();
        }
    },
    methods: {
        insertScriptTag() {
            let editorScriptTag = document.getElementById('editorScriptTag');
            let configScriptTag = document.getElementById('configScriptTag');
 
            // 如果这个tag不存在,则生成相关代码tag以加载代码
            if (editorScriptTag === null) {
                configScriptTag = document.createElement('script');
                configScriptTag.type = 'text/javascript';
                configScriptTag.src = this.ueditorPath + 'neditor.config.js';
                configScriptTag.id = 'configScriptTag';
 
                editorScriptTag = document.createElement('script');
                editorScriptTag.type = 'text/javascript';
                editorScriptTag.src = this.ueditorPath + 'neditor.all.min.js';
                editorScriptTag.id = 'editorScriptTag';
                let s = document.getElementsByTagName('head')[0];
                s.appendChild(configScriptTag);
                s.appendChild(editorScriptTag);
            }
 
            // 等待代码加载完成后初始化编辑器
            if (configScriptTag.loaded) {
                this.scriptTagStatus++;
            } else {
                configScriptTag.addEventListener('load', () => {
                    this.scriptTagStatus++;
                    configScriptTag.loaded = true;
                    this.initEditor();
                });
            }
 
            if (editorScriptTag.loaded) {
                this.scriptTagStatus++;
            } else {
                editorScriptTag.addEventListener('load', () => {
                    this.scriptTagStatus++;
                    editorScriptTag.loaded = true;
                    this.initEditor();
                });
            }
 
            this.initEditor();
        },
        initEditor() {
            // scriptTagStatus 为 2 的时候,说明两个必需引入的 js 文件都已经被引入,且加载完成
            if (this.scriptTagStatus === 2 && this.instance === null) {
                // Vue 异步执行 DOM 更新,这样一来代码执行到这里的时候可能 template 里面的 script 标签还没真正创建
                // 所以,我们只能在 nextTick 里面初始化 UEditor
                this.$nextTick(() => {
                    this.instance = window.UE.getEditor(this.randomId, this.ueditorConfig);
                    // 绑定事件,当 UEditor 初始化完成后,将编辑器实例通过自定义的 ready 事件交出去
                    this.instance.addListener('ready', () => {
                        this.$emit('ready', this.instance);
                    });
                });
            }
        }
    }
};
</script>
 
<style>
	.edui-editor {
    	line-height: normal;
	}
</style>

在使用页面

import Editor from '你的component路径/Editor.vue'

使用代码:

<!--html片段 -->
<el-form-item label="奖品说明" prop="description" :error="prize.errors.description">
     <editor @ready="editorReady" :ueditorStyle="ueditorStyle">            
     </editor>
</el-form-item>
 
<!-- script片段 -->
 
import Editor from '你的component路径/Editor.vue'
export default {
    data(){
        return {
            ueditorStyle: {//ueditor样式
              width: '100%',
              height: '200px'
            },
        }
    },
    components:{
        Editor
    },
    methods:{
      editorReady (editor) {//保存ueditor内容
        this.editor = editor
        if (this.$router.currentRoute.params.id > 0) this.fetch()
        editor.addListener('afterAutoSave', () => {
          this.prize.data.description = editor.getContent()
        })
      },
    },
}
 
 
<!-- 注意点 -->
this.editor.setContent(编辑框内的数据)//设置ueditor框内内容,在编辑时使用

vue项目使用ueditor指南

基本使用

1.下载资源包

因为ueditor在npm上暂无官方依赖包,因此需要先到官网下载文件包,我下载的是jsp版本的

2.引入依赖文件

将下载后的文件夹命名为UE,并放入到项目static文件夹中,然后再main.js引入依赖文件(我这里是全局引入,也可以再使用的组件中引入);

import '../static/UE/ueditor.config.js'
import '../static/UE/ueditor.all.min.js'
import '../static/UE/lang/zh-cn/zh-cn.js'
import '../static/UE/ueditor.parse.min'

3.初始化ueditor

我这里是单独将ueditor抽成一个组件,因此初始化时的id和配置都是从父组件传入的。定义组件:

<template>
  <div>
    <script :id=id type="text/plain"></script>
  </div>
</template>
<script>
export default {
  name: 'UE',
  data () {
    return {
      editor: null
    }
  },
  props: {
    config: {
      type: Object
    },
    id: {
      type: String
    },
    content: {
      type: String
    }
  },
  mounted () {
    this._initEditor()
  },
  methods: {
    _initEditor () { // 初始化
      this.editor = UE.getEditor(this.id,this.config)
    },
    getUEContent () { // 获取含标签内容方法
      return this.editor.getContent()
    }
  },
  destroyed () {
    this.editor.destroy()
  }
</script>

4.使用组件:

(1).通过import引入定义好的组件;

import UE from '@/components/ueditor/ueditor.vue'

(2).在对应的位置使用组件

<el-form-item label="文章内容" prop="articleContent">
  <UE :id=id :config=config  ref="ue"></UE>
</el-form-item>

(3).在父组件的data中定义初始化配置

// 初始化Ueditor配置参数
      config: {
        initialFrameWidth: null,
        initialFrameHeight: 300
      },
      id: 'container',// 不同编辑器必须不同的id

(4).在父组件中获取编辑器内容

// 获取富文本内容
    getEdiotrContent () {
      let content = this.$refs.ue.getUEContent() // 调用子组件方法
      this.articleData.articleContent = content
    }

使用配置

如果需要使用到图片上传功能就需要进行在资源文件ueditor.config.js中正确配置资源路径和图片上传路径

资源加载路径:window.UEDITOR_HOME_URL = "/static/UE/";

文件上传路径:serverUrl: 后台接口地址

跳坑心得

1.开发环境正常使用,但生产环境样式文件未加载,编辑器无法正常显示,图片上传功能无法使用

(1)样式文件未加载

在开发环境我配置的资源路径是:window.UEDITOR_HOME_URL = "/static/UE/";

但当我发布到生产环境时样式完全乱了。

—— 这是因为我代码不是直接放在服务器根目录,而是下级文件夹中,因此资源文件无法正确加载,因为需要开发环境和生产环境配置不同的window.UEDITOR_HOME_URL,当然如果代码放在根目录,此处无需修改

(2)图片上传无法使用

—— 这是因为的在开发环境上传路径做了代理,而static文件不会被打包压缩,在生产环境请求路径就不对。

以上两个问题,我做了如下配置:

  var serverapi = '';
  if (process.env.node_ENV === "production" || process.env.NODE_ENV === "productionTest") { // 生产/测试环境
    window.UEDITOR_HOME_URL = "/newconsole/modules/static/UE/";
    serverApi = "/newconsole/static/UE/config/getConfig"
  }else { // 开发环境
    window.UEDITOR_HOME_URL = "/static/UE/";
    serverApi = "/api/static/UE/config/getConfig"
  }
 
  var URL = window.UEDITOR_HOME_URL || getUEBasePath();
     
    window.UEDITOR_CONFIG = {
 
        //为编辑器实例添加一个路径,这个不能被注释
        UEDITOR_HOME_URL: URL,
        // 服务器统一请求接口路径
        serverUrl: serverApi
      }

这样就可以很好的兼任开发环境和生产环境。

2.编辑器内容过多时,会将编辑器撑开拉长,体验不好

这个问题处理就比较简单了,只需要在ueditor.config.js文件中修改autoHeightEnabled:false 即可,这样如果内容过多时就会出现滚动条,而不会撑开编辑器。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 在vue中完美使用ueditor组件(cdn)解读

本文链接: https://lsjlt.com/news/178300.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 在vue中完美使用ueditor组件(cdn)解读
    目录vue使用ueditor组件(cdn)vue项目使用ueditor指南基本使用使用配置跳坑心得总结vue使用ueditor组件(cdn) 前言:无需main.js或页面全局或局部...
    99+
    2023-01-28
    vue使用ueditor组件 vue ueditor组件 vue ueditor
  • 如何在vue项目中使用UEditor--plus
    目录1:UEditor-plus富文本编辑器如何在vue项目中使用2.使用方法3.运行项目1:UEditor-plus富文本编辑器如何在vue项目中使用 备注:UEditor是由百度...
    99+
    2024-04-02
  • Vue中使用Ueditor的示例详解
    目录一、下载Ueditor包 二、编译下载文件 三、在Vue项目中引用一、下载Ueditor包  官网地址:http://fex.baidu.com/u...
    99+
    2024-04-02
  • TypeScript在vue中的使用解读
    目录1. 父传子 defineProps2. 子传父 defineEmits3. ref和computed4. 事件处理 ($event)5. Template Ref6. 可选链操...
    99+
    2023-02-08
    TypeScript vue vue使用TypeScript 使用TypeScript
  • 详细解读VUE父子组件的使用
    目录1.递归组件2.组件之间的循环使用二,深层次的问题**1.父传子****2.子传父***3.兄弟关系** 4.子组件复用5.父组件通过ref调用子组件的方法我们对父子组...
    99+
    2023-05-19
    VUE 组件 VUE父子组件
  • 如何在vue中使用ant-design-vue组件
    目录在vue中使用ant-design-vue组件1. 安装2. 引入组件库3. 使用3.1 按钮样式3.2 导航栏样式3.3 表单样式在vue中使用ant-design-vue组件...
    99+
    2023-01-29
    vue使用ant-design-vue组件 ant-design-vue组件
  • 如何在vue中使用backtop组件
    如何在vue中使用backtop组件?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。代码:<template> <div class=&qu...
    99+
    2023-06-14
  • keep-alive组件怎么在Vue中使用
    这篇文章将为大家详细讲解有关keep-alive组件怎么在Vue中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 一、keep-alive 用法< keep-alive> 包...
    99+
    2023-06-14
  • vue activated在子组件中如何使用
    本篇内容介绍了“vue activated在子组件中如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!页面:base:<templ...
    99+
    2023-06-25
  • 完美解决go Fscanf 在读取文件时出现的问题
    先要明白Fscanf的工作原理 Fscanf在遇到\n才结束 遇到\r时就会把\r替换成0 这就有个问题,要注意自己的文本换行符是什么,在Windows下就是\r\n,在Lin...
    99+
    2022-06-07
    fscanf GO
  • Vue组件中的父子组件使用
    目录Vue组件中的父子组件父组件向子组件传值子组件向父组件传值Vue父子组件的生命周期总结Vue组件中的父子组件 父组件向子组件传值 父组件通过属性绑定(v-bind:)的形式, 把...
    99+
    2023-01-28
    Vue组件 Vue父子组件 Vue父子组件使用
  • vue在组件中使用v-model的场景
    目录一、使用场景二、V-Model的本质三、关键步骤1. props 的使用2. $emit 的使用3. 关键的 model四、不使...
    99+
    2024-04-02
  • vue activated在子组件中的使用详情
    页面:base: <template> <div class="tab-container"> <h1 style="text-ali...
    99+
    2024-04-02
  • vue中router-view组件的使用详解
    在开发vue项目中经常需要实现一个页面里面可以切换着展现不同的组件页面 例如:下图中通过点击侧边栏不同的组件路由到不同的组件页,而侧边栏和顶部部分是不变的,切换的只是组件页面。 这...
    99+
    2024-04-02
  • 如何使用FileReader创建Vue文件阅读器组件
    这篇文章主要介绍“如何使用FileReader创建Vue文件阅读器组件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用FileReader创建Vue文件阅读器组件”文章能帮助大家解决问题。Fi...
    99+
    2023-07-04
  • 怎么在vue组件中使用全局变量
    在vue组件中使用全局变量的方法:1.新建vue.js项目;2.使用export方法定义全局变量;3.使用Vue.prototype方法挂载全局变量;4.使用this调用全局变量;具体步骤如下:首先,在vue-cli中创建一个vue.js项...
    99+
    2024-04-02
  • 如何在Vue CLI中使用自定义组件
    在Vue.js框架下,使用自定义组件能够大大提高项目的开发效率。Vue CLI是一个基于Vue.js快速搭建项目的脚手架工具,Vue CLI的快速开发流程便于开发人员更快速地搭建项目。本篇文章将介绍如何在Vue CLI中使用自定义组件。一、...
    99+
    2023-05-14
  • Vue提示框组件vue-notification使用详解
    先看下演示效果: 安装方法:通过 npm install vue-notification 就能使用了。 导入方法: import Notifications from 'vue-...
    99+
    2023-03-20
    Vue提示框vue notification Vue提示框组件
  • Vue中如何使用component组件
    Vue中如何使用component组件,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 内置的组件component场...
    99+
    2024-04-02
  • Vue中如何使用header组件
    这期内容当中小编将会给大家带来有关Vue中如何使用header组件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、 header 组件开发 之数据的传递1. App.v...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作