我目前有两个变量定义SVG元素. 我在两者之间变形有困难,我try 了Reaction-SVG-Morph,但是圆圈在每次渲染时都会消失. 渲染变形的最佳方式是什么?

这是我的设置:

    let hexagonShape = <svg width="100%" height="100%" viewBox="0 0 15 15" fill="green" xmlns="http://www.w3.org/2000/svg">
                            <path d="M1.5 4.5V10.5L7.5 14L13.5 10.5V4.5L7.5 1L1.5 4.5Z" stroke="green" strokeWidth=".6" />
                        </svg>
    let circleShape = <svg height="100%" width="100%" viewBox="0 0 15 15" fill='blue' xmlns="http://www.w3.org/2000/svg">
                            <circle cy="50%" cx="50%" r="49%" stroke="blue" strokeWidth=".3" />
                        </svg>

    const [updatedSvg, setUpdatedSvg] = useState(0)
    const [updatedCircleSvg, setUpdatedCircleSvg] = useState()
    const [updatedHexagonSvg, setUpdatedHexagonSvg] = useState()


    function changeSvg() {

        if (updatedSvg === 0) {
            setUpdatedCircleSvg(true)
            setUpdatedHexagonSvg(false)
        }
        if (updatedSvg === 1) {
            setUpdatedCircleSvg(false)
            setUpdatedHexagonSvg(true)
        }
    }

    useEffect(() => {
        changeSvg()
    }, [updatedSvg]) 

我有两个简单的按钮,可以在两个svg渲染之间切换:

        <div className={classes.container}>
            <div className={classes.shape}>
            {/* this is where the svgs are being rendered */}
                {updatedCircleSvg && circleShape }
                {updatedHexagonSvg && hexagonShape}
            </div>
            <button onClick={() => setUpdatedSvg(0)}>circle</button>
            <button onClick={() => setUpdatedSvg(1)}>hexagon</button>
        </div>

一点方向会有很大帮助的.谢谢

推荐答案

以下是使用二次Bezier曲线的简单示例:

const getPoints = radius => {
  const factor = Math.sqrt(3);
  return [
    {x: 0, y: -radius},
    {x: radius / factor, y: -radius},
    {x: radius * factor / 2, y: -radius / 2},
    {x: radius * 2 / factor, y: 0},
    {x: radius * factor / 2, y: radius / 2},
    {x: radius / factor, y: radius},
    {x: 0, y: radius},
    {x: -radius / factor, y: radius},
    {x: -radius * factor / 2, y: radius / 2},
    {x: -radius * 2 / factor, y: 0},
    {x: -radius * factor / 2, y: -radius / 2},              
    {x: -radius / factor, y: -radius}
  ];
}


const getRoundPath = radius => {
  const p = getPoints(radius);
  return `M ${p[0].x},${p[0].y} 
    Q ${p[1].x},${p[1].y} ${p[2].x},${p[2].y} 
    Q ${p[3].x},${p[3].y} ${p[4].x},${p[4].y} 
    Q ${p[5].x},${p[5].y} ${p[6].x},${p[6].y} 
    Q ${p[7].x},${p[7].y} ${p[8].x},${p[8].y} 
    Q ${p[9].x},${p[9].y} ${p[10].x},${p[10].y} 
    Q ${p[11].x},${p[11].y} ${p[0].x},${p[0].y}`
};

const getHexagonPath = radius => {
  const p = getPoints(radius);
  for (let index = 1; index < 12; index += 2) {
    const prev = p[index - 1];
    const next = p[(index + 1) % 12];
    p[index].x = (prev.x + next.x) / 2;
    p[index].y = (prev.y + next.y) / 2;
  }
  return `M ${p[0].x},${p[0].y} 
    Q ${p[1].x},${p[1].y} ${p[2].x},${p[2].y} 
    Q ${p[3].x},${p[3].y} ${p[4].x},${p[4].y} 
    Q ${p[5].x},${p[5].y} ${p[6].x},${p[6].y} 
    Q ${p[7].x},${p[7].y} ${p[8].x},${p[8].y} 
    Q ${p[9].x},${p[9].y} ${p[10].x},${p[10].y} 
    Q ${p[11].x},${p[11].y} ${p[0].x},${p[0].y}`
}

const morphPath = (toHex) => {
  const path = toHex ? getHexagonPath(80) : getRoundPath(80);
  d3.select('path')
    .transition()
    .duration(750)
    .attr('d', path);
  setTimeout(() => morphPath(!toHex), 1000);
};

d3.select('path').attr('d', getRoundPath(80))

morphPath(true);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<svg width="200" height="200">
  <g transform="translate(100,100)">     
    <path />
  </g>
</svg>

Javascript相关问答推荐

即使设置了父级的最大高度,固定位置的分区内容也不会滚动?

布局样式在刷新时不持续

积分计算和 colored颜色 判断错误

在JavaScript中对大型级联数组进行切片的最有效方法?

类型脚本中只有字符串或数字键而不是符号键的对象

基于变量切换隐藏文本

使用JavaScript重新排序行

仅针对RTK查询中的未经授权的错误取消maxRetries

有没有可能使滑动img动画以更快的速度连续?

环境值在.js文件/Next.js中不起作用

使用auth.js保护API路由的Next.JS,FETCH()不起作用

无法避免UV:flat的插值:非法使用保留字"

有效路径同时显示有效路径组件和不存在的路径组件

使用自动识别发出信号(&Q)

react -原生向量-图标笔划宽度

有没有办法更改Chart.js 3.x.x中主要刻度的字体?

在Java脚本中构建接口的对象

Promise.race()返回已解析的promise ,而不是第一个被拒绝的promise

React数组查找不读取变量

Played link-Initialize.js永远显示加载符号