Can I make dynamic styles in React Native?

后端 未结 15 2181
别跟我提以往
别跟我提以往 2020-12-12 15:24

Say I have a component with a render like this:


Where jewelStyle =

  {
    bo         


        
相关标签:
15条回答
  • 2020-12-12 15:56

    I know this is extremely late, but for anyone still wondering here's an easy solution.

    You could just make an array for the styles :

    this.state ={
       color: "#fff"
    }
    
    style={[
      styles.jewelstyle, {
      backgroundColor: this.state.BGcolor
    }
    

    The second will override any original background color as stated in the stylesheet. Then have a function that changes the color:

    generateNewColor(){
      var randomColor = '#'+Math.floor(Math.random()*16777215).toString(16);
      this.setState({BGcolor: randomColor})
    }
    

    This will generate a random hex color. Then just call that function whenever and bam, new background color.

    0 讨论(0)
  • 2020-12-12 15:59

    You'll want something like this:

    var RandomBgApp = React.createClass({
        render: function() {
    
            var getRandomColor = function() {
                var letters = '0123456789ABCDEF'.split('');
                var color = '#';
                for (var i = 0; i < 6; i++ ) {
                    color += letters[Math.floor(Math.random() * 16)];
                }
                return color;
            };
    
            var rows = [
                { name: 'row 1'},
                { name: 'row 2'},
                { name: 'row 3'}
            ];
    
            var rowNodes = rows.map(function(row) {
                return <Text style={{backgroundColor:getRandomColor()}}>{row.name}</Text>
            });
    
            return (
                <View>
                    {rowNodes}
                </View>
            );
    
        }
    });
    

    In this example I take the rows array, containing the data for the rows in the component, and map it into an array of Text components. I use inline styles to call the getRandomColor function every time I create a new Text component.

    The issue with your code is that you define the style once and therefore getRandomColor only gets called once - when you define the style.

    0 讨论(0)
  • 2020-12-12 15:59

    I know there are several answers, but i think the best and most simple is using a state "To change" is the state purpose.

    export default class App extends Component {
        constructor(props) {
          super(props);
          this.state = {
              style: {
                  backgroundColor: "white"
              }
          };
        }
        onPress = function() {
          this.setState({style: {backgroundColor: "red"}});
        }
        render() {
           return (
              ...
              <View style={this.state.style}></View>
              ...
           )
        }
    

    }

    0 讨论(0)
  • 2020-12-12 16:01

    Yes you can and actually, you should use StyleSheet.create to create your styles.

    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;
    

    And then:

    <Header title="HOME" style={ {backgroundColor: '#10f1f0'} } />
    
    0 讨论(0)
  • 2020-12-12 16:01

    The easiest is mine:

    <TextInput
      style={[
        styles.default,
        this.props.singleSourceOfTruth ?
        { backgroundColor: 'black' } 
        : { backgroundColor: 'white' }
    ]}/>
    
    0 讨论(0)
  • 2020-12-12 16:03

    Using object spread operator "..." worked for me:

    <View style={{...jewelStyle, ...{'backgroundColor': getRandomColor()}}}></View>
    
    0 讨论(0)
提交回复
热议问题