SonMap.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <template>
  2. <el-form v-if="infoType === 'node'" ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="120px"
  3. class="demo-ruleForm" :size="formSize" status-icon label-position="left">
  4. <el-form-item :label="item.label" :prop="item.name" v-for="(item, index) in formData" :key="index">
  5. <el-input v-model="ruleForm[item.name]" v-if="item.type === 'text'" />
  6. <el-input v-model="ruleForm[item.name]" type="textarea" v-else-if="item.type === 'textarea'" />
  7. <el-select v-model="ruleForm[item.name]" v-else-if="item.type === 'select'">
  8. <el-option :label="m.label" :value="m.value" v-for="(m, n) in item.options" :key="n" />
  9. </el-select>
  10. </el-form-item>
  11. </el-form>
  12. <div v-if="infoType === 'line'">
  13. <h6>起始节点:</h6>
  14. <p>{{ lineData.sourceInfo.config[0].value }}</p>
  15. <h6>目标节点:</h6>
  16. <p>{{ lineData.targetInfo.config[0].value }}</p>
  17. </div>
  18. <div class="btnBox" v-show="listShow">
  19. <el-button type="primary" @click="submitForm(ruleFormRef)" v-show="infoType === 'node' && formData.length > 0">
  20. 保存节点
  21. </el-button>
  22. <el-button type="primary" v-show="infoType === 'node' && formData.length > 0" @click="delteNodeFun">
  23. 删除节点
  24. </el-button>
  25. <el-button type="primary" v-show="infoType === 'line'" @click="deleteLineFun">
  26. 删除连线
  27. </el-button>
  28. </div>
  29. </template>
  30. <script setup>
  31. import { ref, onMounted, defineEmits, reactive } from 'vue'
  32. let formData = ref([]);
  33. let lineData = ref({});
  34. const formSize = ref("default");
  35. const ruleFormRef = ref();
  36. const listShow = ref(false);
  37. let ruleForm = reactive({});
  38. const infoType = ref("node");
  39. const emit = defineEmits(["changeActiveNodeInfo", "deleteLine", "deleteNode"]);
  40. const rules = reactive({
  41. label: [
  42. { required: true, message: "节点名称为必输项", trigger: "blur" },
  43. { min: 4, max: 15, message: "请输入4至15之间的字符", trigger: "blur" },
  44. ],
  45. affiliation: [
  46. {
  47. required: true,
  48. message: "请选择归属项",
  49. trigger: "change",
  50. },
  51. ],
  52. });
  53. const submitForm = async (formEl) => {
  54. if (!formEl) return;
  55. await formEl.validate((valid, fields) => {
  56. if (valid) {
  57. console.log(valid, ruleForm);
  58. formData.value.forEach((item) => {
  59. item.value = ruleForm[item.name];
  60. });
  61. emit("changeActiveNodeInfo", formData.value);
  62. } else {
  63. console.log("error submit!", fields);
  64. }
  65. });
  66. };
  67. const resetForm = (formEl) => {
  68. if (!formEl) return;
  69. formEl.resetFields();
  70. };
  71. const options = Array.from({ length: 10000 }).map((_, idx) => ({
  72. value: `${idx + 1}`,
  73. label: `${idx + 1}`,
  74. }));
  75. const getFormData = () => {
  76. console.log(formData, "信息");
  77. };
  78. //父节点传递信息函数
  79. const changeFormData = (val) => {
  80. infoType.value = "node";
  81. listShow.value = true;
  82. console.log(val);
  83. formData.value = val;
  84. formData.value.forEach((item) => {
  85. console.log(item, "遍历");
  86. ruleForm[item.name] = item.value;
  87. });
  88. console.log(ruleForm, "???");
  89. };
  90. //父节点传递连线信息
  91. const getLineInfo = (lineInfo) => {
  92. listShow.value = true;
  93. console.log(lineInfo, "连线信息");
  94. infoType.value = "line";
  95. lineData.value = lineInfo;
  96. };
  97. //删除连线信息
  98. const deleteLineFun = () => {
  99. emit("deleteLine", lineData.value);
  100. infoType.value = null;
  101. };
  102. //删除节点
  103. const delteNodeFun = () => {
  104. emit("deleteNode");
  105. };
  106. onMounted(() => { });
  107. defineExpose({
  108. changeFormData,
  109. getLineInfo,
  110. formData,
  111. });
  112. </script>
  113. <style lang="less" scoped>
  114. /deep/ .el-form-item {
  115. display: flex;
  116. flex-direction: column !important;
  117. }
  118. h6 {
  119. font-size: 14px;
  120. font-weight: 500;
  121. margin: 5px;
  122. overflow: hidden;
  123. }
  124. p {
  125. margin: 20px;
  126. border-bottom: 1px solid #eee;
  127. overflow: hidden;
  128. }
  129. </style>