[css] React Native에서 동적 스타일을 만들 수 있습니까?
다음과 같은 렌더링이있는 구성 요소가 있다고 가정합니다.
<View style={jewelStyle}></View>
여기서 jewelStyle =
{
borderRadius: 10,
backgroundColor: '#FFEFCC',
width: 20,
height: 20,
},
배경색을 동적으로 만들고 무작위로 할당하려면 어떻게해야합니까? 난 노력 했어
{
borderRadius: 10,
backgroundColor: getRandomColor(),
width: 20,
height: 20,
},
그러나 이것은 View의 모든 인스턴스가 동일한 색상을 갖도록 만듭니다. 각 인스턴스가 고유하기를 바랍니다.
팁이 있습니까?
답변
나는 보통 다음과 같은 일을한다.
<View style={this.jewelStyle()} />
…
jewelStyle = function(options) {
return {
borderRadius: 12,
background: randomColor(),
}
}
뷰가 렌더링 될 때마다 새로운 스타일 객체가 연관된 임의의 색상으로 인스턴스화됩니다. 물론 이것은 구성 요소가 다시 렌더링 될 때마다 색상이 변경된다는 것을 의미합니다. 대신 다음과 같이 할 수 있습니다.
var myColor = randomColor()
<View style={jewelStyle(myColor)} />
…
jewelStyle = function(myColor) {
return {
borderRadius: 10,
background: myColor,
}
}
답변
예, 가능하며 실제로 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'} } />
답변
여전히 활용하고 싶다면 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' }
]}/>
답변
구문 상 문제가있었습니다. 이것은 나를 위해 일했습니다.
<Text style={[styles.textStyle,{color: 'red'}]}> Hello </Text>
const styles = StyleSheet.create({
textStyle :{
textAlign: 'center',
fontFamily: 'Arial',
fontSize: 16
}
});
답변
다음과 같은 것을 원할 것입니다.
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>
);
}
});
이 예에서는 구성 요소의 행에 대한 데이터를 포함하는 행 배열을 가져 와서 텍스트 구성 요소의 배열에 매핑합니다. getRandomColor
새 텍스트 구성 요소를 만들 때마다 인라인 스타일을 사용하여 함수 를 호출합니다 .
코드의 문제는 스타일을 한 번 정의하므로 스타일을 정의 할 때 getRandomColor가 한 번만 호출된다는 것입니다.
답변
나는 이것이 매우 늦다는 것을 알고 있지만 여전히 궁금한 사람에게는 쉬운 해결책이 있습니다.
스타일에 대한 배열을 만들 수 있습니다.
this.state ={
color: "#fff"
}
style={[
styles.jewelstyle, {
backgroundColor: this.state.BGcolor
}
두 번째는 스타일 시트에 명시된대로 원래 배경색을 재정의합니다. 그런 다음 색상을 변경하는 기능이 있습니다.
generateNewColor(){
var randomColor = '#'+Math.floor(Math.random()*16777215).toString(16);
this.setState({BGcolor: randomColor})
}
이것은 임의의 16 진수 색상을 생성합니다. 그런 다음 언제든지 해당 함수를 호출하고 새로운 배경색을 바릅니다.