X6节点如何根据内容自适应高度

使用的方法是,把内容放入一个类似的div容器中,计算出div的宽度和高度,再给这个节点的宽度和高度重新赋值

<template>
  <div class="container">
    <div :class="['container-title', { 'node-text-padding': data }]">
      <div class="circle-container">
        <svg-icon icon-class="components" />
      </div>
      <div class="flow-title">组件节点</div>
    </div>
    <div :class="['Node-text', { 'node-text-border': data }]">
      <div class="content" v-html="data"></div>
    </div>
  </div>
</template>

<script setup lang="ts" name="rectangle">
import { Node } from '@antv/x6';

const getNode = inject<() => Node | undefined>('getNode');
const data = ref<any>();

const getSize = (node: any) => {
  let dom = document.querySelector(`.x6-node[data-cell-id="${node.id}"] foreignObject`);
  let container = dom.querySelector('.container');
  // container.style.textAlign = 'left';
  const { width, height } = wrapAndMeasure(container);
  nextTick(() => {
    node.resize(width, height);
  });
};

const changeData = () => {
  const node = getNode?.();
  data.value = node.data.label;
  node.on('change:data', ({ current }) => {
    console.log(current);
    const { label } = current;
    data.value = label;
    nextTick(() => {
      // if (data.value.length <= 10) return;
      getSize(node);
    });
  });
};

const wrapAndMeasure = (container: any) => {
  // 创建新的 div 元素
  let newDiv = document.createElement('div');

  // 将获取到的 container 元素原封不动地放入新的 div 中
  newDiv.appendChild(container.cloneNode(true));

  // 设置新 div 的样式
  newDiv.style.maxWidth = '200px';
  newDiv.style.minWidth = '100px';
  newDiv.style.visibility = 'hidden'; // 隐藏新 div

  // 将新 div 插入文档流中,这样才能计算出其高度和宽度
  document.body.appendChild(newDiv);

  // 计算新 div 的高度和宽度
  let height = newDiv.clientHeight;
  let width = newDiv.clientWidth;
  console.log(newDiv);
  // 从文档流中移除新 div
  newDiv.remove();
  console.log(width, height);

  // 返回计算结果
  return { height, width };
};

onMounted(() => {
  changeData();
});
</script>

<style scoped>
.container {
  border-radius: 4px;
  padding: 10px; /* 内边距 */
  overflow: hidden;
  box-sizing: border-box;
  height: 100%;
  background-color: #ffffff;
  box-shadow: var(--el-box-shadow-light); /* 浅色投影 */
}

.container-title {
  display: flex;
  align-items: center;
  /*justify-content: space-between;*/
}

.flow-title {
  margin-left: 10px;
  color: #333333;
  font-size: 14px;
  font-weight: bold;
}

.content {
  color: #5a5e66;
  text-align: left; /* 文本居中 */
  overflow: auto; /* 滚动条 */
}

.circle-container {
  width: 25px; /* 设置圆形容器的宽度 */
  height: 25px; /* 设置圆形容器的高度 */
  background-color: #209fff; /* 设置背景颜色为蓝色 */
  border-radius: 50%; /* 将容器的边框半径设置为容器宽度的一半,从而创建圆形 */
  display: flex; /* 使用 Flexbox 布局 */
  justify-content: center; /* 水平居中 */
  align-items: center; /* 垂直居中 */
  padding: 0 !important;
}

.circle-container .svg-icon {
  width: 18px !important;
  height: 18px !important;
}

/*.node-text-border {
  border-top: 1px solid #f3f3f3;
}*/

/*.node-text-padding {
  padding-bottom: 10px;
}*/
</style>

当我使用这种方法时,是因为在没有找到其他解决方案的情况下,不得不采取这种方式。如果您有更有效的方法,请告诉我如何改进。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值