UNIVPLMDataIntegration/Web/src/components/jsonEditor/index.vue
2025-04-28 14:16:22 +08:00

64 lines
1.9 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!--
// JsonEditor组件用于编辑类json格式数据防止配置式数据的错误格式输入
// 使用示例:
<template>
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
<el-form-item label="内容" prop="content">
<JsonEditor ref="jsonEditorRef" v-model:jsonObj="ruleForm.content"></JsonEditor>
</el-form-item>
</el-col>
</template>
<script lang="ts" setup>
import JsonEditor from '/@/components/jsonEditor/index.vue';
</script>
-->
<template>
<!-- 根据 isJsonValid 控制 JsonEditorVue 的显示 -->
<JsonEditorVue ref="jsonEditorVueRef" v-show="isJsonValid" v-model="internalJsonObj" mode="text" style="width: 100%; height: 800px" />
</template>
<script setup lang="ts" name="jsonEditor">
import { ref, useTemplateRef, watch, onMounted, computed } from 'vue';
import JsonEditorVue from 'json-editor-vue';
const props = defineProps({
jsonObj: {
type: null,
default: null, // 允许为 null
required: false, // 不是必需的
},
});
const jsonEditorVueRef = useTemplateRef('jsonEditorVueRef');
const internalJsonObj = ref(props.jsonObj);
const emit = defineEmits(['update:jsonObj']);
// 计算属性判断 jsonObj 是否为有效的 JSON 字符串这里为简易判断防止输入框失去焦点时组件频繁隐藏和显示
const isJsonValid = computed(() => {
// try {
// if (internalJsonObj.value && (internalJsonObj.value.startsWith('{') || internalJsonObj.value.startsWith('[')) && (internalJsonObj.value.endsWith('}') || internalJsonObj.value.endsWith(']'))) {
// return true;
// }
// } catch {
// return false;
// }
return true;
});
// 监听内部 JSON 对象变化并触发外部更新
watch(internalJsonObj, () => {
emit('update:jsonObj', internalJsonObj.value);
});
// 监听外部字符串变化并更新内部JSON对象
watch(
() => props.jsonObj,
(newVal) => {
internalJsonObj.value = newVal;
}
);
onMounted(() => {
jsonEditorVueRef.value.jsonEditor.focus();
});
</script>