React Native實戰(zhàn)開發(fā)5:使用TextInput

本教程內(nèi)容和https://zhiwehu.gitbooks.io/react-native/content/ 同步更新洋丐。

使用TextInput

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

首先屎篱,思考一下我們要怎么對數(shù)據(jù)進行管理。對于整個app來說葵蒂,我們需要有2個狀態(tài)(state)值交播,一個用于存儲當(dāng)前正在輸入的todo,一個用于存儲所有的todo item践付,這2個狀態(tài)在app初始狀態(tài)的時候秦士,都是空的(對于todo list值來說,后面我們需要導(dǎo)入之前持久存儲的數(shù)據(jù)永高,這個我們后面再講)隧土,當(dāng)我們在TextInput中輸入字符的時候,會更新當(dāng)前正在輸入的todo value命爬;當(dāng)我們按下鍵盤上的"done"按鈕的時候曹傀,會將這個todo value增加到todo list里,同時將這個value清空饲宛。

2個state

  1. value: 存儲當(dāng)前正在輸入的todo皆愉,TextInput onChangeText事件會更新這個狀態(tài)
  2. items: 存儲所有todo list,TextInput onSubmitEditing事件會更新這個狀態(tài),同時將value狀態(tài)設(shè)置為空亥啦。

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 {
  /*
   實現(xiàn)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>
    );
  }
}

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

// 導(dǎo)出這個模塊届吁,供外部調(diào)用
export default Header;

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

我們對Header傳了三個props:

  1. value亮蛔,是一個值痴施,就是app用于存儲當(dāng)前正在輸入的todo value
  2. onChange,一個回調(diào)函數(shù)究流,用于TextInput onChangeText的時候辣吃,更新app.state.value
  3. onAddItem,一個回調(diào)函數(shù)芬探,當(dāng)TextInput onSubmitEditing(提交)的時候神得,更新app.state.items,并將app.state.value設(shè)置為空偷仿。

接下來我們在app.js里實現(xiàn)這部分代碼哩簿。

初始化state

在App類的構(gòu)造方法里,初始化state

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

TextInput onSubmitEditing回調(diào)函數(shù)

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

我并沒有直接往this.state.items里增加一條新數(shù)據(jù)酝静,而是重新創(chuàng)建了一個新的items节榜,從老的items里copy了原有數(shù)據(jù),并且增加了一條新數(shù)據(jù)形入。這樣做的好處是讓react native的shouldComponentUpdate性能更好全跨,從而更加快速的知道一個組件是否有狀態(tài)變化缝左,從而重新render數(shù)據(jù)亿遂。詳情參考: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})}
  />

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

當(dāng)然,現(xiàn)在按下Done增加一個新的todo渺杉,我們的app沒有任何變化蛇数,我們將在下一篇中講解如果顯示todo list。

本節(jié)代碼:https://github.com/zhiwehu/todo/tree/second


  1. React Native實戰(zhàn)開發(fā)1:搭建開發(fā)環(huán)境
  2. React Native實戰(zhàn)開發(fā)2:布局
  3. React Native實戰(zhàn)開發(fā)3:模塊劃分
  4. React Native實戰(zhàn)開發(fā)4:屬性和狀態(tài)
  5. React Native實戰(zhàn)開發(fā)5:使用TextInput
  6. React Native實戰(zhàn)開發(fā)6:使用ListView
  7. React Native實戰(zhàn)開發(fā)7:使用Switch更新todo complete狀態(tài)
  8. React Native實戰(zhàn)開發(fā)8: 刪除todo item
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末是越,一起剝皮案震驚了整個濱河市耳舅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖浦徊,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馏予,死亡現(xiàn)場離奇詭異,居然都是意外死亡盔性,警方通過查閱死者的電腦和手機霞丧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冕香,“玉大人蛹尝,你說我怎么就攤上這事∠の玻” “怎么了突那?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長构眯。 經(jīng)常有香客問我愕难,道長,這世上最難降的妖魔是什么惫霸? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任务漩,我火速辦了婚禮,結(jié)果婚禮上它褪,老公的妹妹穿的比我還像新娘饵骨。我一直安慰自己,他們只是感情好茫打,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布居触。 她就那樣靜靜地躺著,像睡著了一般老赤。 火紅的嫁衣襯著肌膚如雪轮洋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天抬旺,我揣著相機與錄音弊予,去河邊找鬼。 笑死开财,一個胖子當(dāng)著我的面吹牛汉柒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播责鳍,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼碾褂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了历葛?” 一聲冷哼從身側(cè)響起正塌,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后乓诽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帜羊,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年鸠天,在試婚紗的時候發(fā)現(xiàn)自己被綠了逮壁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡粮宛,死狀恐怖窥淆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巍杈,我是刑警寧澤忧饭,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站筷畦,受9級特大地震影響词裤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鳖宾,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一吼砂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鼎文,春花似錦渔肩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至撑帖,卻和暖如春蓉坎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胡嘿。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工蛉艾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衷敌。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓勿侯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親逢享。 傳聞我的和親對象是個殘疾皇子罐监,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容