vue3+ts json编辑器

//下载插件

   "monaco-editor": "^0.30.1",

   "monaco-editor-webpack-plugin": "^6.0.0"



    yarn add monaco-editor@0.30.1

    yarn add monaco-editor-webpack-plugin@6.0.0
src目录下创建 shims-vue.d.ts (ts的话需要创建该文件,不然会报模块引入错误)

//记得在env.d.ts配置包的
declare module 'monaco-editor';
declare module 'monaco-editor/esm/vs/language/typescript/ts.worker?worker'
declare module 'monaco-editor/esm/vs/basic-languages/sql/sql.js';
declare module 'monaco-editor/esm/vs/basic-languages/yaml/yaml.js';
declare module 'monaco-editor/esm/vs/language/json/json.worker?worker'
declare module 'monaco-editor/esm/vs/language/css/css.worker?worker'
declare module 'monaco-editor/esm/vs/language/html/html.worker?worker'
declare module 'monaco-editor/esm/vs/editor/editor.worker?worker'
declare module 'monaco-editor/esm/vs/basic-languages/javascript/javascript.js'

创建组件文件 monacoEditor.vue

<template>
  <div ref="codeEditBox" class="codeEditBox" :class="hightChange && 'codeEditBox1'" />
</template>
<script lang="ts">
import { defineComponent, onBeforeUnmount, onMounted, ref, watch } from "vue";
import * as monaco from "monaco-editor";
import { language as sqlLanguage } from "monaco-editor/esm/vs/basic-languages/sql/sql.js";
import { language as yamlLanguage } from "monaco-editor/esm/vs/basic-languages/yaml/yaml.js";
import "monaco-editor/esm/vs/basic-languages/sql/sql.contribution";
import "monaco-editor/esm/vs/basic-languages/yaml/yaml.contribution";
import "monaco-editor/esm/vs/basic-languages/javascript/javascript.contribution";
import { editorProps } from "./monacoEditorType";
// import JsonWorker from "monaco-editor/esm/vs/language/json/json.worker?worker";
// import CssWorker from "monaco-editor/esm/vs/language/css/css.worker?worker";
// import HtmlWorker from "monaco-editor/esm/vs/language/html/html.worker?worker";
// import TsWorker from "monaco-editor/esm/vs/language/typescript/ts.worker?worker";
// import EditorWorker from "monaco-editor/esm/vs/editor/editor.worker?worker";

// import * as monaco from "monaco-editor";
// import { language as sqlLanguage } from "monaco-editor/esm/vs/basic-languages/sql/sql.js";
// import { language as yamlLanguage } from "monaco-editor/esm/vs/basic-languages/yaml/yaml.js";
// import "monaco-editor/esm/vs/basic-languages/sql/sql.contribution";
// import { editorProps } from "./monacoEditorType";

