反应js svg linearGradient不呈现正确的值

时间:2019-12-02 15:16:19

标签: javascript css reactjs svg linear-gradients

我有一个要在其中渲染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>
        )
    }

1 个答案:

答案 0 :(得分:0)

我也遇到了这个问题,提到的问题和解决方法Filth对我很有帮助。

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

具有相同ID(see it here)的铬中所有圆使用相同的颜色渐变(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