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
스타일 시트와 동적 스타일을 결합하는 배열로 설정되는 방법에 유의하십시오.
구문 상 문제가있었습니다. 이것은 나를 위해 일했다
<Text style={StyleSheet.flatten([styles.textStyle,{color: 'red'}])}> Hello </Text>
const styles = StyleSheet.create({
textStyle :{
textAlign: 'center',
fontFamily: 'Arial',
fontSize: 16
}
});
가장 쉬운 방법은 내 것입니다.
<TextInput
style={[
styles.default,
this.props.singleSourceOfTruth ?
{ backgroundColor: 'black' }
: { backgroundColor: 'white' }
]}/>
다음과 같은 것을 원할 것입니다 :
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가 한 번만 호출된다는 것입니다.
몇 가지 대답이 있다는 것을 알고 있지만 가장 좋고 가장 간단한 방법은 상태를 사용하는 것입니다. "변경하려면"이 상태 목적입니다.
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>
...
)
}
}
상태 값을 스타일 객체에 직접 바인딩 할 수 있습니다. 예를 들면 다음과 같습니다.
class Timer extends Component{
constructor(props){
super(props);
this.state = {timer: 0, color: '#FF0000'};
setInterval(() => {
this.setState({timer: this.state.timer + 1, color: this.state.timer % 2 == 0 ? '#FF0000' : '#0000FF'});
}, 1000);
}
render(){
return (
<View>
<Text>Timer:</Text>
<Text style={{backgroundColor: this.state.color}}>{this.state.timer}</Text>
</View>
);
}
}
Yes, you can make dynamic styles. You can pass values from Components.
First create StyleSheetFactory.js
import { StyleSheet } from "react-native";
export default class StyleSheetFactory {
static getSheet(backColor) {
return StyleSheet.create({
jewelStyle: {
borderRadius: 10,
backgroundColor: backColor,
width: 20,
height: 20,
}
})
}
}
then use it in your component following way
import React from "react";
import { View } from "react-native";
import StyleSheetFactory from './StyleSheetFactory'
class Main extends React.Component {
getRandomColor = () => {
var letters = "0123456789ABCDEF";
var color = "#";
for (var i = 0; i < 6; i++) {
color += letters[Math.floor(Math.random() * 16)];
}
return color;
};
render() {
return (
<View>
<View
style={StyleSheetFactory.getSheet(this.getRandomColor()).jewelStyle}
/>
<View
style={StyleSheetFactory.getSheet(this.getRandomColor()).jewelStyle}
/>
<View
style={StyleSheetFactory.getSheet(this.getRandomColor()).jewelStyle}
/>
</View>
);
}
}
Using object spread operator "..." worked for me:
<View style={{...jewelStyle, ...{'backgroundColor': getRandomColor()}}}></View>
If you are using a screen with filters for example, and you want to set the background of the filter regarding if it was selected or not, you can do:
<TouchableOpacity style={this.props.venueFilters.includes('Bar')?styles.filterBtnActive:styles.filterBtn} onPress={()=>this.setFilter('Bar')}>
<Text numberOfLines={1}>
Bar
</Text>
</TouchableOpacity>
On which set filter is:
setVenueFilter(filter){
var filters = this.props.venueFilters;
filters.push(filter);
console.log(filters.includes('Bar'), "Inclui Bar");
this.setState(previousState => {
return { updateFilter: !previousState.updateFilter };
});
this.props.setVenueFilter(filters);
}
PS: the function this.props.setVenueFilter(filters)
is a redux action, and this.props.venueFilters
is a redux state.
In case someone needs to apply conditions
selectedMenuUI = function(value) {
if(value==this.state.selectedMenu){
return {
flexDirection: 'row',
alignItems: 'center',
paddingHorizontal: 20,
paddingVertical: 10,
backgroundColor: 'rgba(255,255,255,0.3)',
borderRadius: 5
}
}
return {
flexDirection: 'row',
alignItems: 'center',
paddingHorizontal: 20,
paddingVertical: 10
}
}
참고URL : https://stackoverflow.com/questions/29363671/can-i-make-dynamic-styles-in-react-native
'IT story' 카테고리의 다른 글
JsonRequestBehavior를 AllowGet으로 설정할 때 어떤 '민감한 정보'가 공개 될 수 있습니까? (0) | 2020.08.07 |
---|---|
비동기 대기 반환 작업 (0) | 2020.08.07 |
배열에서 값의 인덱스 찾기 (0) | 2020.08.07 |
WordPress는 홈페이지를 제외한 모든 페이지에서 404 페이지를 찾을 수 없습니다. (0) | 2020.08.07 |
BufferedImage를 파일로 저장하는 방법 (0) | 2020.08.07 |