export default defineComponent({
  name: "MonacoEditor",
  props: editorProps,
  emits: ["update:modelValue", "change", "editor-mounted"],
  setup(props, { emit }) {
    (self as any).MonacoEnvironment = {
      getWorker: (_: string, label: string) => {
        const getWorkerModule = (moduleUrl: string, label: string) =>
          new Worker((self as any).MonacoEnvironment.getWorkerUrl(moduleUrl), {
            name: label,
            type: "module",
          });

        switch (label) {
          case "json":
            return getWorkerModule(
              "/monaco-editor/esm/vs/language/json/json.worker?worker",
              label
            );
          case "css":
          case "scss":
          case "less":
            return getWorkerModule(
              "/monaco-editor/esm/vs/language/css/css.worker?worker",
              label
            );
          case "html":
          case "handlebars":
          case "razor":
            return getWorkerModule(
              "/monaco-editor/esm/vs/language/html/html.worker?worker",
              label
            );
          case "typescript":
          case "javascript":
            return getWorkerModule(
              "/monaco-editor/esm/vs/language/typescript/ts.worker?worker",
              label
            );
          default:
            return getWorkerModule(
              "/monaco-editor/esm/vs/editor/editor.worker?worker",
              label
            );
        }
      },

      //   getWorker(_: string, label: string) {
      //     if (label === "json") {
      //       return new JsonWorker();
      //     }
      //     if (["css", "scss", "less"].includes(label)) {
      //       return new CssWorker();
      //     }
      //     if (["html", "handlebars", "razor"].includes(label)) {
      //       return new HtmlWorker();
      //     }
      //     if (["typescript", "javascript"].includes(label)) {
      //       return new TsWorker();
      //     }
      //     return new EditorWorker();
      //   },
    };
    let editor: any;
    const codeEditBox = ref();

    const init = () => {
      monaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions({
        noSemanticValidation: true,
        noSyntaxValidation: false,
      });
      monaco.languages.typescript.javascriptDefaults.setCompilerOptions({
        target: monaco.languages.typescript.ScriptTarget.ES2020,
        allowNonTsExtensions: true,
      });
      monaco.languages.registerCompletionItemProvider("sql", {
        provideCompletionItems() {
          const suggestions: any = [];
          // 这个keywords就是sql.js文件中有的
          sqlLanguage.keywords.forEach((item: any) => {
            suggestions.push({
              label: item,
              kind: monaco.languages.CompletionItemKind.Keyword,
              insertText: item,
            });
          });
          sqlLanguage.operators.forEach((item: any) => {
            suggestions.push({
              label: item,
              kind: monaco.languages.CompletionItemKind.Operator,
              insertText: item,
            });
          });
          sqlLanguage.builtinFunctions.forEach((item: any) => {
            suggestions.push({
              label: item,
              kind: monaco.languages.CompletionItemKind.Function,
              insertText: item,
            });
          });
          sqlLanguage.builtinVariables.forEach((item: any) => {
            suggestions.push({
              label: item,
              kind: monaco.languages.CompletionItemKind.Variable,
              insertText: item,
            });
          });
          return {
            // 最后要返回一个数组
            suggestions,
          };
        },
      });
      monaco.languages.registerCompletionItemProvider("yaml", {
        provideCompletionItems() {
          const suggestions: any = [];
          // 这个keywords就是python.js文件中有的
          yamlLanguage.keywords.forEach((item: any) => {
            suggestions.push({
              label: item,
              kind: monaco.languages.CompletionItemKind.Keyword,
              insertText: item,
            });
          });
          return {
            // 最后要返回一个数组
            suggestions,
          };
        },
      });

      editor = monaco.editor.create(codeEditBox.value, {
        value: props.modelValue,
        language: props.language,
        readOnly: props.readOnly,
        theme: props.theme,
        ...props.options,
      });

      // 监听值的变化
      editor.onDidChangeModelContent(() => {
        const value = editor.getValue(); // 给父组件实时返回最新文本
        emit("update:modelValue", value);
        emit("change", value);
      });

      emit("editor-mounted", editor);
    };
    watch(
      () => props.modelValue,
      (newValue) => {
        if (editor) {
          const value = editor.getValue();
          if (newValue !== value) {
            editor.setValue(newValue);
          }
        }
      }
    );

    watch(
      () => props.options,
      (newValue) => {
        editor.updateOptions(newValue);
      },
      { deep: true }
    );
    watch(
      () => props.readOnly,
      () => {
        console.log("props.readOnly", props.readOnly);
        editor.updateOptions({ readOnly: props.readOnly });
      },
      { deep: true }
    );

    watch(
      () => props.language,
      (newValue) => {
        monaco.editor.setModelLanguage(editor.getModel()!, newValue);
      }
    );

    onBeforeUnmount(() => {
      editor.dispose();
    });

    onMounted(() => {
      init();
    });

    return { codeEditBox };
  },
});
</script>
<style scoped>
.codeEditBox {
  height: 300px;
  width: 100%;
  flex: 1;
  min-height: 100px;
  overflow-y: auto;
}
.codeEditBox1 {
  height: calc(100% - 323px);
}
</style>

创建组件实现方法ts monacoEditorType.ts

import { PropType } from 'vue'
export type Theme = 'vs' | 'hc-black' | 'vs-dark'
export type FoldingStrategy = 'auto' | 'indentation'
export type RenderLineHighlight = 'all' | 'line' | 'none' | 'gutter'
export interface Options {
  automaticLayout: boolean // 自适应布局
  foldingStrategy: FoldingStrategy // 折叠方式  auto | indentation
  renderLineHighlight: RenderLineHighlight // 行亮
  selectOnLineNumbers: boolean // 显示行号
  placeholder: string
  minimap: {
    // 关闭小地图
    enabled: boolean
  }
  // readOnly: Boolean // 只读
  fontSize: number // 字体大小
  scrollBeyondLastLine: boolean // 取消代码后面一大段空白
  overviewRulerBorder: boolean // 不要滚动条的边框
}

