最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue使用wangEditor?5富文本編輯器步驟及可能遇到的問題

 更新時間:2025年09月06日 15:44:04   作者:夏う沫  
在數(shù)字化的今天,無論是內(nèi)容創(chuàng)作還是日常辦公,一款強大易用的富文本編輯器都是必不可少的工具,wangEditor 5正是這樣的一款開源編輯器,這篇文章主要介紹了Vue使用wangEditor?5富文本編輯器步驟及可能遇到問題的相關(guān)資料,需要的朋友可以參考下

安裝

yarn add @wangeditor/editor
# 或者 npm install @wangeditor/editor --save

yarn add @wangeditor/editor-for-vue@next
# 或者 npm install @wangeditor/editor-for-vue@next --save

官網(wǎng):用于 Vue React | wangEditor

使用

1. 在script中引入css樣式和組件

import '@wangeditor/editor/dist/css/style.css' // 引入 css
import { Editor, Toolbar } from '@wangeditor/editor-for-vue' //引入組件

2. 在template中使用組件

<template>
    <div style="border: 1px solid #ccc">
      <!-- 工具欄 -->
      <Toolbar
        style="border-bottom: 1px solid #ccc"
        :editor="editorRef"
        :defaultConfig="toolbarConfig"
        mode="default"
      />
      <!-- 編輯器 -->
      <Editor
        style="height: 500px; overflow-y: hidden;"
        v-model="valueHtml"
        :defaultConfig="editorConfig"
        mode="default"
        @onCreated="handleCreated"
      />
    </div>
</template>

3. 初始化編輯器

// 編輯器實例,必須用 shallowRef
const editorRef = shallowRef()

// 內(nèi)容 HTML
const valueHtml = ref('<p>hello</p>')

// 工具欄配置
const toolbarConfig = {}
// 編輯器配置
const editorConfig = { placeholder: '請輸入內(nèi)容...' }

const handleCreated = (editor) => {
    editorRef.value = editor // 記錄 editor 實例,重要!
}

// 組件銷毀時,也及時銷毀編輯器
onBeforeUnmount(() => {
  const editor = editorRef.value;
  if (editor == null) return;
  editor.destroy();
});

使用效果

4. 工具欄配置

// 工具欄配置
const toolbarConfig = {
  // 隱藏全屏、視頻
  excludeKeys: ['fullScreen', 'group-video']
};

5. 編輯器配置

// 編輯器配置
const editorConfig = {
  placeholder: '請輸入內(nèi)容...',
  // 能否編輯
  readOnly: true,
  // 菜單設置
  MENU_CONF: {
    // 上傳圖片設置
    uploadImage: {
      // 自定義插入圖片
      async customUpload(file: File, insertFn) {
        try {
          let formData = new FormData();
          formData.append('file', file);

          //獲取上傳圖片地址
          const data = await postFileUpload(formData);
          // 從 res 中找到 url alt href ,然后插入圖片
          insertFn(data, '', data);
        } catch (error) {
          console.log(error);
        }
      },
    },
  },
};

使用過程中的問題

1. 獲取工具欄的key值

官網(wǎng)教程獲取工具的key,說是toolbar.getConfig().toolbarKeys

但是我通過打印editorRef.value.getConfig().toolbarKeys,卻是undefined

最后是通過檢查html元素查到的key值

2. 全局樣式覆蓋,導致編輯器內(nèi)容樣式失效

項目中有給h1、h2、h3、h4....等元素設置默認font-size font-weight

在項目中單獨設置font-size:initial font-weight:initial,都不生效

最后是賦值font-size:revert font-weight:revert,才解決

revert表示恢復為瀏覽器默認值

h1 {
  font-size: 2em;
  font-weight: revert; /* 恢復為瀏覽器默認字體粗細 */
}
h2,
h3,
h4,
h5,
h6,
p {
  font-size: revert; /* 恢復為瀏覽器默認字體大小 */
  font-weight: revert; /* 恢復為瀏覽器默認字體粗細 */
}

ul {
  list-style-type: disc;
}

完整文件

