前端使用JSON编辑器、java编辑器、浏览器中使用eslint

本文介绍了在Vue3和React项目中使用Json编辑器和代码编辑器的方法,如Vue3JsonEditor的安装与使用,以及MonacoEditor的集成,提供了编辑、语法高亮和校验等功能。同时,提到了基于eslint和codemirror实现的在线代码编辑器,并讲解了WebSocket的连接与封装。
摘要由CSDN通过智能技术生成

一、vue3中使用Json 编辑器

// 安装
npm install vue3-json-editor --save        npm install vue3-json-editor@latest --save 
// 项目中使用(两种导入方式本质上一致,区别在于模块的默认导出方式不同)
import { Vue3JsonEditor } from 'vue3-json-editor/dist/vue3-json-editor.cjs.js' // 使用了ES6的解构赋值语法,从CommonJS规范导出的模块中,显式地导入了名称为Vue3JsonEditor的变量。这样的话,您需要在代码中显式地使用该变量来创建组件
import Vue3JsonEditor from 'vue3-json-editor' // 直接导入了默认导出的组件,可以直接使用Vue3JsonEditor变量来创建组件(已经配置了Webpack或Vite等构建工具使其能够识别.vue文件,并通过单文件组件的方式进行开发)
import { Vue3JsonEditor } from 'vue3-json-editor/dist/vue3-json-editor.cjs.js';
<Vue3JsonEditor 
	v-model="debugInput"  // 双向绑定数据
	@json-change="jsonChange"   // 改变调用事件
	@json-save="onJsonSave"  // 保存调用事件
	@has-error="onError" 
	key="1" 
	:mode="'text'"   // 默认模式tree(tree,code,form,text,view)  text文本结构,比较好添加和编辑内容.树结构看数据比较直观,还可以添加你想要的类型的数据
	ref="editor" 
	:showBtns="false"  // 是否展示保存按钮
	:expandedOnStart="true"  // 是否展开JSON编辑器模式
	v-if="form.method==2" c
	lass="command-issuing-script-json" 
	@@blur="validate" 如果需要校验json是否正确,可以监测@blur事件,使用editor.validate()来校验json数据
/>

 const jsonChange = (val) => {
      state.debugInput = val
      state.hasJsonFlag = true
 }
  const onError = (err) => {
      state.hasJsonFlag = false
  }
	// 在组件中增加 exportJson 方法
    const exportJson = () => {
      const data = editor.value.getJSON()  // 在组件实例上获取
      const jsonDataStr = JSON.stringify(data, null, 2) // 拿到json字符串
      // 注意也可以直接拿动态绑定的字段
      const blob = new Blob([jsonDataStr], { type: 'application/json' })
      const url = URL.createObjectURL(blob)
      const link = document.createElement('a')
      link.href = url
      link.download = 'data.json'
      link.click()
      URL.revokeObjectURL(url)
    }

// 主要功能点1)支持双向绑定:您可以使用 v-model 指令将 Vue3JsonEditor 组件与父组件中的数据进行双向绑定。并自动格式化

二、react中使用(也可用在vue项目中)可用于java、js、json等
Monaco Editor 是一个浏览器端的代码编辑器,它是 VS Code 编辑器的核心部分,可以提供强大的代码编辑能力,它是 VSCode 的浏览器版本Monaco Editor 的特点包括:
(1)支持多种编程语言
(2)支持语法高亮、智能提示、自动补全等编辑器功能
(3)可以集成到 Web 应用程序中,支持在线代码编辑
https://zhuanlan.zhihu.com/p/88828576

// 安装
npm install monaco-editor --save 
// 使用
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
// 创建一个编辑器容器 div,并设置其大小和位置
const editorContainer = document.createElement('div');
editorContainer.style.width = '800px';
editorContainer.style.height = '600px';
document.body.appendChild(editorContainer);
// 初始化编辑器
const editor = monaco.editor.create(editorContainer, {
  value: 'console.log("Hello, world")',
  language: 'javascript'  // 是什么语言 'json'
  readOnly: readOnly || false, // 只读
});

// 导出(借助ioJSON包,IOJSON是一种扩展了JSON格式的数据交换协议,支持更多的数据类型并且允许通过URL引用数据以方便传输大量数据。iojson库提供了一系列API来解析和序列化IOJSON格式的数据,使得Javascript开发者可以方便地使用这种数据交换格式)
npm install iojson
import iojson from 'iojson';
const ioJsonData = '{"name": "Alice", "age": 25}';
const jsObject = iojson.parse(ioJsonData);
console.log(jsObject);
// Output: { name: 'Alice', age: 25 }
iojson.exportJSON(physicModel, `${physicModel.name}`)  // 导出.json文件