export const editorProps = {
  modelValue: {
    type: String as PropType<string>,
    default: null,
  },
  hightChange: {
    type: Boolean,
    default: false,
  },
  width: {
    type: [String, Number] as PropType<string | number>,
    default: '100%',
  },
  height: {
    type: [String, Number] as PropType<string | number>,
    default: '100%',
  },
  language: {
    type: String as PropType<string>,
    default: 'javascript',
  },
  readOnly: {
    type: Boolean,
    default: false,
  },
  theme: {
    type: String as PropType<Theme>,
    validator(value: string): boolean {
      return ['vs', 'hc-black', 'vs-dark', 'hc-light'].includes(value)
    },
    default: 'vs',
  },
  options: {
    type: Object as PropType<Options>,
    default() {
      return {
        automaticLayout: true,
        // foldingStrategy: 'indentation',
        foldingStrategy: 'indentation', // 折叠方式  auto | indentation
        // renderLineHighlight: 'all',
        renderLineHighlight: 'all' || 'line' || 'none' || 'gutter', // 行亮
        selectOnLineNumbers: true, // 显示行号
        minimap: {
          // 关闭小地图
          enabled: true,
        },
        placeholder: 'ss',
        // readOnly: false, // 只读
        fontSize: 14, // 字体大小
        scrollBeyondLastLine: false, // 取消代码后面一大段空白
        overviewRulerBorder: false, // 不要滚动条的边框
      }
    },
  },
}
使用方式

import monacoEditor from "/@/components/monaco/monacoEditor.vue";


<monacoEditor
    v-model="formState.tablename"
    :language="language"
    :hight-change="hightChange"
    width="100%"
    height="60%"
    :scrollerHeight="'calc(100% - 280px)'"
    @editor-mounted="editorMounted"
    />


js部分变量声明
const language = ref("json");
const hightChange = ref<any>(false);
const editorMounted = (editor: any) => {
    console.log("editor实例加载完成", editor);
};

实现效果

小白前端1
关注 关注
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
json-editor-vue3 (Json字段编辑器 )
weixin_46022934的博客
09-11 9983
一、安装插件(这里很正常) 二、json-editor-vue3的使用步骤(这里遇到了问题) 1.导入json-editor-vue3 ①:导入json-editor-vue3(问题出现) ②:解决 (无法找到模块的问题) 2.使用json-editor-vue3 ①步骤说明 ②编写代码如下 ③内容如下图所示: 总结: json-editor-vue3的Api说明 全局引入 组件内引入 模板使用 常见参数 对应的事件
基于Vue3+ts+AntV X6实现的流程图编辑器
10-17
基于Vue3+ts+element-plus+AntV X6实现的流程图编辑器,框架核心功能已经搭好,组态化呈现,自定义节点、属性绑定、样式调整等,采用pinia统一管理各个属性,根据自己需求在此基础上自定义调整修改添加等,最终可...
vue3 使用 jsoneditor
曹先森的博客
01-11 1936
vue3 使用 jsoneditor。复制代码放到文件中就能用了。
Vue3-Json-发自:自动化构建编辑功能项目
02-21
建造知乎案例项目 代码美化设置prettierrc 安装prettierrc插件 创建.prettierrc.json文件 一键格式化yarn prettier --write . 目录结构规则 components编写组件 hooks自定义函数 命名规范 首页 数据结构设计利用interface接口定义 富文本框 图片裁剪 cropper
vue3+json-editor-vue3实现JSON编辑器
最新发布
qq_54072355的博客
06-20 1103
开发的vue3 json editor,支持全屏编辑,有完善的事件回调,可以在失去焦点时,对编辑器内容做校验。注:本项目中,按钮样式、成功失败提示,使用了 Ant-Design-Vue,按需安装插件。1. 安装插件 @originjs/vite-plugin-commonjs。四. 关于:vue3+ts无法渲染,报错。2. vite.config.js 内。五. 完整项目代码
VUE3使用JSON编辑器
蓦然回首,那人却在,灯火阑珊处。
03-06 3487
VUE3使用JSON编辑器
Vue3 使用json编辑器
瑾修的博客
08-17 4004
不然会有报错,如jsoneditor does not provide an export named ‘default’。等, 上面示例代码已做部分配置实验,具体可以参考github的配置介绍。json-editor-vue3支持多种配置,如可选模式(多选)main.js 中加入下面代码。
vue3.0中前端怎么使用 JSON编译器
weixin_49826079的博客
07-31 1111
import JsonEditorVue from 'json-editor-vue3' // 导入模块。components: { JsonEditorVue}, // 注册组件。1.安装JSON编辑器,引入第三方插件。//转化成后端所需要的格式。2.在项目中引入该插件。// 转化格式 并展示。// 这是拿到的数据。
vue3+ts实现drag/draggable拖拽任务看板taskboard
07-05
本文将深入探讨如何利用Vue3和ts实现一个具备drag/draggable功能的拖拽任务看板(Taskboard),同时提及与之相关的Gantt图表和JSON编辑器。 首先,Vue3引入了Composition API,它极大地提高了代码的可重用性和可...
vue3+antv x6+tsx 制作自定义流程图
09-23
总而言之,"vue3+antv x6+tsx 制作自定义流程图"项目结合了现代前端技术,旨在创建一个高效、灵活的流程图编辑平台。Vue3提供了优秀的组件化开发体验,AntV X6则带来了强大的图形绘制能力,而TSX则保证了代码的类型...
vite+vue3使用模块化批量发布Mockjs接口
03-29
6. **配置编辑器支持**: `jsconfig.json`和`.vscode`目录下的配置文件可以帮助IDE更好地理解项目结构,提供代码补全和导航功能。 7. **版本控制**: `.gitignore`和`pnpm-lock.yaml`文件则用于管理版本控制和依赖...
vue3-ace-editor前端 json格式化显示 json编辑器使用
键指江湖的博客
11-03 2597
项目目录下打开终端 运行。
vue3中json编辑器
qq_40934617的博客
11-12 6361
vue3的第三方插件 实现json编辑器 安装依赖 npm i vue3-ace-editor 引入 import {reactive,defineComponent} from 'vue' import {VAceEditor} from 'vue3-ace-editor'; import "ace-builds/webpack-resolver"; import 'ace-builds/src-noconflict/mode-json'; import 'ace-build
一个能在vue3中运行的JSON编辑器,能展示JSON数据的高亮,打开时有默认数据
qq_43474780的博客
03-03 1922
JSON编辑器
Vue3 ts 实现JSON编辑器
qq_44883318的博客
04-21 491
1. 将ace-builds/src-min 所有文件复制到自己项目内。本人是放在了目录public/lib/ace 下。2. 下载 vue3-ace-editor。
Vue3【四】集成json-editor-vue3
SpringHASh的博客
11-14 1762
【代码】Vue3集成json-editor-vue3。
tsjson写法和数组元素
m0_62487693的博客
03-29 1631
【代码】tsjson写法和数组元素。
vue 使用JSON 编辑器vue-json-editor
qq_37831545的博客
06-12 6833
vue 使用JSON 编辑器vue-json-editor。
json-editor-vue3 Vue3 json编辑器使用
baidu_38492843的博客
03-27 2923
首先安装json-editor-vue3。在需要引入的index.vue文件中。在main.ts中加入,不加会报错。
vue3+ts 富文本编辑器插件vue-quill-editor使用代码
05-26
在这个例子中,我们引入了 `quill` 的样式文件,并且定义了一个 `content` 变量作为富文本编辑器的内容。 注意,如果你的项目使用了 TypeScript,建议在 `tsconfig.json` 中将 `noImplicitAny` 设置为 `false`,...

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • vue3+ts json编辑器 1562
  • 前端预览插件集合 684
  • 好用的代码编辑器 vue3 606