<template>
  <div class="rizhi">
    <div style="padding: 5px">
      <a-button
        style="margin: 0 5px"
        type="primary"
        :loading="saveLoading"
        @click="onSave"
        v-if="isEdit"
        >
        保存
      </a-button>
      <a-button
        style="margin: 0 5px"
        type="primary"
        @click="onEdit"
        v-else-if="!isEdit"
        >
        編輯
      </a-button>
    </div>
    <div class="edit">
      <Toolbar
        style="border-bottom: 1px solid #ccc"
        :editor="editorRef"
        :defaultConfig="toolbarConfig"
        mode="default"
        />
      <Editor
        :style="{ height: tabViewContentHeight + 'px' }"
        v-model="valueHtml"
        :defaultConfig="editorConfig"
        mode="default"
        @onCreated="handleCreated"
        />
    </div>
  </div>
</template>
<script lang="tsx">
  export default {
    name: 'xxxx',
  };
</script>
<script lang="tsx" setup>
  import '@wangeditor/editor/dist/css/style.css'; // 引入 css
  import { computed, onMounted, onBeforeUnmount, ref, shallowRef } from 'vue';
  import { Editor, Toolbar } from '@wangeditor/editor-for-vue';

  // 判斷是保存還是編輯
  const isEdit = ref(false);

  // 編輯器實例,必須用 shallowRef
  const editorRef = shallowRef();

  // 內(nèi)容 HTML
  const valueHtml = ref('');

  // 工具欄配置
  const toolbarConfig = {
    excludeKeys: ['fullScreen', 'group-video'],
  };

  // 編輯器配置
  const editorConfig = {
    placeholder: '請輸入內(nèi)容...',
    readOnly: true,
    MENU_CONF: {
      uploadImage: {
        // 自定義插入圖片
        async customUpload(file: File, insertFn) {
          try {
            let formData = new FormData();
            formData.append('file', file);
            
            const data = 	'/xx/xx'		//await 上傳圖片接口(formData);
            // 從 res 中找到 url alt href ,然后插入圖片
            insertFn(data, '', data);

            // 上傳圖片后,得保存
            imageList1.push(data);
          } catch (error) {
            console.log(error);
          }
        },
      },
    },
  };

  // 初始化編輯器
  const handleCreated = (editor) => {
    editorRef.value = editor; // 記錄 editor 實例,重要!
  };

  // 保存
  const saveLoading = ref(false);

  // 初始圖片
  let imageList1: any = [];
  // 修改后圖片
  let imageList2: any = [];
  const onSave = async () => {
    try {
      saveLoading.value = true;

      let deleteImageList: any = [];
      // 保存時先刪除圖片
      imageList2 = editorRef.value.getElemsByType('image').map((item) => item.src);

      imageList1.forEach((item) => {
        if (!imageList2.includes(item)) {
          deleteImageList.push(item);
        }
      });

      if (deleteImageList.length !== 0) {
        // 刪除圖片接口
        //await 刪除圖片接口();
      }

      // 再保存
      //await 保存接口();
      //await 刷新接口();
      
      editorRef.value.disable();
      isEdit.value = false;
      messageSucc('保存成功');
    } catch (error) {}

    saveLoading.value = false;
  };

  const onEdit = () => {
    isEdit.value = true;
    editorRef.value.enable();
  };

//獲取遠程數(shù)據(jù)
  const getList = async () => {
    try {
      const res = ''	//await 獲取數(shù)據(jù)接口();
      valueHtml.value = res.updateExplanation;

      setTimeout(() => {
        // 獲取初始圖片
        imageList1 = editorRef.value.getElemsByType('image').map((item) => item.src);
      }, 0);
    } catch (error) {}
  };

  onMounted(async () => {
    await getList();
  });

  // 組件銷毀時,也及時銷毀編輯器
  onBeforeUnmount(() => {
    const editor = editorRef.value;
    if (editor == null) return;
    editor.destroy();
  });
</script>

<style lang="less" scoped>
  .rizhi {
    background-color: #fff;
    display: flex;
    flex-direction: column;
    .rizhiHtml {
      border: 1px solid #ccc;
      overflow-y: scroll;
      padding: 5px;
      flex: 1;
    }

    .edit {
      border: 1px solid #ccc;
    }
  }

  :deep(.w-e-text-container) {
    h1 {
      font-size: 2em;
      font-weight: revert; /* 恢復為瀏覽器默認字體粗細 */
    }
    h2,
    h3,
    h4,
    h5,
    h6,
    p {
      font-size: revert; /* 恢復為瀏覽器默認字體大小 */
      font-weight: revert; /* 恢復為瀏覽器默認字體粗細 */
    }

    ul {
      list-style-type: disc;
    }
  }
