-1

所以我的代码工作得很好我的数组语法正确一切都很好

但我发现自己在(in <Chart data = ) 中手动对数据进行硬编码JSX

问题

现在我有 20 个元素,我将不得不手动对其进行硬编码,这不是很有效.. 有没有更好的方法来做到这一点?

import React from 'react'
import Chart from "react-google-charts"
import {useSelector} from 'react-redux'
const Graph = () => {

    const products = useSelector(state => state.products)

    const colors = ['#51e2f5','#9df9ef','#edf756','#ffa8B6','#a28089','#a0d2eb','#e5eaf5','#d0bdf4','#8458B3','#a28089']
    for(var i=0;i<10;i++) {
        products[i].color = colors[i]
    }
    for(i =10;i<20;i++) {
        products[i].color = colors[i-10]
    }
    const arr = products.map((prod) => {
        return [prod.productName,parseInt(prod.price),prod.color,null]
    })

    return (
        <Chart
        {...console.log(arr[0])}
            width={'500px'}
            height={'300px'}
            chartType="BarChart"
            loader={<div>Loading Chart</div>}
            data={[
                [
                    'Element',
                    'Density',
                    { role: 'style' },
                    {
                        sourceColumn: 0,
                        role: 'annotation',
                        type: 'string',
                        calc: 'stringify',
                    },
                ],
                // ['Copper', 8.94, '#b87333', null],
                // ['Silver', 10.49, 'silver', null],       // this is the data format expected
                // ['Gold', 19.3, 'gold', null],
                // ['Platinum', 21.45, 'color: #e5e4e2', null],

                [arr[0][0],arr[0][1],arr[0][2],arr[0][3]],
                [arr[1][0],arr[1][1],arr[1][2],arr[1][3]],      // i want to do this 20 times i.e first index goes till 20 (now going till 3)
                [arr[2][0],arr[2][1],arr[2][2],arr[2][3]],
                [arr[3][0],arr[3][1],arr[3][2],arr[3][3]],


            ]}
            options={{
                title: 'Density of Precious Metals, in g/cm^3',
                width: 600,
                height: 400,
                bar: { groupWidth: '95%' },
                legend: { position: 'none' },
            }}
            // For tests
            rootProps={{ 'data-testid': '6' }}
        />
    )
}

export default Graph
4

2 回答 2

2

您可以使用扩展运算符

   data={[
            [
                'Element',
                'Density',
                { role: 'style' },
                {
                    sourceColumn: 0,
                    role: 'annotation',
                    type: 'string',
                    calc: 'stringify',
                },
            ],

            ...arr


        ]}
于 2020-08-24T14:17:08.470 回答
1

我最近在做一个类似的项目。我通过 AJAX 获取 JSON 数据,然后需要构建自己的函数以 Google Chart 接受的形式创建数据。

无需在 data 属性中硬编码该数据,只需创建一个需要以正确格式生成数组的函数。然后该函数应该返回您需要的数据并在 data 属性中使用它。

您的硬编码方法很好,但是将其转换为函数就可以了。我所做的是将数据存储在状态中,以防数据发生变化。

于 2020-08-24T14:26:03.753 回答