最新评论

  • vue3+ts json编辑器

    SailingCoder: 下载资源太慢了,这是啥情况

  • vue3+ts json编辑器

    CSDN-Ada助手: 这篇博客非常实用,让我对vue3和ts有了更深入的了解,同时也学到了如何使用json编辑器。希望作者能够继续分享更多的技术文章,让我们一起进步!另外,对于json编辑器的相关知识,我们还可以深入学习json格式、json对象、json数组等内容,同时也可以了解一下类似于XML、YAML等格式化的数据存储方式。 如何写出更高质量的博客,请看该博主的分享:https://blog.csdn.net/lmy_520/article/details/128686434?utm_source=csdn_ai_ada_blog_reply2

  • vue3+ts json编辑器

    小白前端1: vite的配置也要引入模块 optimizeDeps: { include: [ `monaco-editor/esm/vs/language/json/json.worker`, `monaco-editor/esm/vs/language/css/css.worker`, `monaco-editor/esm/vs/language/html/html.worker`, `monaco-editor/esm/vs/language/typescript/ts.worker`, `monaco-editor/esm/vs/editor/editor.worker` ], },

  • 前端预览插件集合

    CSDN-Ada助手: 非常棒的第一篇博客!看到你对前端预览插件的总结和分享,让我受益匪浅。期待你未来更多的博客分享,为前端开发者带来更多价值。 推荐【每天值得看】:https://bbs.csdn.net/forums/csdnnews?typeId=21804&utm_source=csdn_ai_ada_blog_reply1

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 好用的代码编辑器 vue3
  • 前端预览插件集合
2023年3篇

目录

目录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

PHP网站源码石岩模板制作深圳seo网站推广广州设计网站南联关键词按天计费荷坳网站设计福永模板制作坑梓网络营销木棉湾网站推广方案龙华网站改版永湖模板推广龙岗百度seo平湖设计公司网站坪山seo网站优化广州网站优化推广丹竹头网站建设设计荷坳网站建设坑梓设计网站南联百度网站优化南澳网站seo优化光明seo光明企业网站设计光明网络推广西乡网站制作龙华seo优化坑梓网站设计模板木棉湾外贸网站设计宝安关键词按天收费南澳建站布吉网络广告推广民治模板网站建设歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化