1. 程式人生 > >(二)React Native中View和Text元件的使用

(二)React Native中View和Text元件的使用

前言

前段時間實在太忙,由於剛進公司,第一個專案要用混合開發,這種開發模式自己也沒用過,期間遇見過與h5的各種奇葩問題,並且Android這端都是由自己負責,經過兩個月的努力,公司專案終於上線。加之後面又回了一趟學校答辯,才把事情忙完了。這期間一直沒時間好好學習RN,到現在才有時間學習。

這篇文章打算介紹下RN中的View和Text元件。

View

在RN中View類似html中的div元件,它支援多層巢狀,支援flexbox佈局。

看下程式碼:

//index.android,js程式碼
import React from 'react';
import {
    AppRegistry,
} from 'react-native';

import myView from './demo/2.view'

AppRegistry.registerComponent('chen', () => myView);

//view.js程式碼

import React, {Component} from 'react';
import {
    StyleSheet,
    View,
    Text,
    PixelRatio
} from 'react-native';

class MyView extends Component {
    render(){
        return(
            <View
style={styles.container}>
<View style={[styles.item, styles.center]}> <Text style={styles.font}>酒店</Text> </View> <View style={[styles.item, styles.lineLeftRight]}> <View style={[styles.center,
styles.flex, styles.lineCenter]}>
<Text style={[styles.font]}>海外酒店</Text> </View> <View style={[styles.center, styles.flex]}> <Text style={[styles.font]}>特惠酒店</Text> </View
>
</View> <View style={[styles.item]}> <View style={[styles.center, styles.flex, styles.lineCenter]}> <Text style={[styles.font]}>團購</Text> </View> <View style={[styles.center, styles.flex]}> <Text style={[styles.font]}>客棧,公寓</Text> </View> </View> </View> ); } } const styles = StyleSheet.create({ flex:{ flex:1 }, container:{ marginTop:200, marginLeft:5, marginRight:5, height:84, borderWidth:1, backgroundColor:'#FF0067', flexDirection:'row', borderRadius:5 }, item:{ flex:1, height:80, }, center:{ justifyContent:'center', alignItems:'center' }, lineLeftRight:{ borderLeftWidth:1/PixelRatio.get(), borderRightWidth:1/PixelRatio.get(), borderColor:'#fff' }, font:{ color:'#fff', fontSize:16, fontWeight:'bold', }, lineCenter:{ borderColor:'#fff', borderBottomWidth:1/PixelRatio.get(), } }); module.exports = MyView;

看下實現效果
這裡寫圖片描述

簡單分析下程式碼: index.android.js是android端的入口檔案,該檔案中載入了一個myView元件,AppRegistry.registerComponent(‘chen’, () => myView); 用來註冊該元件,’chen’引號裡面的字串是專案名。而元件myView裡面真正用來展示介面,這就是元件化實現思想,其中myView有幾個Style屬性應該被記錄下:

flex: 是flex-grow flex-shrink flex-basis這三個屬性的縮寫,其語法為:flex:none | flex-grow flex-shrink flex-basis,其中第一個後面的引數為可選引數,預設值為:0 1 auto。這個屬性和Android的weight屬性類似。

justifyContent: 用來定義伸縮專案在水平軸的對齊方式

alignItems: 用來定義伸縮專案在交叉軸上的對齊方式,語法為:
alignItems:flex-start(預設值) | flex-end | center | stretch

PixelRatio.get(): 用來實現多手機的適配的。

Text

Text元件主要用於顯示文字;具有響應性,可以巢狀,可以繼承樣式
內部Text元件可以繼承外部Text元件的樣式

Text元件的特性:
1.onPress
2.numberOfLines 最多顯示多少行
3.onLayout 監聽方法 組價佈局發生變化的時候呼叫

看下程式碼:


import React, {Component} from 'react';
import {
    StyleSheet,
    View,
    Text
}from 'react-native';

import Header from './3.header'

class MyText extends Component{
    render(){
        return(
            <View style={styles.flex}>
                <Header></Header>
                <List title='一線城市樓市退燒 有房源一夜跌價160萬'></List>
                <List title='上海市民稱墓地太貴買不起 買房存骨灰'></List>
                <List title='朝鮮再發視訊:摧毀青瓦臺 一切化作灰燼'></List>
                <List title='生活大爆炸人物原型都好牛逼'></List>

                <ImportantNews
                    news={[
                        '解放軍報報社大樓正在拆除 標識已被卸下(圖)',
                        '韓國停籤東三省52家旅行社 或為阻止朝旅遊創匯',
                        '南京大學生髮起親吻陌生人活動 有女生獻初吻-南京大學生髮起親吻陌生人活動 有女生獻初吻-南京大學生髮起親吻陌生人活動 有女生獻初吻',
                        '防總部署長江防汛:以防禦98年量級大洪水為目標'
                    ]}>
                </ImportantNews>
            </View>
        );
    }
}

class List extends Component{
    render(){
        return(
            <View style={styles.list_item}>
                <Text style={styles.list_item_font}>{this.props.title}</Text>
            </View>
        );
    }
}

class ImportantNews extends Component{

    show(title){
        alert(title);
    }

    render(){
        var news=[];
        for(var i in this.props.news){
            var text = (
                <Text
                    onPress={this.show.bind(this, this.props.news[i])}
                    numberOfLines={2}
                    style={styles.news_item}
                    key={i}
                >
                    {this.props.news[i]}</Text>
            );
            news.push(text);
        }
        return(
            <View style={styles.flex}>
                <Text style={styles.news_title}></Text>
                {news}
            </View>
        );
    }
}

const styles = StyleSheet.create({
    flex:{
        flex:1
    },
    list_item:{
        height:40,
        marginLeft:10,
        marginRight:10,
        borderBottomWidth:1,
        borderBottomColor:'#ddd',
        justifyContent:'center',
    },
    list_item_font:{
        fontSize:16,
    },
    news_item:{
        marginLeft:10,
        marginRight:10,
        fontSize:15,
        lineHeight:40,
    },
});

module.exports = MyText

效果圖展示:
這裡寫圖片描述

元件載入部分就不展示了,

從程式碼中我們可以看出,頁面的展示都是以元件化的思想展示的,各自的模組都是獨立的,這種思想是值得我們在任意的開發中值得學習的。