我可以在 React Native 中制作动态样式吗?

IT技术 css reactjs react-native
2021-04-21 16:02:07

假设我有一个带有这样渲染的组件:

<View style={jewelStyle}></View>

其中jewelStyle =

  {
    borderRadius: 10,
    backgroundColor: '#FFEFCC',
    width: 20,
    height: 20,
  },

我怎样才能使背景颜色动态和随机分配?我试过了

  {
    borderRadius: 10,
    backgroundColor: getRandomColor(),
    width: 20,
    height: 20,
  },

但这使得 View 的所有实例都具有相同的颜色,我希望每个实例都是独一无二的。

有小费吗?

6个回答

我通常会按照以下方式做一些事情:

<View style={this.jewelStyle()} />

...

jewelStyle = function(options) {
   return {
     borderRadius: 12,
     background: randomColor(),
   }
 }

每次渲染 View 时,都会使用与其关联的随机颜色实例化一个新的样式对象。当然,这意味着每次重新渲染组件时颜色都会改变,这可能不是您想要的。相反,您可以执行以下操作:

var myColor = randomColor()
<View style={jewelStyle(myColor)} />

...

jewelStyle = function(myColor) {
   return {
     borderRadius: 10,
     background: myColor,
   }
 }
使用 Stylesheet.create 对性能有很大好处吗?
2021-05-22 16:02:07
@DominicTobias Stylesheet.create 将样式打包并“发送”到本地区域一次。这意味着当您多次重用相同的样式或多次加载相同的组件时,它将重用该样式而不是再次打包和“发送”。例如,如果您正在加载 3000 个样式行,您会感觉到性能的显着提升。
2021-05-28 16:02:07
此方法根本不使用样式表。Stylesheet.create()无论如何,那些声明样式表的目的是什么
2021-06-08 16:02:07
@fatuhoku 当您需要在多个地方重用相同的样式时,这很好
2021-06-14 16:02:07

是的,您可以,实际上,您应该使用它StyleSheet.create来创建您的样式。

import React, { Component } from 'react';
import {
    StyleSheet,
    Text,
    View
} from 'react-native';    

class Header extends Component {
    constructor(props){
        super(props);
    }    

    render() {
        const { title, style } = this.props;
        const { header, text } = defaultStyle;
        const combineStyles = StyleSheet.flatten([header, style]);    

        return (
            <View style={ combineStyles }>
                <Text style={ text }>
                    { title }
                </Text>
            </View>
        );
    }
}    

const defaultStyle = StyleSheet.create({
    header: {
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#fff',
        height: 60,
        paddingTop: 15,
        shadowColor: '#000',
        shadowOffset: { width: 0, height: 3 },
        shadowOpacity: 0.4,
        elevation: 2,
        position: 'relative'
    },
    text: {
        color: '#0d4220',
        fontSize: 16
    }
});    

export default Header;

接着:

<Header title="HOME" style={ {backgroundColor: '#10f1f0'} } />
此答案显示了一个很好的示例,其中在样式表中定义了样式,但稍后可以在组件中覆盖
2021-06-01 16:02:07
AFAIK 使用StyleSheet.flatten只是丢弃StyleSheet.create了文档中所述的任何优化:“注意:谨慎使用,因为滥用它会在优化方面给您带来负担。ID 通常通过桥接和内存启用优化。直接引用样式对象将剥夺您这些优化。” facebook.github.io/react-native/docs/stylesheet.html)。
2021-06-02 16:02:07
使用 flatten 有什么好处..如果我喜欢style={[header, style]}怎么
2021-06-11 16:02:07
我认为您正在寻找的方法StyleSheet.compose不是StyleSheet.flatten将 2 个样式对象组合在一起(或组合它们......)。我还没有查看源代码来确认这是否比简单地将一组样式对象传递到styleprop 中是否有任何好处,但它绝对应该胜过,flatten因为这实际上是从created样式对象中查找原始样式值
2021-06-14 16:02:07

如果您仍然想利用StyleSheet.create并拥有动态样式,请尝试以下操作:

const Circle = ({initial}) => {


const initial = user.pending ? user.email[0] : user.firstName[0];

    const colorStyles = {
        backgroundColor: randomColor()
    };

    return (
        <View style={[styles.circle, colorStyles]}>
            <Text style={styles.text}>{initial.toUpperCase()}</Text>
        </View>
    );
};

const styles = StyleSheet.create({
    circle: {
        height: 40,
        width: 40,
        borderRadius: 30,
        overflow: 'hidden'
    },
    text: {
        fontSize: 12,
        lineHeight: 40,
        color: '#fff',
        textAlign: 'center'
    }
});

请注意如何将 的style属性View设置为将样式表与动态样式组合在一起的数组。

最简单的是我的:

<TextInput
  style={[
    styles.default,
    this.props.singleSourceOfTruth ?
    { backgroundColor: 'black' } 
    : { backgroundColor: 'white' }
]}/>
太棒了,确实很棒。也可以使用此解决方案覆盖属性,对吗?最后一个覆盖前一个
2021-05-22 16:02:07
我编辑了发布的答案以符合@Sarahcartenz 评论
2021-06-18 16:02:07

在语法上有一些问题。这对我有用

<Text style={[styles.textStyle,{color: 'red'}]}> Hello </Text>

const styles = StyleSheet.create({
   textStyle :{
      textAlign: 'center',   
      fontFamily: 'Arial',
      fontSize: 16
  }
  });
谢谢@Yogesh,这正是我正在寻找的。我想利用样式,但能够在我需要的东西上添加更多。
2021-06-04 16:02:07