React 表單、列表

列表

【keys】
  keys可以在DOM中的某些元素被增加或刪除的時候幫助React識別哪些元素發(fā)生了變化鲫懒。因此應(yīng)當(dāng)給數(shù)組中的每一個元素賦予一個確定的標(biāo)識。

const numbers = [1, 2, 3, 4, 5];
const listItems = numbers.map((number) =>
  <li key={number.toString()}>
    {number}
  </li>
);

??一個元素的key最好是這個元素在列表中擁有的一個獨一無二的字符串刽辙。通常窥岩,使用來自數(shù)據(jù)的id作為元素的key。當(dāng)元素沒有確定的id時宰缤,可以使用序列號索引index作為key颂翼。

const todoItems = todos.map((todo, index) =>
  <li key={index}>
    {todo.text}
  </li>
);

[注意]如果列表可以重新排序,不建議使用索引來進行排序慨灭,因為這會導(dǎo)致渲染變得很慢朦乏。
JSX允許在大括號中嵌入任何表達式。

function NumberList(props) {
  const numbers = props.numbers;
  return (
    <ul>
      {numbers.map((number) =>
        <ListItem key={number.toString()}
                  value={number} />

      )}
    </ul>
  );
}

表單

【可控組件和不可控組件】
  在React中的input標(biāo)簽是有些小坑的氧骤,input本身就有自己的緩存機制呻疹,然后React的state也有緩存機制,像<input>,<textarea>, 和 <select>這類表單元素會維持自身狀態(tài)筹陵,并根據(jù)用戶輸入進行更新刽锤。但在React中镊尺,可變的狀態(tài)通常保存在組件的狀態(tài)屬性中,并且只能用 setState() 方法進行更新并思。這兩種緩存機制我們在編碼中是要進行取舍的庐氮。將input中的value綁定到state的React組件就是可控組件,反之則是不可控組件宋彼。

 class NameForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {value: ''};

    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleChange(event) {
    this.setState({value: event.target.value});
  }

  handleSubmit(event) {
    alert('A name was submitted: ' + this.state.value);
    event.preventDefault();
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Name:
          <input type="text" value={this.state.value} onChange={this.handleChange} />
        </label>
        <input type="submit" value="Submit" />
      </form>
    );
  }
}

由于 value 屬性是在表單元素上設(shè)置的弄砍,因此顯示的值將始終為 React數(shù)據(jù)源上this.state.value的值。由于每次按鍵都會觸發(fā) handleChange來更新當(dāng)前React的state输涕,所展示的值也會隨著不同用戶的輸入而更新音婶。

可控組件的優(yōu)點:
符合React單向數(shù)據(jù)流特性,即從state流向render輸出的結(jié)果莱坎,數(shù)據(jù)存儲在state中桃熄,便于訪問和處理。

【textarea】
  在HTML當(dāng)中型奥,<textarea> 元素通過子節(jié)點來定義它的文本內(nèi)容瞳收。在React中,<textarea>會用value屬性來代替厢汹,這樣的話螟深,表單中的<textarea>非常類似于使用單行輸入的表單:

<textarea value={this.state.value} onChange={this.handleChange} />

【select】
  在React中,并不使用之前的selected屬性烫葬,而在根select標(biāo)簽上用value屬性來表示選中項界弧。這在受控組件中更為方便,因為只需要在一個地方來更新組件搭综。

<select value={this.state.value} onChange={this.handleChange}>
  <option value="grapefruit">Grapefruit</option>
  <option value="lime">Lime</option>
</select>

【多個input】
  有處理多個受控的input元素時垢箕,可以通過給每個元素添加一個name屬性,來讓處理函數(shù)根據(jù) event.target.name的值來選擇做什么兑巾。

class Reservation extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      isGoing: true,
      numberOfGuests: 2
    };
    this.handleInputChange = this.handleInputChange.bind(this);
  }

  handleInputChange(event) {
    const target = event.target;
    const value = target.type === 'checkbox' ? target.checked : target.value;
    const name = target.name;
    this.setState({
      [name]: value
    });
  }

  render() {
    return (
      <form>
        <label>
          Is going:
          <input
            name="isGoing"
            type="checkbox"
            checked={this.state.isGoing}
            onChange={this.handleInputChange} />
        </label>
        <br />
        <label>
          Number of guests:
          <input
            name="numberOfGuests"
            type="number"
            value={this.state.numberOfGuests}
            onChange={this.handleInputChange} />
        </label>
      </form>
    );
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末条获,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蒋歌,更是在濱河造成了極大的恐慌帅掘,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堂油,死亡現(xiàn)場離奇詭異修档,居然都是意外死亡,警方通過查閱死者的電腦和手機府框,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門吱窝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事院峡⌒耸梗” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵撕予,是天一觀的道長。 經(jīng)常有香客問我蜈首,道長实抡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任欢策,我火速辦了婚禮吆寨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘踩寇。我一直安慰自己啄清,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布俺孙。 她就那樣靜靜地躺著辣卒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪睛榄。 梳的紋絲不亂的頭發(fā)上荣茫,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音场靴,去河邊找鬼啡莉。 笑死,一個胖子當(dāng)著我的面吹牛旨剥,可吹牛的內(nèi)容都是我干的咧欣。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼轨帜,長吁一口氣:“原來是場噩夢啊……” “哼魄咕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蚌父,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤蚕礼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后梢什,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奠蹬,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年嗡午,在試婚紗的時候發(fā)現(xiàn)自己被綠了囤躁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖狸演,靈堂內(nèi)的尸體忽然破棺而出言蛇,到底是詐尸還是另有隱情,我是刑警寧澤宵距,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布腊尚,位于F島的核電站,受9級特大地震影響满哪,放射性物質(zhì)發(fā)生泄漏婿斥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一哨鸭、第九天 我趴在偏房一處隱蔽的房頂上張望民宿。 院中可真熱鬧,春花似錦像鸡、人聲如沸活鹰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽志群。三九已至,卻和暖如春蛔钙,著一層夾襖步出監(jiān)牢的瞬間赖舟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工夸楣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宾抓,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓豫喧,卻偏偏與公主長得像石洗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子紧显,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

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