当前位置: 首页 > 知识库问答 >
问题:

javascript - wangEditor @mention提及插件 有没有vue3完整写法 demo?

有玄天
2023-06-17

wangEditor @mention提及插件 有没有vue3完整写法 demo?

共有1个答案

倪棋
2023-06-17

用的tinymce觉得还可以,网上案例也都一堆

<template>
    <editor v-model="myValue" :init="init" :disabled="disabled" :id="tinymceId"></editor>
</template>
<script lang="ts">
    export default {
        name: 'TEditor'
    };
</script>
<script setup lang="ts">
    //JS部分
    //在js中引入所需的主题和组件tinymce/skins/content/default/content.css
    import tinymce from 'tinymce/tinymce';
    import 'tinymce/skins/content/default/content.css';
    import Editor from '@tinymce/tinymce-vue';
    import 'tinymce/themes/silver';
    import 'tinymce/themes/silver/theme';
    import 'tinymce/icons/default'; //引入编辑器图标icon,不引入则不显示对应图标
    import 'tinymce/models/dom'; // 这里是个坑 一定要引入

    //在TinyMce.vue中接着引入相关插件
    import 'tinymce/plugins/link'; //超链接插件
    import 'tinymce/icons/default/icons';
    import 'tinymce/plugins/image'; // 插入上传图片插件
    import 'tinymce/plugins/media'; // 插入视频插件
    import 'tinymce/plugins/table'; // 插入表格插件
    import 'tinymce/plugins/lists'; // 列表插件
    import 'tinymce/plugins/wordcount'; // 字数统计插件
    import 'tinymce/plugins/code'; // 源码
    import 'tinymce/plugins/fullscreen'; //全屏

    //接下来定义编辑器所需要的插件数据
    import { reactive, ref } from 'vue';
    import { onMounted, defineEmits, watch } from '@vue/runtime-core';
    const emits = defineEmits(['getContent']);
    //这里我选择将数据定义在props里面,方便在不同的页面也可以配置出不同的编辑器,当然也可以直接在组件中直接定义
    const props = defineProps({
        value: {
            type: String,
            default: () => {
                return '';
            }
        },
        baseUrl: {
            type: String,
            default: ''
        },
        disabled: {
            type: Boolean,
            default: false
        },
        plugins: {
            type: [String, Array],
            default: 'table lists'
        }, //必填
        toolbar: {
            type: [String, Array],
            default:
                'codesampl  bold link italic underline alignleft aligncenter alignright alignjustify | undo redo | formatselect | fontselect | fontsizeselect | forecolor backcolor | bullist numlist outdent indent | lists link table code | removeformat | image media | fullscreen'
        } //必填
    });
    const plugins = ['table ', 'image ', 'link', 'fullscreen', 'lists', 'wordcount'];
    const toolbar = [
        'cancel searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent  blockquote undo redo removeformat subscript superscript code codesample fontsize',
        'hr bullist numlist link image charmap preview anchor pagebreak insertdatetime  table emoticons forecolor backcolor fontfamily styles fullscreen'
    ];
    //用于接收外部传递进来的富文本
    const myValue = ref(props.value);
    const tinymceId = ref('vue-tinymce-' + +new Date() + ((Math.random() * 1000).toFixed(0) + ''));
    //定义一个对象 init初始化
    const init = reactive({
        // selector: '#' + tinymceId.value, //富文本编辑器的id,
        base_url: '/tinymce',
        language_url: '/tinymce/langs/zh-Hans.js', // 语言包的路径,具体路径看自己的项目,文档后面附上中文js文件
        language: 'zh-Hans', //语言
        skin_url: '/tinymce/skins/ui/oxide', // skin路径,具体路径看自己的项目
        height: 340, //编辑器高度
        branding: false, //是否禁用“Powered by TinyMCE”
        elementpath: false,
        menubar: false, //顶部菜单栏显示
        image_dimensions: false, //去除宽高属性
        plugins: plugins, //这里的数据是在props里面就定义好了的
        toolbar: toolbar, //这里的数据是在props里面就定义好了的
        images_reuse_filename: true, //  使用图片本身的名称
        font_formats: 'Arial=arial,helvetica,sans-serif; 宋体=SimSun; 微软雅黑=Microsoft Yahei; Impact=impact,chicago;', //字体
        fontsize_formats: '11px 12px 14px 16px 18px 24px 36px 48px 64px 72px', //文字大小
        // paste_convert_word_fake_lists: false, // 插入word文档需要该属性
        paste_webkit_styles: 'all',
        paste_merge_formats: true,
        paste_data_images: true, // 允许粘贴图像
        nonbreaking_force_tab: false,
        paste_auto_cleanup_on_paste: false,
        file_picker_types: 'file',
        content_css: '/tinymce/skins/content/default/content.css', //以css文件方式自定义可编辑区域的css样式,css文件需自己创建并引入
        style_formats: [
            {
                title: '首行缩进',
                block: 'p',
                styles: { 'text-indent': '2em' }
            },
            {
                title: 'Headings',
                items: [
                    { title: 'Heading 1', format: 'h1' },
                    { title: 'Heading 2', format: 'h2' },
                    { title: 'Heading 3', format: 'h3' },
                    { title: 'Heading 4', format: 'h4' },
                    { title: 'Heading 5', format: 'h5' },
                    { title: 'Heading 6', format: 'h6' }
                ]
            },
            {
                title: 'Inline',
                items: [
                    { title: 'Bold', format: 'bold' },
                    { title: 'Italic', format: 'italic' },
                    { title: 'Underline', format: 'underline' },
                    { title: 'Strikethrough', format: 'strikethrough' },
                    { title: 'Superscript', format: 'superscript' },
                    { title: 'Subscript', format: 'subscript' },
                    { title: 'Code', format: 'code' }
                ]
            },
            {
                title: 'Blocks',
                items: [
                    { title: 'Paragraph', format: 'p' },
                    { title: 'Blockquote', format: 'blockquote' },
                    { title: 'Div', format: 'div' },
                    { title: 'Pre', format: 'pre' }
                ]
            },
            {
                title: 'Align',
                items: [
                    { title: 'Left', format: 'alignleft' },
                    { title: 'Center', format: 'aligncenter' },
                    { title: 'Right', format: 'alignright' },
                    { title: 'Justify', format: 'alignjustify' }
                ]
            }
        ]
    });

    //监听外部传递进来的的数据变化
    watch(
        () => props.value,
        () => {
            myValue.value = props.value;
            emits('getContent', myValue.value);
        }
    );
    //监听富文本中的数据变化
    watch(
        () => myValue.value,
        () => {
            emits('getContent', myValue.value);
        }
    );
    //在onMounted中初始化编辑器
    onMounted(() => {
        tinymce.init({});
    });
