【问题标题】:react js svg linearGradient not rendering correct value反应js svg linearGradient没有呈现正确的值
【发布时间】:2020-03-27 05:41:20
【问题描述】:

我有一个组件,我在其中渲染 SVG 路径和通过父组件从静态数据提供的 linearGradient 值。这些属性称为“startColor”和“stopColor”,主要用于渐变的开始和停止颜色。

当我控制台记录每个对象的值时,它们是正确的,但是它们没有按预期呈现。请注意 dataTwo 对象的值是不同的。

我怀疑在渲染第一个对象的第一个值是所有组件都使用的值。我已经对此进行了测试,似乎是这样。

如何让每个圆圈呈现数据中提供的正确渐变颜色?

数据结构:

    const dataOne = [
    {
        title: 'Cpu utilisation',
        graph: 65,
        noBorder: false,
        noMargin: false,
        startColor: '#2DC0FF',
        stopColor: '#0160B2'
    },
    {
        title: 'Memory utilisation',
        graph: 65,
        noBorder: true,
        noMargin: true,
        startColor: '#2DC0FF',
        stopColor: '#0160B2'
    },
]

const dataTwo = [
    {
        title: 'Warnings today',
        graph: 65,
        noBorder: false,
        noMargin: false,
        startColor: '#fa9100',
        stopColor: '#ffc14f'
    },
    {
        title: 'Errors today',
        graph: 65,
        noBorder: true,
        noMargin: true,
        startColor: '#fa9100',
        stopColor: '#ffc14f'
    },
]

组件用法:

<div className="tab-info-body large">
    <DoubleGraph data={dataOne} />                              
</div>
<div className="tab-info-body large">
    <DoubleGraph data={dataTwo} />                              
</div>

组件代码:

render() {
        const { data, title, startColor, stopColor } = this.props;
        const { value, valueOne, valueTwo, hidden, visible, valueOneYPos, valueTwoYPos, valueOneHidden, valueTwoHidden, dashArray, dashArrayBorder } = this.state;
        const styleOne = { transform: `translate(0px, ${valueOneYPos}px)` };
        const styleTwo = { transform: `translate(0px, ${valueTwoYPos}px)` };

        return (
            <div className="double-graph-wrap">
                <div className="flex">
                    {data.map((item, i) => {
                        console.log("give me colour", item.startColor)
                        return (
                            <div className={classNames('wrap', { noBorder: item.noBorder, noMargin: item.noMargin})}>
                                {i === 1 &&<div className="border-test"></div>}
                                <span className="title">{item.title}</span>
                                <div className="graph-wrap">
                                    <div className="graph">
                                        <div className="value-wrap">
                                            <div className="values">
                                                <span style={styleOne} className={classNames("valueOne", {hidden: valueOneHidden})}>{valueOne}</span>
                                                <span style={styleTwo} className={classNames("valueTwo", {hidden: valueTwoHidden})}>{valueTwo}</span>
                                            </div>
                                        </div>
                                        <div class="single-chart">
                                            <div style={{ background: 'black', width: 100, height: 100}}>{item.startColor}</div>
                                            <svg viewBox="0 0 36 36" class="circular-chart orange">
                                            <defs>
                                              <linearGradient id='grad'>
                                                <stop stop-color={item.startColor} />
                                                <stop offset='100%' stop-color={item.stopColor} />
                                              </linearGradient>
                                              </defs>
                                                <path class="circle-bg"
                                                    d="M18 2.0845
                                                    a 15.9155 15.9155 0 0 1 0 31.831
                                                    a 15.9155 15.9155 0 0 1 0 -31.831"
                                                />
                                                    <path class="borderTwo"
                                                    stroke-dasharray={dashArrayBorder}
                                                    d="M18 2.0845
                                                    a 15.9155 15.9155 0 0 1 0 31.831 
                                                    a 15.9155 15.9155 0 0 1 0 -31.831"
                                                />
                                                <path class="circle"
                                                    stroke-dasharray={dashArray}
                                                    d="M18 2.0845
                                                    a 15.9155 15.9155 0 0 1 0 31.831 
                                                    a 15.9155 15.9155 0 0 1 0 -31.831"
                                                />
                                                <path class="borderOne"
                                                    stroke-dasharray="1, 100"
                                                    d="M18 2.0845
                                                    a 15.9155 15.9155 0 0 1 0 31.831 
                                                    a 15.9155 15.9155 0 0 1 0 -31.831"
                                                />
                                                <path class="average"
                                                stroke-dasharray="1, 100"
                                                    d="M18 2.0845
                                                    a 15.9155 15.9155 0 0 1 0 31.831"
                                                />
                                            </svg>

                                        </div>
                                    </div>
                                </div>
                            </div>
                        )
                    })}
                </div>
            </div>
        )
    }

【问题讨论】:

  • 使用唯一的 id 值而不是硬编码 id='grad'
  • 非常感谢,我在数据对象中添加了一个 id,监听了 id 并根据 ID 更改了父 className 以呈现正确的笔画。再次感谢!

标签: javascript css reactjs svg linear-gradients


【解决方案1】:

我也遇到了这个问题,提到的问题和修复Filth 对我帮助很大。

这里真正的问题是浏览器希望 id 是唯一的。 结果可能取决于浏览器(我们注意到 chrome 和 safari 之间的差异)。

具有相同的 id (see it here) 对 chrome (83.0.4103.97 debian) 中的所有圆圈使用相同的颜色渐变。

您实际上可以通过运行 document.getElementById("yourid") 看到这一点,您应该注意到该元素是用于所有渐变的元素。

注意:为了简化我添加了一个填充。

                        <path
                      class="average"
                      stroke-dasharray="1, 100"
                      d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831"
                      fill={`url(#${item.id})`}

解决此问题的方法是使用唯一 id 填充 see it working here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    相关资源
    最近更新 更多