</style>

總結(jié) 

到此這篇關(guān)于Vue使用wangEditor 5富文本編輯器步驟及可能遇到的問題的文章就介紹到這了,更多相關(guān)Vue使用wangEditor5富文本編輯器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • uniapp+Vue實現(xiàn)App端用戶每日彈出簽到彈窗功能

    uniapp+Vue實現(xiàn)App端用戶每日彈出簽到彈窗功能

    用戶簽到這個功能是很多APP、小程序等都具備的,也是其成長體系中的重要環(huán)節(jié),這篇文章主要介紹了uniapp+Vue實現(xiàn)App端用戶每日彈出簽到彈窗功能的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2026-05-05
  • Vue + Element-ui的下拉框el-select獲取額外參數(shù)詳解

    Vue + Element-ui的下拉框el-select獲取額外參數(shù)詳解

    這篇文章主要介紹了Vue + Element-ui的下拉框el-select獲取額外參數(shù)詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • vue循環(huán)中調(diào)用接口-promise.all();按順序執(zhí)行異步處理方式

    vue循環(huán)中調(diào)用接口-promise.all();按順序執(zhí)行異步處理方式

    這篇文章主要介紹了vue循環(huán)中調(diào)用接口-promise.all();按順序執(zhí)行異步處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Vue解決ajax跨域的問題

    Vue解決ajax跨域的問題

    這篇文章主要介紹了Vue解決ajax跨域的問題,跨域請求:是指協(xié)議名、主機名、端口號三者有任何一個不一樣,而且跨域請求是請求發(fā)出去了,服務器接收并返回了結(jié)果,只是瀏覽器沒有接收響應結(jié)果。感興趣的同學可以參考閱讀
    2023-04-04
  • vant之關(guān)于van-list的使用以及一些坑的解決方案

    vant之關(guān)于van-list的使用以及一些坑的解決方案

    這篇文章主要介紹了vant之關(guān)于van-list的使用以及一些坑的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 詳解Vue計算屬性原理

    詳解Vue計算屬性原理

    計算屬性是Vue中比較好用的API,開發(fā)者可以利用計算屬將復雜的計算進行緩存,同時基于它的響應式特性,我們無需關(guān)注數(shù)據(jù)更新問題,但需要注意的是,計算屬性是惰性求值的,本文將詳細介紹計算屬性的實現(xiàn)原理,需要的朋友可以參考下
    2023-05-05
  • vuex實現(xiàn)的簡單購物車功能示例

    vuex實現(xiàn)的簡單購物車功能示例

    這篇文章主要介紹了vuex實現(xiàn)的簡單購物車功能,結(jié)合實例形式分析了vuex購物車組件相關(guān)商品列表、購物車創(chuàng)建、添加、刪除、清空等相關(guān)操作技巧,需要的朋友可以參考下
    2019-02-02
  • 基于vuex實現(xiàn)購物車功能

    基于vuex實現(xiàn)購物車功能

    這篇文章主要為大家詳細介紹了基于vuex實現(xiàn)購物車功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • 解決vue路由發(fā)生了跳轉(zhuǎn)但是界面沒有任何反應問題

    解決vue路由發(fā)生了跳轉(zhuǎn)但是界面沒有任何反應問題

    這篇文章主要介紹了解決vue路由發(fā)生了跳轉(zhuǎn)但是界面沒有任何反應問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • vue-cli 3.0 引入mint-ui報錯問題及解決

    vue-cli 3.0 引入mint-ui報錯問題及解決

    這篇文章主要介紹了vue-cli 3.0 引入mint-ui報錯問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05

最新評論

偏关县| 沙雅县| 东乡县| 洛南县| 马公市| 酒泉市| 苍溪县| 原平市| 靖边县| 贵南县| 奉新县| 许昌市| 磐石市| 龙门县| 南城县| 商丘市| 贵港市| 绥中县| 蓬莱市| 陆川县| 大足县| 和林格尔县| 石河子市| 乌拉特中旗| 克拉玛依市| 合水县| 阿瓦提县| 洛浦县| 河津市| 宜丰县| 昌江| 清镇市| 蕲春县| 彰化县| 石屏县| 商洛市| 兖州市| 信宜市| 广德县| 古浪县| 方城县|