[TOC]

概述

在 React Native 中,你并不需要学习什么特殊的语法来定义样式。我们仍然是使用 JavaScript 来写样式。所有的核心组件都接受名为style的属性。这些样式名基本上是遵循了 web 上的 CSS 的命名,只是按照 JS 的语法要求使用了驼峰命名法,例如将background-color改为backgroundColor。

style属性可以是一个普通的 JavaScript 对象。这是最简单的用法,因而在示例代码中很常见。你还可以传入一个数组——在数组中位置居后的样式对象比居前的优先级更高,这样你可以间接实现样式的继承。

实际开发中组件的样式会越来越复杂,我们建议使用StyleSheet.create来集中定义组件的样式。比如像下面这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98

import React, { Component } from 'react';
// 从“react-native” 导入以下这些控件
import { Platform, StyleSheet, Text, View, Image } from 'react-native';

const instructions = Platform.select({
ios: 'Press Cmd+R to reload,\n' + 'Cmd+D or shake for dev menu',
android:
'Double tap R on your keyboard to reload,\n' +
'Shake or press menu button for dev menu',
});

type Props = {};
export default class App extends Component<Props> {
render() {
// 声明图片
let pic = {
uri: 'https://upload.wikimedia.org/wikipedia/commons/d/de/Bananavarieties.jpg'
};

return (
// 给整体的VIew设置相同的属性。属性字段为styles.container
<View style={styles.container}>
<Text style={styles.welcome}>Welcome to React Native!</Text>
<Text style={styles.instructions}>To get started, edit App.js</Text>
<Text style={styles.instructions}>{instructions}</Text>
{/* 添加自定义闪烁组件 */}
<CustomStateComponent name="State 欢迎学习RN" />
{/* 通过source 和style这两个属性来给图片设置样式 */}
<Image source={pic} style={{ width: 193, height: 110 }} />
</View>
);
}
}

// 实际开发中组件的样式会越来越复杂,我们建议使用StyleSheet.create来集中定义组件的样式。
// 比如像下面这样:
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#C5FCFF',
},
welcome: {
fontSize: 20,
textAlign: 'center',
color: '#FE3333',
margin: 10,
},
instructions: {
textAlign: 'center',
color: '#333333',
marginBottom: 5,
},
});


// 我们可以通过继承自Components来创建自定义组件
/**
* 创建一个自定义View的组件
*
* 制作一段不停闪烁的文字。文字内容本身在组件创建时就已经指定好了,所以文字内容应该是一个prop。
* 而文字的显示或隐藏的状态(快速的显隐切换就产生了闪烁的效果)则是随着时间变化的,因此这一状态应该写到state中。
*/
class CustomStateComponent extends Component {
// 一般来说,我们需要在构造函数中来进行初始化State
constructor(props) {
super(props);
// 构造函数初始状态设置显示与否的逻辑.首先设置显示文字
this.state = { isShowingText: true };

// 每1000毫秒对showText状态做一次取反操作
setInterval(() => {
// 入参是之前的状态
this.setState(previousState => {
return { isShowingText: !previousState.isShowingText };
});
}, 1000);
}

render() {

// {/* 根据当前isShowingText的值决定是否显示text内容 */}
if (!this.state.isShowingText) {
return null;
}
return (
<View style={{ alignItems: 'center', marginTop: 50 }}>
{/* 自定义组件里面比较简单,其实就是一个自定义的Text的View */}
{/* 我们可以通过传入自定义组件的属性字段,来设置名字 */}
<Text>你好 {this.props.name}!</Text>
</View>
);
}
}


常见的做法是按顺序声明和使用style属性,以借鉴 CSS 中的“层叠”做法(即后声明的属性会覆盖先声明的同名属性)。

文本的样式定义请参阅Text 组件的文档

现在你已经了解如何调整文本样式了,下面我们要学习的是如何控制组件的尺寸。