React Native随笔 1--基本概念梳理

属性(props)

在React Native中属性不会像android、java那样进行声明!我们需要什么属性直接进行在适当时候使用即可,在组件初始化,或者某种触发条件下进行相关属性赋值。例如:我们自定义一个Component为Greeting,然后外界传递一个name属性,在Greeting进行渲染View(调用render())时候使用name属性显示内容,代码如下:

class Greeting extends Component {
  render() {
    return (
      <Text>Hello {this.props.name}!</Text>
    );
  }
}

接下来,我们只要在我们需要使用到Greeting的时候进行初始化传入name

<Greeting name='Rexxar' />

state (状态机)

在React Native中state是非常重要的一个概念,也正是因此React Native的组件化,或者叫静态化成为可能。可以将这个理解成面向对象中的封装,我们实现一个组件专门完成一项功能,在不同条件下进行相应的变化,如果将这个变化过程进行封装起来成一个模块,那么问题来了,这个条件如何从外界传入,组件如何触发这个条件的变化!
没错!state就是完成这个任务的!
我们来实现一个案例:
1、我们实现一个每2秒钟就递增1的组件
2、初始化时候传入开始数值count

class CountText extends Component {
    // 构造
    constructor(props) {
        super(props);
        // 初始状态
        this.state = {count: this.props.count};

        //每个2秒钟修改一次count
        setInterval(() => {
            this.setState(c => {
                return {count: c.count + 1};
            });
        }, 2000);
    }

    render() {
        return (
            <Text>{this.state.count}</Text>
        );
    }

}

export default class App extends Component<{}> {

    render() {
        return (
            <View style={styles.container}>
                <CountText count={3}/>
            </View>
        );
    }
}

注意一下在这里传入数值的时候不能用单引号或双引号,否则就是字符串方式进行追加,而不是数值的增加了

ref

在React Native中如何寻找到一个控件呢?在React Native不能使用js的操作(document),我们只能通过ref进行锁定一个控件,以此来操作控件本身的相关属性和状态,但是依据React Native的设计思想并不建议直接操作相关属性,原因很清楚,属性是一个对象的特征,而state是发生变化的条件,我们可以理解成有了某种条件下才能发生属性变化(内部封装性)!外界通过修改相关状态来响应操作。

依照上面state中的例子,我们将定时器去掉,通过一个按钮进行点击,每次点击一下数值增加1

class CountText extends Component {
    // 构造
    constructor(props) {
        super(props);
        // 初始状态
        this.state = {count: this.props.count};

        //每个2秒钟修改一次count
        // setInterval(() => {
        //     this.setState(c => {
        //         return {count: c.count + 1};
        //     });
        // }, 2000);
    }

    render() {
        return (
            <Text>{this.state.count}</Text>
        );
    }

}

export default class App extends Component<{}> {

    pressClick = () =>  {
        this.refs.countText.setState(c => {
            return {count: c.count + 1};
        });
    }

    render() {
        return (
            <View style={styles.container}>

                <Button title='点击增加' onPress={this.pressClick}/>

                <CountText ref='countText' count={3}/>
            </View>
        );
    }
}

从上面pressClick中看到this.refs,这个可以理解是一个ref集合,然后通过对应的ref定义的值进行操作相关属性即可

运算符

运算符使我们对一些对象进行操作时必要的应用,除了基本通用的运算符之外,这里重点列举一些和Android/java中不一样的地方

==两个等号

在ES6中==会首先转换数据类型,然后进行两者比较,很多时候会得出非常诧异的结果

===三个等号

它不会自动转换数据类型,如果数据类型不一致,返回 false ,如果一致,再比较。

一般情况下我们更多的使用===

FlexBox布局

item属性

  • flex
  • alignSelf

父容器属性

  • flexDiretion
  • justifyCotent
  • alignItems
  • flexWrap
  • flexShrink
  • flexGrow

在FlexBox中首先需要了解的是布局轴线的概念,在平面坐标系中我们用x,y定义横轴和纵轴。在FlexBox中我们将横轴排版描述成沿z轴排放,当一行排满之后,再沿y轴另取一行继续沿x轴摆放。那么在这个过程中x轴就可以称之为主轴,y轴就可以被称之为副轴。当然如果一开始需要沿着y轴排版,当高度不够时另取一列继续向下摆放,这个时候恰恰和上面相反,主轴就是y轴了,副轴就是x轴。

flex 类似于权重

该属性是一个数值类型,依据数值大小进行父容器空闲区域的划分控件所占区域大小。
可以将其认为是Android中线性布局的一个范例,很容易实现LinearLayout效果。

alignSelf 控件相对于父容器的排列方式

属性值:‘auto’  //默认排版
       ‘flex-start’ //副轴起始位置
       ‘flex-end’   //副轴结尾位置
       'center'     //居中位置
       ‘stretch’    //拉伸充满

该属性只针对FlexBox中的子元素,优先级改与alignItems。

flexDiretion指定FlexBox主轴

属性值:‘row’   //横轴(x轴)
       'column' //纵轴(y轴)
       ‘row-reverse’    //横轴反方向
       'column-reverse' //纵轴反方向

想想在Android中RecyclerView的LinearLayoutManager的reverse参数,就是实例化时最后那个boolean类型的参数。

flexWrap 是否可以换行

属性值:‘wrap’  //换行 自由填充
       ‘nowrap’ //不换行   **子元素可能会溢出**

这里的换行值得的是默认主轴为横轴(x),当主轴为纵轴时就不是换行了而是列了。

justifyContent 对齐方式

属性值:‘flex-start’    //从开始位置排列摆放,
       'flex-end'   //从结束位置开始排列摆放
       ‘center’     //居中
       ‘space-between’  //在每行上均匀分配弹性元素。相邻元素间距离相同。每行第一个元素与行首对齐,每行最后一个元素与行尾对齐
       ‘space-around’   //在每行上均匀分配弹性元素。相邻元素间距离相同。每行第一个元素到行首的距离和每行最后一个元素到行尾的距离将会是相邻元素之间距离的一半

类似于Android中gravity(不是layout_gravity),最后两个属性有点例外,关键在于子元素之前相对距离的大小分配

alignItems

属性值:'flex-start'//元素向侧轴起点对齐
       'flex-end'//元素向侧轴终点对齐
       'center'//元素在侧轴居中。如果元素在侧轴上的高度高于其容器,那么在两个方向上溢出距离相同
       'stretch'//弹性元素被在侧轴方向被拉伸到与容器相同的高度或宽度

注意:这个属性和上面属性类似,但是排列方向是以副轴方向

其他布局属性

内边距(padding)和外边距(margin)

在Android中也有padding和margin的概念。padding指的是控件/父容器中内容/子元素距离自己范围边界的距离;margin则是控件/父容器边界与其他组件/父容器边界之间的距离。

定位(position)

这个需要特别强调一下,因为这个决定了位置摆放的计算规则

  • absolute 生成绝对定位的元素,元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定 (Android中的FrameLayout)
  • relative 生成相对定位的元素,相对于其正常位置进行定位。因此,"left:20" 会向元素的 LEFT 位置添加 20 像素

单位

在React Native中尺寸是没有单位,在style中定义的padding、margin、size等都不携带dp、px、pt等长度单位。当React Native运行环境是Android时,React Native会将单位解析成dp、sp

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342