React-native 基础语法

510 阅读3分钟

React-native 中的样式申明

RN中的样式特点

  • 样式继承性:RN中的样式继承性只发生在 Text 组件上,父组件中的 Text 以外的子组件如果想获得父组件申明的样式只能自己重新申明。个人认为这一点是 RN 比较不方便的地方。

  • 样式命名方式:采用小驼峰命名方式,如:font-size 是 fontSize、 background-color 是 backgroundColor 以此类推。

  • RN 中所有尺寸都没有单位,如:width: 100, heigth: 100。

  • 特殊样式名:在 RN 中水平外边距叫 marginHorizontal,垂直外边距叫:marginVertical,水平内边距叫 paddingHorizontal,垂直内边距叫:paddingVertical。

RN 样式的申明方式

  1. 通过 style 属性值直接声明
  • 1. 属性值为对象:<组件 style={{ 样式 }}/>
    
  • 2. 属性值为数组:<组件 style={[ { 样式 }, { 样式 },... ]}/>  * 注意:如果数组里样式对象里样式属性有重叠,则后者则样式会覆盖前者样式*
    
  1. 在 style 属性中调用 StyleSheet 声明样式
  • 1. 引入: import { StyleSheet } from 'react-native'
    
  • 2. 声明:const styles = StyleSheet.create({ ones: { 样式1 }, twos: { 样式2 },...})
    
  • 3. 使用:<View style={[styles.ones, styles.twos]}>组件内容</View>
    

RN 的样式引用方式更像 Vue, 不需要单独新建样式文件引入使用。 一个最简单的 RN 文件结构如下(以函数组件为例):

    import React feom 'react';
    import { Text, Button,StyleSheet, View } from 'react-native';
    
    export default App = () => {
        // 变量定义、变量状态改变,事件的使用、绑定和 react 中一样
        const [text, setText] = useState<string>('初始文案');
        const textChange = () => {
            setText('新的文案');
        };
        
        return (
            <View style={styles.container}>
                <Text>文案</<Text>
                <Button  
                    onPress={textChange}  
                    title="事件按钮"  
                />
            </View>
        )
    }
    
    const styles = StyleSheet.create({
        container: {
            heigth: 100,
            width: 100,
            ...
        },
        ...
    })

推荐使用 styleSheet 方式声明样式,代码简洁优雅、样式可复用可维护性更强

// 组件中
<View style={styles.container}>
    <Text style={styles.row}>
         styleSheet 声明样式例子
    </Text>
    <View style={styles.separator} />
</View>

// styleSheet中
const styles = StyleSheet.create({
  container: {
    backgroundColor: 'white',
    marginTop: 40,
    margin: 15,
  },
  separator: {
    height: 1,
    backgroundColor: '#bbbbbb',
  },
});

Flexbox 布局

Flexbox 术语

  • 容器(container): 采用 flex 布局的元素,成为 flex 容器(flex container),简称“容器”
  • 项目(item): 容器中的所有子元素成为项目(item)
  • 主轴(main axis,与 web 端方向不同)
  • 交叉轴(corss axis,与 web 端方向不同)

Web 端弹性布局模型与 RN 布局模型

  • Web 端弹性布局模型

image.png

  • RN 弹性布局模型

image.png

Flexbox 属性

  • flexDirection
    • 声明主轴方向: row (Web默认) | column(RN默认)
  • justifyContent
    • 声明 item 在主轴方向的对齐方式
  • alignItems
    • 声明 item 在交叉轴上的对齐方式
  • flex
    • 声明 item 在主轴上的尺寸比例

一些布局展示

image.png

RN 中响应式布局

Dimensions

Dimensions.get() 方法能获取到当前窗口的尺寸信息,使用 Dimensions.get() 获取到的尺寸信息用于计算元素的样式类似于 Web 端的 vw / vh。

  • 引入:import { Dimensions } from 'react-native
  • 获取当前窗口宽高
    • const windowWidth = Dimensions.get('window').width;
    • const windowHeight = Dimensions.get('window').height;
  • 应用示例如图:

image.png

好啦,本次分享结束!

ps:以上内容如果有不正确地方或讲解逻辑、思路、排版等有不易于理解的地方,欢迎大家在评论区留言指出,我们一起找到最优解。最后希望能在社区和大家共同进步,下期继续分享 RN 有关内容。