Vue-Flow自定义MarkEnd MarkStrat

问题描述

在使用Vue-Flow的时候我想实现一些自定义的markend或markstart,但是又不想自己写一个路径算法,于是我根据官方提供的组件进行加工

如图: 我想是实现实心箭头路径但是使用smoothstep路径,其实只需要引入组件后再加上箭头的path路径即可

代码

我们先新建一个vue组件来写edge

<template>
    <g>
        <!-- 圆形markStart -->
        <circle :cx="props.sourceX" :cy="props.sourceY" r="4" fill="#29a3ff" />
        <!-- path -->
        <path :d="path" fill="none" stroke="#29a3ff" stroke-width="2" />
        <!-- 箭头markEnd -->
        <path :transform="transform" :d="`M ${targetX} ${targetY + 2} L ${targetX - 5} ${targetY - 10} L ${targetX + 5} ${targetY - 10} Z`" fill="#29a3ff" stroke="none" />
    </g>
</template>

<script lang="ts" setup>
import { getSmoothStepPath, SmoothStepEdgeProps } from '@vue-flow/core'
import { computed } from 'vue';

const props = defineProps<SmoothStepEdgeProps>()
const path = computed(() => getSmoothStepPath(props)[0])

const transform = computed(() => {
    return getArrowTransform(props)
})

function getArrowTransform(props: SmoothStepEdgeProps) {
    const { targetPosition } = props
    if (targetPosition === 'top') {
        return `rotate(0 ${props.targetX} ${props.targetY})`
    }
    if (targetPosition === 'bottom') {
        return `rotate(180 ${props.targetX} ${props.targetY})`
    }
    if (targetPosition === 'left') {
        return `rotate(-90 ${props.targetX} ${props.targetY})`
    }
    if (targetPosition === 'right') {
        return `rotate(90 ${props.targetX} ${props.targetY})`
    }
}
</script>

如代码所示 我们使用了getSmoothStepPath方法来获取连线的路径信息,然后通过props传递的数据拿到目标点的位置和连接方法从而旋转和绘制三角形达到目的,当然你也可以使用path绘制更多花里胡哨的mark

之后在主组件的插槽中使用这个edge即可

<template #edge-custom="props">
  <CustomEdge v-bind="props" />
</template>
<template #connection-line="props">
  <CustomEdge v-bind="props" />
</template>

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值