React Native實戰開發5:使用TextInput

本教程內容和https://zhiwehu.gitbooks.io/react-native/content/ 同步更新。

使用TextInput

接下來,我們將使用TextInput作為todo的輸入框,將todo item加到todo list里。

首先,思考一下我們要怎么對數據進行管理。對于整個app來說,我們需要有2個狀態(state)值,一個用于存儲當前正在輸入的todo,一個用于存儲所有的todo item,這2個狀態在app初始狀態的時候,都是空的(對于todo list值來說,后面我們需要導入之前持久存儲的數據,這個我們后面再講),當我們在TextInput中輸入字符的時候,會更新當前正在輸入的todo value;當我們按下鍵盤上的"done"按鈕的時候,會將這個todo value增加到todo list里,同時將這個value清空。

2個state

  1. value: 存儲當前正在輸入的todo,TextInput onChangeText事件會更新這個狀態
  2. items: 存儲所有todo list,TextInput onSubmitEditing事件會更新這個狀態,同時將value狀態設置為空。

header.js

TextInput是需要放在Header里面的,以下是header.js的新代碼:

// 引入React和Component
import React, {Component} from "react";
// 引入Text,顯示文字
import {View, Text, StyleSheet, TextInput} from "react-native";

// 定義Header類,這個類是Component的子類
class Header extends Component {
  /*
   實現Header類的render方法,這個方法返回一個View,顯示Footer
   */
  render() {
    return (
      <View style={styles.header}>
        <TextInput
          placeholder="什么需要做?"
          value={this.props.value}
          onChangeText={this.props.onChange}
          onSubmitEditing={this.props.onAddItem}
          blurOnSubmit={false}
          returnKeyType="done"
          style={styles.input}
        />
      </View>
    );
  }
}

// 創建StyleSheet
const styles = StyleSheet.create({
  header: {
    paddingHorizontal: 16,
    flexDirection: "row",
    justifyContent: "space-around",
    alignItems: "center"
  },
  input: {
    flex: 1,
    height: 50
  }
});

// 導出這個模塊,供外部調用
export default Header;

我們可以看到,我們在Header是創建了一個TextInput,并且把值和處理方法都放在Header的props中傳給了這個TextInput,也就是意味著我們不需要在Header中寫代碼來處理app的邏輯,這部分代碼我們統一放在app.js里來做。

我們對Header傳了三個props:

  1. value,是一個值,就是app用于存儲當前正在輸入的todo value
  2. onChange,一個回調函數,用于TextInput onChangeText的時候,更新app.state.value
  3. onAddItem,一個回調函數,當TextInput onSubmitEditing(提交)的時候,更新app.state.items,并將app.state.value設置為空。

接下來我們在app.js里實現這部分代碼。

初始化state

在App類的構造方法里,初始化state

  // 構造方法,初始化state
  constructor(props) {
    super(props);
    // 初始化2個狀態
    this.state = {
      value: "",
      items: []
    };
  }

TextInput onSubmitEditing回調函數

  /*
   傳給Header.TextInput.onSubmitEditing的回調函數
   更新this.state.items
   設置this.state.value為空
   */
  handleAddItem() {
    if (!this.state.value) return;
    // 創建一個新的items,從this.state.items里copy現有的數據,再增加一個新的
    const newItems = [
      ...this.state.items,
      {
        key: Date.now(),
        text: this.state.value,
        complete: false
      }
    ];
    // 更新state
    this.setState({
      items: newItems,
      value: ""
    });
  }

我并沒有直接往this.state.items里增加一條新數據,而是重新創建了一個新的items,從老的items里copy了原有數據,并且增加了一條新數據。這樣做的好處是讓react native的shouldComponentUpdate性能更好,從而更加快速的知道一個組件是否有狀態變化,從而重新render數據。詳情參考:https://facebook.github.io/react/docs/optimizing-performance.html

傳值給Header props

接下來就是給Header props傳值了

  <Header
    value = {this.state.value}
    onAddItem = {this.handleAddItem.bind(this)}
    onChange = {(value) => this.setState({value})}
  />

運行結果如下:
![](https://zhiwehu.gitbooks.io/react-native/content/assets/add TextInput.png)

當然,現在按下Done增加一個新的todo,我們的app沒有任何變化,我們將在下一篇中講解如果顯示todo list。

本節代碼:https://github.com/zhiwehu/todo/tree/second


  1. React Native實戰開發1:搭建開發環境
  2. React Native實戰開發2:布局
  3. React Native實戰開發3:模塊劃分
  4. React Native實戰開發4:屬性和狀態
  5. React Native實戰開發5:使用TextInput
  6. React Native實戰開發6:使用ListView
  7. React Native實戰開發7:使用Switch更新todo complete狀態
  8. React Native實戰開發8: 刪除todo item
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容