</script>

//详细插件列表请参见https://www.tinymce.com/docs/plugins/
//自定义生成请参见https://www.tinymce.com/download/custom-builds/

 类似资料:
  • 问题内容: 我有一个按24x6时间表运行的应用程序。当前,运行几天后,会自动执行Full GC(通常在一天中的繁忙时间),这会对用户响应时间产生负面影响。 我想做的是强制使用Full GC(也许是在每晚的午夜,在非常短的使用时间内),以防止它在白天发生。我已经尝试过System.gc(),但是它似乎无法保证何时会发生Full GC,甚至不会发生。有这样做的方法吗? 版本信息: Java™SE运行时

  • 问题内容: 有没有一种方法可以在目录上使用glob来获取具有特定扩展名的文件,而只能获取文件名本身,而不是整个路径? 问题答案: 使用来获取文件名。

  • 要求如下 支持文字水印 支持本地图片作为水印 支持本地图片+文字 作为水印 支持文字颜色/字体 支持水印宽高 支持水印显隐 支持水印透明度 支持水印渲染节点配置 支持水印在画布上绘制的水平和垂直偏移量

  • 问题内容: 我有一个学校项目,可以解析网络代码并将其像数据库一样使用。当我尝试从(https://www.marathonbet.com/en/betting/Football/)提取数据时,我没有全部了解吗? 这是我的代码: 获得的结果(这是显示的联赛的最后一个): 在她上面显示所有联赛。 为什么我没有完整的数据?感谢您的时间! 问题答案: Jsoup的默认正文响应限制为1MB。您可以使用 ma

  • 我正在使用Volley向API发出GET请求: 预期的JSON对象响应很大(可能高达500 KB)。我无法在日志中看到完整的响应。仅显示前50行左右。我还得到了info: BasicNetwork.log慢速请求:请求的HTTP响应= 这意味着请求需要超过3000毫秒。 尝试过的事情: 我已经在手机的开发者选项中将记录器缓冲区大小增加到1M。 原因可能是什么?当它很大的时候,响应是大块发送的吗?如

  • 我能够从赫尔辛基MOOC课程中弄清楚这个项目,但我认为有一种更干净、更容易阅读的方式来写它。目标是打印出: