【ReactNative】入門(mén):從todo App開(kāi)始(2)

1.能在Header中輸入文字

首先,給Header上加一個(gè)輸入文字的TextInput部分,并加上對(duì)應(yīng)的style响迂。

關(guān)于TextInput蹋笼,可以看 官方文檔 寫(xiě)的很詳細(xì)。常用的事件有:onChangeText讀用戶輸入蜕该,onSubmitEditing 提交鍵入和 onFocus獲得焦點(diǎn)犁柜。

header.js

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

class Header extends Component {
  render() {
    return (
      <View style={styles.header}>
        <TextInput
          placeholder="What needs to be done?"
          blurOnSubmit={false}
          returnKeyType="done"
          style={styles.input}
        />
      </View>
    );
  }
}

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

注意:textinput必須要寫(xiě)明height,不然就默認(rèn)高度為0堂淡,所以看不到馋缅。刷新模擬器看下效果,header部分出現(xiàn)了placeholder的內(nèi)容淤齐。

2.能夠添加todo item

2.1 constructor和state

下面回到app.js,寫(xiě)一個(gè)constructor股囊。在 constructor 中可以定義state的結(jié)構(gòu)。
現(xiàn)在state只需要兩個(gè)參數(shù):value存儲(chǔ)當(dāng)前輸入的todo item內(nèi)容更啄;items數(shù)組稚疹,存儲(chǔ)所有的todo items。
通過(guò)this.state.value,this.state.items可以讀取祭务。

constructor(props) {
    super(props);
    this.state = {
      value: '',
      items: []
    }
  }

2.2 在header中輸入一條todo item内狗,并將該item添加到this.state.items數(shù)組中

通過(guò)handleAddItem這個(gè)function來(lái)實(shí)現(xiàn),這樣的function被稱(chēng)作event handler义锥,命名一般遵循類(lèi)似的handle+v+n的結(jié)構(gòu)柳沙,后面還能看到很多。

handleAddItem() {
    if(!this.state.value) return;
    const newItems = [
      ...this.state.items,
      {
        key: Date.now(),
        text: this.state.value,
        complete: false
      }
    ]
    this.setState({
      items: newItems,
      value: ''
    })
  }

注意:

  1. ...this.state.items的這三個(gè)點(diǎn)是ES6語(yǔ)法拌倍,叫Spread赂鲤,意思是用原來(lái)的this.state.items加上新的object構(gòu)造一個(gè)新數(shù)組并賦值給this.state.items
  2. 當(dāng)需要改變state中的值的時(shí)候柱恤,絕對(duì)不能直接賦值給state数初,必須使用this.setState這個(gè)方法。

將這個(gè)function跟Header wire起來(lái):

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

需要注意的是一個(gè)component中所有的異步function都要在constructor中bind梗顺,不然會(huì)報(bào)錯(cuò)泡孩。

constructor(props) {
    super(props);
    this.state = {
      value: '',
      items: []
    }
       /* 不要忘了在constructor中bind method */
    this.handleAddItem = this.handleAddItem.bind(this);
  }

進(jìn)入header.js文件,用this.props就能使用父元素傳入的參數(shù)

<TextInput
          value={this.props.value}
          onChangeText={this.props.onChange}
          onSubmitEditing={this.props.onAddItem}
      ...
        />

現(xiàn)在刷新模擬器寺谤,可以輸入一些文字仑鸥,點(diǎn)擊鍵盤(pán)上的完成,input欄會(huì)立刻清空变屁,輸入的內(nèi)容被添加到items數(shù)組眼俊。

3. 寫(xiě)toggle complete button

這里要用到 TouchableOpacity。雖然名字很復(fù)雜粟关,其實(shí)就是可以點(diǎn)擊的button, 用onPress事件觸發(fā)點(diǎn)擊后動(dòng)作泵琳。
這個(gè)按鈕的功能就是,點(diǎn)擊后,將當(dāng)前所有的todo item的狀態(tài)都切換為已完成获列,若再次點(diǎn)擊谷市,則全部變成未完成。

header.js

import { ... TouchableOpacity } from 'react-native';
render() {
    return (
      <View style={styles.header}>
        <TouchableOpacity onPress={this.props.onToggleAllComplete}>
          <Text style={styles.toggleIcon}>{String.fromCharCode(10003)}</Text>
        </TouchableOpacity>
        ...
    );
  }
}
...
toggleIcon: {
    fontSize: 30,
    color: "#CCC"
  }

效果如下,

toggleAllComplete.png

下面來(lái)實(shí)現(xiàn)击孩,點(diǎn)擊這個(gè)勾能toggleAllComplete的邏輯:
首先需要在state中添加一個(gè)allComplete初始值:
app.js

this.state = {
      allComplete: false,
      value: '',
      items: ~[]~
    }

event handler function如下:

handleToggleAllComplete() {
    const complete = !this.state.allComplete;
    const newItems = this.state.items.map((item) => ({
      ...item,
      complete
    }))
    console.table(newItems);
    this.setState({
      items: newItems,
      allComplete: complete
    })
  }

console.table類(lèi)似console.log迫悠,方便的是可以以table格式展示結(jié)果,易于查看巩梢。
(調(diào)試方法見(jiàn)最后)

<Header
          ...
          onToggleAllComplete={this.handleToggleAllComplete}
        />

別忘了要bindthis.handleToggleAllComplete = this.handleToggleAllComplete.bind(this);

react Native調(diào)試方法

  1. cmd+D呼出如下圖菜單:
11.png
  1. 選擇debug JS remotely创泄,就可以用瀏覽器來(lái)調(diào)試和查看console結(jié)果,非常方便±穑現(xiàn)在在模擬器里添加Task1鞠抑,Task2。然后點(diǎn)擊??按鈕忌警,看到瀏覽器的console里面出現(xiàn)了結(jié)果:
Screen Shot 2017-03-22 at 5.51.18 PM.894b7ca34bf7426d9240cfcc22f80a13.png

如果再點(diǎn)擊一次??按鈕:

33.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末搁拙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子法绵,更是在濱河造成了極大的恐慌箕速,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朋譬,死亡現(xiàn)場(chǎng)離奇詭異盐茎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)徙赢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)字柠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人狡赐,你說(shuō)我怎么就攤上這事募谎。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)堡妒。 經(jīng)常有香客問(wèn)我锯仪,道長(zhǎng),這世上最難降的妖魔是什么铜异? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任哥倔,我火速辦了婚禮,結(jié)果婚禮上揍庄,老公的妹妹穿的比我還像新娘咆蒿。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布沃测。 她就那樣靜靜地躺著缭黔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蒂破。 梳的紋絲不亂的頭發(fā)上馏谨,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音附迷,去河邊找鬼惧互。 笑死,一個(gè)胖子當(dāng)著我的面吹牛喇伯,可吹牛的內(nèi)容都是我干的喊儡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼稻据,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼艾猜!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起攀甚,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤箩朴,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后秋度,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體炸庞,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年荚斯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了埠居。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡事期,死狀恐怖滥壕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情兽泣,我是刑警寧澤绎橘,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站唠倦,受9級(jí)特大地震影響称鳞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜稠鼻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一冈止、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧候齿,春花似錦熙暴、人聲如沸闺属。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)掂器。三九已至,卻和暖如春诗眨,著一層夾襖步出監(jiān)牢的瞬間唉匾,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工匠楚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留巍膘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓芋簿,卻偏偏與公主長(zhǎng)得像峡懈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子与斤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

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