三、浏览器中使用eslint: vue3+codemirror6实现简易在线代码编辑器
在这里插入图片描述
https://www.jb51.net/article/272037.htm

// 项目中使用
npm install eslint-linter-browserify --save-dev(会在packagepackage-lock引入)
npm i vue-codemirror
npm i codemirror   // 在线编辑器
npm i @codemirror/lang-javascript
npm i @codemirror/lint
npm i @codemirror/autocomplete // 自动补全功能
npm i @codemirror/theme-one-dark  // 主题
// 实现弹框中js脚本
import { javascript, esLint } from '@codemirror/lang-javascript'
import { linter, lintGutter } from '@codemirror/lint';
import * as eslint from 'eslint-linter-browserify'
import { basicSetup, EditorView } from 'codemirror'
import { EditorState } from "@codemirror/state";

 <div class="codemirror-script" ref="scriptRef"></div>
 const state = reactive({
            code:
                `function filter(inputData) {
  					var outputData=inputData
 				 	return outputData
				  }`,
            config: {
                parserOptions: {
                    ecmaVersion: 6,
                    sourceType: "module",
                },
                env: {
                    browser: true,
                    node: true,
                },
                rules: ESLINT_RULES,  // 校验规则
            },
            editView: {}
	});
const scriptRef = ref(null)
const openDialog = (row: any) => {
                state.code = `function filter(inputData) {
  					var outputData=inputData
  					return outputData
				}`;
            setTimeout(() => {
                state.editView = new EditorView({
                    state: EditorState.create({
                        doc: state.code,
                        extensions: [
                            basicSetup,
                            javascript(),
                            lintGutter(),
                            linter(esLint(new eslint.Linter(), state.config))
                        ],
                    }),
                    parent: scriptRef.value as any,
                })
            }, 0)
        }

        const onConfirm = () => {
            refForm.value.validate(async (valid: boolean) => {
                if (valid) {
                    let param = { ...form.value }
                    param.script = state.editView.state.doc.text.join("\n") || ''   // 获取当前编辑器的内容字符串
                    // 验证js脚本  是否包含function filter
                    if (!param.script.includes('function filter')) {
                        ElMessage.warning('js脚本必须包含filter过滤函数')
                        return
                    }
                }
            })
        }

三、websocket连接
1、配url连接路径:在这里插入图片描述
2、代码

		state.ws = new ReconnectingWebSocket({ url: state.row.sourceUrl }, (type: string, message: any) => {
						let newMessage = message;
						try {
							newMessage = JSON.parse(message);
						} catch (error) {
							console.log(error);
						}
						state.responseJSON = newMessage;
					});

// 以下是websocket类封装
interface Props {
	url: string;
	reconnectInterval: number; // 重连间隔时间
	heartBeatInterval: number; // 心跳间隔时间
	isOpenHeartbeatMonitore: boolean; // 是否开启心跳监测
	heartMeesage: string; // 心跳发送信息
	maxReconnectAttempts: number; // 最大重连次数
}

export default class ReconnectingWebSocket {
	url: string;
	reconnectInterval: number;
	heartBeatInterval: number;
	ws: any;
	heartMeesage: string;
	isOpenHeartbeatMonitore: boolean;
	data: any;
	maxReconnectAttempts: number;
	private reconnectAttempts: number;
	private isClosed: boolean;
	private heartBeatTimer: any;
	callback: Function;
	constructor(
		{ url, reconnectInterval, heartBeatInterval, heartMeesage, isOpenHeartbeatMonitore = true, maxReconnectAttempts = 3 }: Props,
		callback: Function
	) {
		this.url = url;
		this.reconnectInterval = reconnectInterval || 1000; // 重连间隔时间
		this.heartBeatInterval = heartBeatInterval || 30000; // 心跳间隔时间
		this.ws = null;
		this.isClosed = false;
		this.heartBeatTimer = null;
		this.heartMeesage = heartMeesage;
		this.isOpenHeartbeatMonitore = isOpenHeartbeatMonitore;
		this.maxReconnectAttempts = maxReconnectAttempts;
		this.reconnectAttempts = 0;
		this.connect();
		this.callback = callback;
	}

