React Native 組件 X 屬性|狀態 X 樣式

上一篇《React Native 環境搭建》

前篇已介紹了 RN 的環境搭建,作為第二篇,介紹 RN 的基礎知識為后續打下基礎。接著上一篇,接下來的示例代碼可以在之前留下的代碼上直接修改并運行。

好了,切入正題。RN 如果需要在軟件架構上進行分類的話,我會把它歸到界面顯示框架。原因是

  1. RN 面向的移動端開發;
  2. RN 主要負責界面元素的搭建;
  3. 雖然可以使用 JavaScript 邏輯代碼,其用途還是為了數據轉換,便于控件的顯示或者數據綁定。

那么一個界面顯示框架需要解決怎樣的問題呢?界面搭建、數據綁定、后端交互。之后再來交代后端交互,先來看一下前兩個。界面的搭建再拆分為UI控件與樣式。RN 中的控件被定義為組件 Component,樣式則是借鑒了 HTML 中的層疊樣式表 CSS。數據綁定是通過屬性和狀態來完成的。接下來逐一介紹它們。

組件

RN 應用是基于組件 Component 的集合,開發可以通過組件間有目的的排列與組合來完成整個應用。何為組件?直接或者間接擴展了 Component 對象的都屬于組件。組件必須具備有一個關鍵方法 render() ,正如這個方法名字暗示的一樣,它是用來渲染界面的。為何關鍵呢?組件的職責就是負責繪制界面。下面的例子中,定義了一個叫做 HelloWorldApp 的組件,在其 render() 方法返回 <Text><Text> 是 RN 預先定義用來顯示文本的基礎組件。這樣一個自定義組件就寫好了。

class HelloWorldApp extends Component {
  render() {
    return (
      <Text>Hello world!</Text>
    );
  }
}

屬性

了解網頁開發的人應該非常熟悉 HTML 語言中每個標簽都有一些屬性,就像 A 標簽會有 href 屬性來表示需要重定向的地址。在 RN 中也是一樣,每個組件可以寫成類似 HTML 的標簽,就像之前例子中的 <Text>。下面的例子是 RN 中用來顯示圖片的組件,與 HTML 的 <img> 標簽不同的是,圖片地址是用 source 屬性來指定的。

    <Image source={pic} style={{width: 193, height: 110}} />

比 HTML 標簽更強大的是,RN 組件的屬性是可以自定義的。屬性用來表示常量,如預先知道的圖片地址,需要顯示的大小等等,也就是說在定義清楚以后,組件生命周期中是不會改變的。問題來的,在編程中除了常量還有變量,那么變量該如何處理呢?如果顯示的圖片需要在運行時發生改變怎么辦?接下來要介紹的狀態就是用來處理此類情況的。

狀態

狀態本身很好理解,即物質系統所處的狀況,如形狀、溫度、顏色,一般可以使用物理量來表示。用在控件上就是指某個時間段內控件的顯示情況,這個情況可能隨著用戶的操作或者時間發生改變。下面的例子中定義了一個組件,其中顯示的文本可以被隱藏。注意它的構造器,定義了一個狀態 showText,用以標記是否顯示文本。然后在 render() 方法中使用,先判斷狀態是否要顯示文本,需要則直接顯示 text 屬性,否則就用空字符串替換掉。

class Blink extends Component {
  constructor(props) {
    super(props);
    this.state = { showText: true };    
  }

  render() {
    // 根據當前showText的值決定是否顯示text內容
    let display = this.state.showText ? this.props.text : ' ';
    return (
      <Text>{display}</Text>
    );
  }
}

查看組件中的狀態是如何工作的,需要響應用戶的操作或者編寫一個時間函數改變 showText 屬性。下面就來修改構造函數,添加注釋之后的語句,刷新一下看看效果。

constructor(props) {
    super(props);
    this.state = { showText: true };
    
    // 每1000毫秒對showText狀態做一次取反操作
    setInterval(() => {
      this.setState(previousState => {
        return { showText: !previousState.showText };
      });
    }, 1000);
}

樣式

RN 的樣式與網頁開發中使用的層疊樣式表類似,有兩種定義方式,可以直接在組件的 style 屬性中定義。下面的例子中,定義了一個背景色是紅色,高和寬都是50的文本。

<Text style={{width:50, height:50, backgroundColor: 'f00'}}></Text>

第二種方式像獨立的 CSS 申明一樣,可以在各組件間重復使用。

<Text style={styles.redtext}></Text>

const styles = StyleSheet.create({
  redtext: {
    color: '#f00',
    width: 50,
    height: 50,
  },
});

總結

這篇從 RN 的構成最基本的元素組件開始,快速介紹了組件的屬性、狀態和如何定義樣式。下一篇要開始準備動手做一個小的應用程序。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,559評論 25 708
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,257評論 4 61
  • 1、先把整個工程文件夾名改為新的工程名。 2 將舊項目文件夾和Tests文件名夾修改為新的名稱,修改后如下圖所示 ...
    ZYWu閱讀 11,513評論 12 21
  • 裘同學特別有心的買了一瓶水 可謂精挑細選 結果沒有緩解我的孕吐 反而更嚴重了 哈哈
    PWong閱讀 170評論 0 0
  • 師范學校院落較小,操場只有兩個籃球場面積,同學們玩玩籃球,做做廣播操尚可,但如果跑操就不行了。學校每天早晨例行組織...
    老吳同志簡書閱讀 166評論 0 0