为数据分配颜色

时间:2018-08-09 18:02:04

标签: javascript reactjs react-native non-repetitive

是否有一种有效的方式通过考虑传递的值来为元素分配颜色,而无需对每个组件重复执行代码?

例如,我有这个:

  • 如果value :'high'的文字颜色应为red

  • 如果value :'low'的文字颜色应为green

  • 等...

这是我的代码,但是我必须在所有组件中添加switch语句,并且看起来很混乱,尤其是要添加更多颜色。

const list1 = [
    {
      title: 'One',
      temperature: 'very high',
    },
    {
      title: 'Two',
      temperature: 'high',
    },
    {
      title: 'Three',
      temperature: 'medium',
    },
    {
      title: 'Four',
      temperature: 'low',
    },
    {
      title: 'Five',
      temperature: 'very low',
    },
];

export default class Regional extends Component {
    constructor(props) {
        super(props);
        this.state ={
            dataSource: list1
        }
    }

  render() {
        const { dataSource } = this.state;

        const showData = dataSource.map((l, i) => {
            let myColor = 'blue';

            switch (l.temperature) {
                case 'high':
                    myColor = 'red';
                    break;
                case 'medium':
                    myColor = 'yellow';
                    break;
                case 'low':
                    myColor = 'green';
                    break;  
                default:
                    myColor = 'grey';
            }
            return(
            <View style={{flex: 1, flexDirection: 'column'}} key={i}>
                <Text style={{flex: 1, color:myColor}}>{l.temperature}</Text>
            </View>
            )
        })

        return (
            <View>
                {showData}
            </View>
        )
  }
}

这很好用,但是我在很多组件中都有它。

如果这是最好的解决方案而又不复杂,那么我对此并不满意,因为它只是重复和多余的行。

任何建议都值得赞赏。谢谢!

1 个答案:

答案 0 :(得分:2)

您可能有一个对象colors,其中的键是不同的温度,值是颜色。如果温度不是对象的属性,则可以回退到'grey'

const colors = {
  high: "red",
  medium: "yellow",
  low: "green"
};

class Regional extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      dataSource: list1
    };
  }

  render() {
    const { dataSource } = this.state;

    const showData = dataSource.map((l, i) => {
      let myColor = colors[l.temperature] || "grey";

      return (
        <View style={{ flex: 1, flexDirection: "column" }} key={i}>
          <Text style={{ flex: 1, color: myColor }}>{l.temperature}</Text>
        </View>
      );
    });

    return <View>{showData}</View>;
  }
}