g6文本超长显示..tip显示

1,500 阅读1分钟

实现效果图

image.png

实现超长...效果

const fittingString = (str, maxWidth, fontSize) => {
    const ellipsis = '...'
    const ellipsisLength = G6.Util.getTextSize(ellipsis, fontSize)[0]
    let currentWidth = 0
    let res = str
    const pattern = new RegExp('[\u4E00-\u9FA5]+')
    str.split('').forEach((letter, i) => {
      if (currentWidth > maxWidth - ellipsisLength) return
      if (pattern.test(letter)) {
        currentWidth += fontSize
      } else {
        currentWidth += G6.Util.getLetterWidth(letter, fontSize)
      }
      if (currentWidth > maxWidth - ellipsisLength) {
        res = `${str.substr(0, i)}${ellipsis}`
      }
    })
    return res
  }

实现Tooltip效果

const tooltip = new G6.Tooltip({
  offsetX: 5,
  offsetY: 5,
  fixToNode: [1, 0.5],
  itemTypes: ['node'],
  getContent: (e) => {
    const outDiv = document.createElement('div')
    outDiv.style.width = 'fit-content'
    outDiv.style.height = 'fit-content'
    const model = e.item.getModel()
    if (e.item.getType() === 'node') {
      outDiv.innerHTML = `${model.label}`
      return outDiv
    }
  }
})

完整代码

<template>
  <div class="supply-relationship-container">
    <div id="g6-container" class="g6-container"></div>
  </div>
</template>

<script>
import G6 from '@antv/g6'

const tooltip = new G6.Tooltip({
  offsetX: 5,
  offsetY: 5,
  fixToNode: [1, 0.5],
  itemTypes: ['node'],
  getContent: (e) => {
    const outDiv = document.createElement('div')
    outDiv.style.width = 'fit-content'
    outDiv.style.height = 'fit-content'
    const model = e.item.getModel()
    if (e.item.getType() === 'node') {
      outDiv.innerHTML = `${model.label}`
      return outDiv
    }
  }
})

export default {
  data() {
    let that = this
    return {
      list: {
        id: 'root',
        label: 'root',
        children: [
          {
            id: 'c3-2-1',
            label: '34322ewqrweqrwqerwqerwerwqrwrqre',
          },
          {
            id: 'c3-2-13333333',
            label: '34322ewqrweqrwqerwqerwerwqrwrqre',
          },
          {
            id: 'c3-2-13',
            label: '34322ewqrweqrwqerwqerwerwqrwrqre',
          },
          {
            id: 'c3-2-133',
            label: '34322ewqrweqrwqerwqerwerwqrwrqre',
          }
        ]
      }
    }
  },
  methods: {
    initG6(data) {
      var container = document.getElementById('g6-container')
      const { Util } = G6
      const width = container.scrollWidth;
      const height = container.scrollHeight || 500;
      const fittingString = (str, maxWidth, fontSize) => {
        const ellipsis = '...'
        const ellipsisLength = G6.Util.getTextSize(ellipsis, fontSize)[0]
        let currentWidth = 0
        let res = str
        const pattern = new RegExp('[\u4E00-\u9FA5]+')
        str.split('').forEach((letter, i) => {
          if (currentWidth > maxWidth - ellipsisLength) return
          if (pattern.test(letter)) {
            currentWidth += fontSize
          } else {
            currentWidth += G6.Util.getLetterWidth(letter, fontSize)
          }
          if (currentWidth > maxWidth - ellipsisLength) {
            res = `${str.substr(0, i)}${ellipsis}`
          }
        })
        return res
      }
      // 获取文本的长度
      const getTextSize = (str, maxWidth) => {
        let width = G6.Util.getTextSize(str, fontSize)[0]
        return width > maxWidth ? maxWidth : width
      }
      G6.registerNode(
        'project', {
          jsx: (cfg) => {
            return `
            <group>
              <rect draggable="true" style={{
                width: 100, height: 30, fill: '#FEF1CF', stroke: '#FED578', radius: [6, 6, 6, 6]
              }}>
                <text style={{ fontSize: 10, marginLeft: 14,  marginTop: 6, overflow: hidden }}>${fittingString(cfg.label, 130, 16)}</text>
              </rect>
            </group>
          `;
          },
          getAnchorPoints() {
            return [
              [0, 0.5],
              [1, 0.5],
            ];
          }
        },
        'single-node',
      )

      const graph = new G6.TreeGraph({
        container: 'g6-container',
        width,
        height,
        fitView: true,
        fitViewPadding: [10, 20],
        minZoom: 0.5,
        modes: {
        default: [
            'drag-canvas',
            'zoom-canvas',
          ],
        },
        plugins: [tooltip],
	layout: {
        type: 'mindmap',
        direction: 'H', // 排列方向
        getHeight: () => {
            return 16;
        },
        getWidth: () => {
            return 26;
        },
        getVGap: () => { // 节点纵向间距的回调函数
            return 10;
        },
        getHGap: () => { // 节点横向间距的回调函数
            return 80;
          }
        },
      })

        let centerX = 0;
        graph.node(node => {
            if (node.isRoot) {
               centerX = node.x;
            }
            const item = {
            label: node.label,
            type: 'project',
            labelCfg: {
            style: {
              fontSize: node.children ? 8 : 6,
              fill: '#081B26',
            },
            position: 'center'
	    offset: !node.children ? -26 : 10
            },
        }
        return item
      })
      // 动态设置边
      graph.edge((edge) => {
	const item =  {
          id: edge.id,
          type: 'polyline',
          labelCfg: {
            style: {
              fontSize: 8,
              fill: '#081B26',
              lineWidth: 2,
              startArrow: {
                path: G6.Arrow.triangle(10, 10, 0),
                d: 0,
                fill: '#0B5FFE',
                stroke: '#0B5FFE',
                lineWidth: 1,
              }
            },
          },
          style: {
            lineWidth: 2,
            radius: 4,
	    stroke: 'l(0) 0:#21CADD 0.5:#31CABB 1:#F5CA0E',
          },
        }
        return item
    })
    graph.data(data)
    graph.render()
    graph.fitView()
    if (typeof window !== 'undefined')
    window.onresize = () => {
	if (!graph || graph.get('destroyed')) return
	if (!container || !container.scrollWidth || !container.scrollHeight) return
	graph.changeSize(container.scrollWidth, container.scrollHeight)
        };
    },
  },
  mounted() {
    this.initG6(this.list)
  }
}
</script>
<style scoped>
.g6-container {
  width: 100%;
  height: 400px;
}
</style>