	connect() {
		if (this.ws) {
			this.ws.close();
			this.ws = null;
		}
		this.ws = new WebSocket(this.url);
		this.ws.onopen = () => {
			this.isOpenHeartbeatMonitore && this.startHeartBeat();
			this.callback('open', 'WebSocket连接成功');
		};
		this.ws.onmessage = (event: { data: string }) => {
			this.callback('message', event.data);
			this.data = event.data;
		};
		this.ws.onclose = () => {
			// 正常和异常关闭
			this.data = null;
			this.stopHeartBeat();
			if (!this.isClosed) {
				// 异常关闭 重连
				if (this.reconnectAttempts < this.maxReconnectAttempts) {
					setTimeout(() => {
						this.reconnectAttempts++;
						this.callback('close', `WebSocket第${this.reconnectAttempts}次重连`);
						this.connect();
					}, this.reconnectInterval);
				} else {
					this.callback('close', `已达到最大重连次数,停止重连`);
				}
			} else {
				this.callback('close', 'WebSocket连接关闭');
			}
		};
	}

	send(data: string) {
		if (this.ws.readyState === WebSocket.OPEN) {
			this.ws.send(data);
		}
	}

	startHeartBeat() {
		this.heartBeatTimer = setInterval(() => {
			this.send(this.heartMeesage); // 发送心跳消息
		}, this.heartBeatInterval);
	}

	stopHeartBeat() {
		this.isOpenHeartbeatMonitore && clearInterval(this.heartBeatTimer);
	}

	close() {
		this.isClosed = true;
		this.ws.close();
	}
}




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我会尝试回答你的问题。首先,我们需要了解一下什么是Qt多线程,以及如何使用它来实现json编辑器。 Qt多线程是一种将任务分配到多个线程上并发执行的机制。通过使用Qt多线程,我们可以将一些耗时的操作放到后台线程,避免阻塞主线程,从而提高程序的响应性能。 下面是一个使用Qt多线程实现json编辑器的示例: 1.创建一个json编辑器的窗口,并在窗口添加一个QTextEdit控件用于显示json数据。在窗口的构造函数创建一个新的QThread对象,然后将其连接到一个自定义的JsonParser对象的解析函数。 2.在JsonParser类,我们可以定义一个解析函数,该函数将json数据作为输入参数,并将其解析为Qt的QJsonObject对象。我们可以在该函数使用Qt的Json API来解析json数据。 3.在JsonParser类,我们还可以定义一个信号(signal),用于将解析后的QJsonObject对象发送回主线程。在解析函数完成后,我们可以通过emit语句来发送该信号。 4.在窗口类,我们需要定义一个槽函数(slot),用于接收解析完成的QJsonObject对象。在该槽函数,我们可以将解析后的数据显示在QTextEdit控件。 下面是一个简单的代码示例,用于说明如何使用Qt多线程实现json编辑器: ```c++ #include <QMainWindow> #include <QTextEdit> #include <QThread> #include <QJsonObject> #include <QJsonDocument> class JsonParser : public QObject { Q_OBJECT public: void parseJson(const QString& jsonData) { // 解析json数据 QJsonDocument doc = QJsonDocument::fromJson(jsonData.toUtf8()); QJsonObject jsonObj = doc.object(); // 发送解析完成的信号 emit jsonParsed(jsonObj); } signals: void jsonParsed(const QJsonObject& jsonObj); }; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { // 创建json编辑器的窗口 QTextEdit* textEdit = new QTextEdit(this); setCentralWidget(textEdit); // 创建新的线程并连接到JsonParser对象的解析函数 QThread* thread = new QThread(this); JsonParser* parser = new JsonParser(); parser->moveToThread(thread); connect(thread, &QThread::started, parser, [=]() { parser->parseJson("{ \"name\": \"John\", \"age\": 30 }"); }); // 连接JsonParser对象的 jsonParsed 信号到主线程的槽函数 connect(parser, &JsonParser::jsonParsed, this, [=](const QJsonObject& jsonObj) { textEdit->setText(QJsonDocument(jsonObj).toJson()); }); // 启动新的线程 thread->start(); } }; ``` 以上示例,我们创建了一个JsonParser类来解析json数据,并在MainWindow类创建一个新的线程并连接到JsonParser对象的解析函数。在JsonParser类,我们定义了一个jsonParsed信号,用于将解析后的QJsonObject对象发送回主线程。在MainWindow类,我们连接JsonParser对象的jsonParsed信号到主线程的槽函数,用于接收解析完成的QJsonObject对象,并将其显示在QTextEdit控件。 注意:以上示例仅供参考,实际使用还需要考虑一些线程安全和异常处理的问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值