当前位置: 首页 > news >正文

vue3集成jsoneditor

一、背景

之前在做录制回放平台的时候,需要前端展示子调用信息,子调用是一个请求列表数组结构,jsoneditor对数组的默认展示结构是[0].[1].[2]..的方式,为了达到如下的效果,必须用到 onNodeName的钩子函数,因此深入调研了下vue3如何集成jsoneditor

最后做出来的效果图 alt

onNodeName的参考文档 https://github.com/josdejong/jsoneditor/blob/master/docs/api.md alt

二、参考方案

json-editor-vue3 感谢这位老哥的方案,我看了下源码,没有满足我的需要,核心就是属性需要自己加,因此我拿着他的代码改了下

三、代码实现

  • 安装依赖 jsoneditor
npm install --save jsoneditor

jsoneditor是个开源的js的组件,参考文档 https://github.com/josdejong/jsoneditor

  • 编写组件

目录结构如下 alt

vue3-json-editor.tsx: 其中options的定义是完全参考jsoneditor的api文档的,具体需要什么功能,自己去实现对应的options即可!

import { ComponentPublicInstance, defineComponent, getCurrentInstance, onMounted, reactive, watch } from 'vue'
// @ts-ignore
// eslint-disable-next-line import/extensions
import JsonEditor from 'jsoneditor';
import 'jsoneditor/dist/jsoneditor.min.css';
// eslint-disable-next-line import/prefer-default-export
export const Vue3JsonEditor = defineComponent({
  props: {
    modelValue: [StringBooleanObjectArray],
    showBtns: [Boolean],
    expandedOnStart: {
      typeBoolean,
      defaultfalse
    },
    navigationBar: {
      typeBoolean,
      defaulttrue
    },
    mode: {
      typeString,
      default'tree'
    },
    modes: {
      typeArray,
      default () {
        return ['tree''code''form''text''view']
      }
    },
    lang: {
      typeString,
      default'en'
    },
    onNodeName: {
      typeFunction,
      default()=>{}
    }
  },
  setup (props: any, { emit }) {
    const root = getCurrentInstance()?.root.proxy as ComponentPublicInstance

    const state = reactive({
      editornull as any,
      errorfalse,
      json: {},
      internalChangefalse,
      expandedModes: ['tree''view''form'],

      uid`jsoneditor-vue-${getCurrentInstance()?.uid}`
    })

    watch(
      () => props.modelValue as unknown as any,
      async (val) => {
        if (!state.internalChange) {
          state.json = val
          // eslint-disable-next-line no-use-before-define
          await setEditor(val)
          state.error = false
          // eslint-disable-next-line no-use-before-define
          expandAll()
        }
      }, { immediatetrue })

    onMounted(() => {
      //这个options的定义是完全参考jsoneditor的api文档的
      const options = {
        mode: props.mode,
        modes: props.modes,
        onChange () {
          try {
            const json = state.editor.get()
            state.json = json
            state.error = false
            // eslint-disable-next-line vue/custom-event-name-casing
            emit('json-change', json)
            state.internalChange = true
            emit('input', json)
            root.$nextTick(function ({
              state.internalChange = false
            })
          } catch (e) {
            state.error = true
            // eslint-disable-next-line vue/custom-event-name-casing
            emit('has-error', e)
          }
        },
        onNodeName(v: object) {
          // eslint-disable-next-line vue/custom-event-name-casing
            return props.onNodeName(v);
        },

        onModeChange () {
          // eslint-disable-next-line no-use-before-define
          expandAll()
        },
        navigationBar: props.navigationBar
      }
      state.editor = new JsonEditor(
        document.querySelector(`#${state.uid}`),
        options,
        state.json
      )

      // eslint-disable-next-line vue/custom-event-name-casing
      emit('provide-editor', state.editor)
    })

    function expandAll ({
      if (props.expandedOnStart && state.expandedModes.includes(props.mode)) {
        (state.editor as any).expandAll()
      }
    }

    function onSave ({
      // eslint-disable-next-line vue/custom-event-name-casing
      emit('json-save', state.json)
    }

    function setEditor (value: any): void {
      if (state.editor) state.editor.set(value)
    }

    return () => {
      // @ts-ignore
      // @ts-ignore
      return (
        <div>
          <div id={state.uid} class={'jsoneditor-vue'}></div>
        </div>

      )
    }
  }
})

style.css

.ace_line_group {
  text-align: left;
}
.json-editor-container {
  display: flex;
  width100%;
}
.json-editor-container .tree-mode {
  width50%;
}
.json-editor-container .code-mode {
  flex-grow1;
}
.jsoneditor-btns {
  text-align: center;
  margin-top10px;
}
.jsoneditor-vue .jsoneditor-outer {
  min-height150px;
}
.jsoneditor-vue div.jsoneditor-tree {
  min-height350px;
}
.json-save-btn {
  background-color#20a0ff;
  border: none;
  color#fff;
  padding5px 10px;
  border-radius5px;
  cursor: pointer;
}
.json-save-btn:focus {
  outline: none;
}
.json-save-btn[disabled] {
  background-color#1d8ce0;
  cursor: not-allowed;
}
code {
  background-color#f5f5f5;
}

index.ts

export * from './vue3-json-editor';

四、如何使用

<template>
  <div class="container">
    <Vue3JsonEditor
        v-model="json"
        mode='view'
        :show-btns="true"
        :on-node-name="onNodeName"
    />
  </div>
</
template>

<script lang="ts" setup>
import {computed,} from 'vue'
import {Vue3JsonEditor} from "@/components/json-editor";


const props = defineProps({
  record: {
    typeObject,
    default() {
      return {
        request: undefined,
      };
    },
  },
});

const json=computed(()=>{
  const {record} = props;
  return record.subInvocations;
});

// eslint-disable-next-line consistent-return
const onNodeName = (node: {
    value: anytypeany
})=>{
  if (node.type==='object' && node.value.identity) {
    return node.value.identity;
  }
  return undefined;
}

</script>

<script lang="ts">
export default {
  name: 'Invocations',
};
</
script>


<style scoped lang="less">
.container {
  padding: 0 20px 20px 20px;
}
</style>

本文由 mdnice 多平台发布

相关文章:

vue3集成jsoneditor

一、背景 之前在做录制回放平台的时候&#xff0c;需要前端展示子调用信息&#xff0c;子调用是一个请求列表数组结构&#xff0c;jsoneditor对数组的默认展示结构是[0].[1].[2]..的方式&#xff0c;为了达到如下的效果&#xff0c;必须用到 onNodeName的钩子函数&#xff0c;…...

自然语言处理 中文停用词词典

我整合了4个常用的中文停用词词典&#xff08;https://gitcode.net/mirrors/goto456/stopwords/-/tree/master&#xff09;&#xff0c;剔除了其中的非中文词汇&#xff0c;得到停用词词典如下&#xff0c;可直接取用。 看见 并不是 有著 岂非 毫无保留地 这样 么 哎呀 互相 通…...

CocosCreator3.8研究笔记(十)CocosCreator 图像资源的理解

一、图像资源导入 Cocos Creator 可使用图像文件格式&#xff0c;支持 JPG、PNG、BMP、TGA、HDR、WEBBP、PSD、TIFF 等。 将图像资源直接拖拽到 资源管理器 即可将其导入 二、图像资源的类型 在 属性检查器 面板中便可根据需要设置图像资源的使用类型&#xff1a;raw 、 textu…...

计算机使用中常用截图与标注方法

一、截图常用方法 1&#xff0e;windows自带快捷键 Print Screen SysPq 截取全屏&#xff0c;可以粘到word文档中&#xff0c;可以粘贴到"画图"程序中&#xff0c;命名一个文件名&#xff0c;另存为图片&#xff0c;或.jpg后缀&#xff0c;或.png后缀 alt Print S…...

Elasticsearch,Logstash和Kibana安装部署(ELK Stack)

前言 当今数字化时代&#xff0c;信息的快速增长使得各类组织和企业面临着海量数据的处理和分析挑战。在这样的背景下&#xff0c;ELK Stack&#xff08;Elasticsearch、Logstash 和 Kibana&#xff09;作为一套强大的开源工具组合&#xff0c;成为了解决数据管理、搜索和可视…...

MATLAB中movmean函数用法

目录 语法 说明 示例 向量的中心移动平均值 向量的尾部移动平均值 矩阵的移动平均值 包含缺失值的向量的移动平均值 基于样本点计算移动平均值 仅返回满窗口平均值 movmean函数的功能是对数据进行移动求平均值。 语法 M movmean(A,k) M movmean(A,[kb kf]) M mov…...

IIS短文件名泄露漏洞复现

IIS短文件名泄露漏洞复现 前言一、漏洞描述二、漏洞原理1.什么是短文件2.短文件特征 三、漏洞验证三、漏洞防御总结 前言 IIS短文件名泄露漏洞比较老了&#xff0c;而且只适合于windowsiisasp的网络结构&#xff0c;所有如下的复现步骤看下就行了&#xff0c;关键是要弄懂原理…...

万字解读 Android 车机核心 :CarService 的构成和链路~

前言 关于 Android 车机&#xff0c;之前分析过方控上自定义按键的输入机制和中控上旋钮输入的原理&#xff0c;但都局限于 Car Service 内 Input 相关模块。 一文了解 Android 车机如何处理中控的旋钮输入从实体按键看 Android 车载的自定义事件机制 本文将结合 Android 系…...

C#使用Panel

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System...

Jabbi的Rust学习日记(一)

Rust环境安装 Windows:Install Rust - Rust Programming Language (rust-lang.org) 访问网页&#xff0c;下载64bit | 32bit 版本 下载完成后打开&#xff0c;直接enter即可 Linux:输入指令 curl https://sh.rustup.rs-sSf | sh 我会报错&#xff0c;好像是链接不到这个网址&a…...

电脑磁盘分区形式是什么?如何更改?

磁盘分区形式介绍 在了解为什么以及如何更改分区形式之前&#xff0c;让我们对磁盘分区形式有一个基本的了解。一般来说&#xff0c;分区形式是指主引导记录&#xff08;MBR&#xff09;和 GUID 分区表&#xff08;GPT&#xff09;。 MBR和GPT是Windows系统中常用…...

Outlook无需API开发连接钉钉群机器人,实现新增会议日程自动发送群消息通知

Outlook用户使用场景&#xff1a; 在企业中&#xff0c;会议和活动的顺利举行对于业务运转和团队协作至关重要。然而&#xff0c;计划的变动总是无法避免&#xff0c;这可能会导致其他人的计划受到影响&#xff0c;打乱原有的安排。为了解决这个问题&#xff0c;许多企业开始使…...

elasticsearch分析插件 安装analysis-ik

首先下载安装es 和 插件 &#xff0c;注意 两者的版本要保持一致,如果要用到kibana 则三者保持一致 ik&#xff1a;https://github.com/medcl/elasticsearch-analysis-ik/releases es/kibana&#xff1a;https://www.elastic.co/cn/downloads/past-releases/ 然后在 es— elast…...

2023年股票大宗减持研究报告

第一章 股票大宗减持概述 1.1 概念 大宗减持是指通过大宗交易的方式进行减持&#xff0c;即达到规定的最低限额的证券单笔买卖申报&#xff0c;买卖双方经过协议达成一致并经交易所确定成交的证券交易&#xff0c;其中A股单笔交易数量在30万股&#xff08;含&#xff09;以上…...

VS编译.cu文件源文件无法打开matrix.h和mex.h问题

配置好cu和VS相关库文件后CUDA程序仍然报错&#xff1a;无法打开matrix.h和mex.h&#xff0c;解决办法&#xff1a; &#xff08;1&#xff09;这两个头文件是matlab中的&#xff0c;可能无法直接在VS中调用&#xff0c;可以通过添加外部依赖项的方法将matlab中的头文件的文件路…...

小bugs搜集和解决方法,亲测有效(2022-2023)

有些小bugs几行指令就能解决&#xff0c;写太多不好&#xff0c;这里就进行一个2022-2023这段时间的bugs collection和solution。 Deep Learning How to make really empty tensor? a nn.Torch([]) b torch.empty(2,3) for i in rang(3):a torch.cat(a, b, dim0)Mismatc…...

归并排序和快速排序的两种实现

在此之前我们已经介绍过归并排序和快速排序&#xff1a;浅谈归并排序与快速排序&#xff0c;但其中的实现都是基于递归的。本文将重新温故这两种算法并给出基于迭代的实现。 目录 1. 归并排序1.1 基于递归1.2 基于迭代 2. 快速排序2.1 基于递归2.2 基于迭代 1. 归并排序 1.1 基…...

C#,《小白学程序》第十四课:随机数(Random)第一,几种随机数的计算方法与代码

1 文本格式 /// <summary> /// 《小白学程序》第十四课&#xff1a;随机数&#xff08;Random&#xff09;第一&#xff0c;几种随机数的计算方法与代码 /// 本课初步接触一下随机数。 /// </summary> /// <param name"sender"></param> ///…...

[杂谈]-快速了解Modbus协议

快速了解Modbus协议 文章目录 快速了解Modbus协议1、为何 Modbus 如此受欢迎2、范围和数据速率3、逻辑电平4、层数5、网络与通讯6、数据帧格式7、数据类型8、服务器如何存储数据9、总结 ​ Modbus 是一种流行的低速串行通信协议&#xff0c;广泛应用于自动化行业。 该协议由 Mo…...

WhatsApp的两个商业模式该如何选择

WhatsApp Business 是什么 目前 WhatsApp 提供两种商业模式&#xff0c;企业应根据自身需求选择相应版本。 第一个版本是 WhatsApp Business&#xff1a;初创企业只需一个手机应用程序&#xff0c;便可以个体单位与客户轻松互动; 另一个版本是 WhatsApp Business API&#xff…...

intv_ai_mk11开源可部署实践:支持Webhook回调,可对接企业微信/钉钉/飞书通知

intv_ai_mk11开源可部署实践&#xff1a;支持Webhook回调&#xff0c;可对接企业微信/钉钉/飞书通知 1. 项目概述 intv_ai_mk11是一款基于Llama架构的AI对话机器人&#xff0c;拥有7B参数规模&#xff0c;能够运行在GPU服务器上。这个开源项目不仅提供了强大的对话能力&#…...

千问3.5-2B与Dify平台结合:无需编码快速搭建AI应用

千问3.5-2B与Dify平台结合&#xff1a;无需编码快速搭建AI应用 1. 为什么需要低代码AI开发平台 想象一下&#xff0c;你是一家电商公司的运营负责人&#xff0c;每天需要处理大量客户咨询、生成商品描述、制作营销文案。传统方式要么需要雇佣专业团队&#xff0c;要么得自己学…...

从四皇后到N皇后:回溯算法的核心思想与实战演练

1. 从棋盘游戏到算法思维&#xff1a;四皇后问题入门 记得我第一次接触四皇后问题时&#xff0c;正坐在大学算法课的教室里。教授用粉笔在黑板上画出一个4x4的棋盘&#xff0c;然后突然转身问我们&#xff1a;"如果让你们来摆放这四个皇后&#xff0c;保证她们互不攻击&am…...

深入理解Java AQS:抽象队列同步器的核心原理与实战指南

深入理解Java AQS&#xff1a;抽象队列同步器的核心原理与实战指南 【免费下载链接】JavaGuide Java 面试 & 后端通用面试指南&#xff0c;覆盖计算机基础、数据库、分布式、高并发、系统设计与 AI 应用开发 项目地址: https://gitcode.com/gh_mirrors/ja/JavaGuide …...

FRCRN开源模型多场景落地:客服录音净化、有声书制作、教学音频增强

FRCRN开源模型多场景落地&#xff1a;客服录音净化、有声书制作、教学音频增强 你有没有遇到过这样的烦恼&#xff1f;听一段重要的会议录音&#xff0c;背景里总有嗡嗡的空调声&#xff1b;想剪辑一段播客&#xff0c;却发现环境噪音怎么也去不干净&#xff1b;或者给孩子听网…...

利用kimi与快马平台,十分钟搭建个人博客web应用原型

最近想快速验证一个个人博客的创意&#xff0c;但自己从头写代码太费时间。尝试用InsCode(快马)平台的Kimi模型生成原型&#xff0c;没想到十分钟就搞定了可运行的Web应用&#xff0c;分享下这个高效流程&#xff1a; 明确需求梳理结构 先花2分钟在纸上画了博客的基本框架&…...

Windows下WVP+ZLMediaKit联动实战:5分钟搞定GB28181摄像头接入(附端口避坑清单)

Windows下WVPZLMediaKit联动实战&#xff1a;5分钟搞定GB28181摄像头接入&#xff08;附端口避坑清单&#xff09; 在智能视频监控领域&#xff0c;GB28181协议作为国家标准协议&#xff0c;正在成为设备互联的主流选择。但对于刚接触这一领域的开发者来说&#xff0c;从零开始…...

基于鲸鱼优化算法改进XGBoost在MATLAB中的时间序列预测性能(迭代次数、最大深度和学习...

基于鲸鱼优化算法优化XGBoost(WOA-XGBoost)的时间序列预测 WOA-XGBoost时间序列 采用交叉验证抑制过拟合问题 优化参数为迭代次数、最大深度和学习率 matlab代码&#xff0c;注&#xff1a;暂无Matlab版本要求 -- 推荐 2016B 版本及以上 注&#xff1a;采用 XGBoost 工具箱&…...

3分钟上手弹幕盒子:零基础高效制作自定义弹幕的免费工具

3分钟上手弹幕盒子&#xff1a;零基础高效制作自定义弹幕的免费工具 【免费下载链接】danmubox.github.io 弹幕盒子 项目地址: https://gitcode.com/gh_mirrors/da/danmubox.github.io 弹幕盒子是一款专业的在线自定义弹幕生成工具&#xff0c;以轻量化架构设计为核心&a…...

Serilog:从结构化日志认知到 .NET 工程落地

MySQL 中的 count 三兄弟&#xff1a;效率大比拼&#xff01; 一、快速结论&#xff08;先看结论再看分析&#xff09; 方式 作用 效率 一句话总结 count(*) 统计所有行数 最高 我是专业的&#xff01;我为统计而生 count(1) 统计所有行数 同样高效 我是 count(*) 的马甲兄弟…...