React 經(jīng)典案例--TodoList

上次寫了一個React生命周期詳解就缆,給新手看還是不是特別容易理解(其實我也是新手)宪萄,這邊再做一個React的todolist的dome做一個示例州叠。我也是剛接觸沒多久React 希望大家共同進步后众!

下邊直接上示例代碼:

項目結(jié)構

我這里是用的webpack做的打包,每個人的習慣不一樣印屁,所以目錄結(jié)構不必強求一樣循捺,只要自己理解就好。

app--|
     |--components
     |    |-- Input
     |    |    |--index.jsx
     |    |    |--index.less
     |    |--List
     |        |--index.jsx
     |        |--index.less
     |--containers
     |    |--TodoList
     |        |--index.jsx
     |--index.jsx
     |--index.html

示例代碼

展示組件

Input子組件

// ../../components/Input/index
import React from 'react'
// 組件的樣式文件
import './index.less'
class Input extends React.Component {
  constructor(props, context) {
    super(props, context)
    this.state = {
      // 初始化state
      value: ''
    }
  }

  handleChange(e) {
    this.setState({
      value: e.target.value
    })
  }

  handleSubmit(e) {
    let text = this.state.value;
    // 判斷是否是回車鍵 并且text不為空才提交text
    if (e.keyCode == 13 && text.trim()) {
      this.props.addTodoList (text);
      // 提交后清空輸入框value值
      this.setSate({
        value: '' 
      })
    }
  }

  render() {
    return(
      <div className="header">
        <input type="text" onKeyUp={this.handleSubmit.bind(this)} onChange={this.handleChange.bind(this)} value={this.state.value}/>
      </div>
    )
  }
}
export default Input;

樣式文件在此就不展示出來了雄人。
這里需要說明一下我在學習時學到的幾個知識點:

  1. class類名因為是class在ES6中是定義類从橘,所以在DOM中class要寫成className
  2. 給某個元素增加事件時最好是都帶上bind(this) ,例如:onChange={this.handleChange.bind(this)}础钠,因為在事件函數(shù)中一般都會使用到state或者props中的屬性或者方法恰力,雖然有的時候也許用不到,不過還是養(yǎng)成一個寫上的習慣旗吁。
  3. 輸入框的value值踩萎,一般如果你是默認攜帶的有值,不可以直接寫 value="xxx" react會有這個值可能需要改變很钓,這種寫法在change中無法改變之類的警告香府, 如果真的需要有默認值可以寫成 defaultValue="xxxx"董栽。我這里是將 state中的value賦值在input的屬性里,然后通過input的onChange 來設置state做到改變value值企孩。這也是我在學習過程中在一個視頻教程上講到的約束性寫法锭碳。

List子組件

// ../../components/List/index
import React from 'react'
import './index.less';
class List extends React.Component {
  constructor(props, context) {
    super(props, context)
  }
  
  handleClick(id){
    this.props.deleteItem(id)
  }

  render() {
    let todos = this.props.todos ? this.props.todos : [];
    return (
      <div className="list-content">
        <ul className="list">
          {
            todos.map((item, index) => {
              return (
                <li key={index} className="item">
                  {item.text}
                  <span className="delete-btn" onClick={this.handleClick.bind(this, item.id)}>X</span>
                </li>
              )
            })
          }
        </ul>
      </div>
    )
  }
}
export default List;

業(yè)務組件

TodoLIst組件

// ./containers/TodoList/index
import React from 'react'
import Input from '../../components/Input/index';
import List from '../../components/List/index';

class TodoList extends React.Component {
  constructor(props, context) {
    super(props, context)
    this.state = {
      todos: []
    }
  }

  // 刪除單挑數(shù)據(jù)
  deleteItem(id) {
    let data = this.state.todos;
    this.setState({
      todos: data.filter((item, index) => {
        if (item.id !== id) {
          return item;
        }
      })
    })
  }

  // 添加單條數(shù)據(jù)
  addTodoList(value) {
    const id = Date.now();
    this.setState({
      todos: this.state.todos.concat({
        id: id,
        text: value
      })
    })

  }

  render() {
    return (
      <div>
        <Input addTodoList={this.addTodoList.bind(this)} />
        <List todos={this.state.todos} deleteItem={this.deleteItem.bind(this)} />
      </div>
    )
  }
};
export default TodoList;

這里的展示組件,業(yè)務組件我說一下我的理解:

  • 展示組件:負責頁面的渲染勿璃,效果展示擒抛。其數(shù)據(jù)來源是業(yè)務組件傳遞過來的props,或者自身的state补疑,其處理函數(shù)都由業(yè)務組件定義的函數(shù)通過props傳遞過來歧沪,在自身函數(shù)中與業(yè)務組件做數(shù)據(jù)交互。
  • 業(yè)務組件: 負責與服務器做ajax請求莲组、數(shù)據(jù)的獲取诊胞、業(yè)務邏輯的定義等業(yè)務交互。例如本案例的添加數(shù)據(jù)的函數(shù)锹杈,刪除數(shù)據(jù)的函數(shù)都是在TodoList組件定義好 厢钧,傳遞給對應的子組件。而List列表的數(shù)據(jù)也是由這個組件傳遞過去的嬉橙。

入口文件

// index.jsx
import { render } from 'react-dom';
// 公共樣式
import './static/css/common.less'
import TodoList from './containers/TodoList/index'

render(
  <TodoList />,
  document.getElementById('root')
)
// index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>react todo list</title>
</head>
<body>
  <div id="root"></div>
</body>
</html>

展示效果

1516766313669.jpg
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末子寓,一起剝皮案震驚了整個濱河市玉组,隨后出現(xiàn)的幾起案子粥鞋,更是在濱河造成了極大的恐慌撒顿,老刑警劉巖洼畅,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件不见,死亡現(xiàn)場離奇詭異柑营,居然都是意外死亡蒋纬,警方通過查閱死者的電腦和手機萤彩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門粪滤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人雀扶,你說我怎么就攤上這事杖小。” “怎么了愚墓?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵予权,是天一觀的道長。 經(jīng)常有香客問我浪册,道長扫腺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任村象,我火速辦了婚禮笆环,結(jié)果婚禮上攒至,老公的妹妹穿的比我還像新娘。我一直安慰自己躁劣,他們只是感情好迫吐,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著习绢,像睡著了一般渠抹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上闪萄,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天梧却,我揣著相機與錄音,去河邊找鬼败去。 笑死放航,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的圆裕。 我是一名探鬼主播广鳍,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吓妆!你這毒婦竟也來了赊时?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤行拢,失蹤者是張志新(化名)和其女友劉穎祖秒,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舟奠,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡竭缝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了沼瘫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抬纸。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖耿戚,靈堂內(nèi)的尸體忽然破棺而出湿故,到底是詐尸還是另有隱情,我是刑警寧澤溅话,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布晓锻,位于F島的核電站,受9級特大地震影響飞几,放射性物質(zhì)發(fā)生泄漏砚哆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望躁锁。 院中可真熱鬧纷铣,春花似錦、人聲如沸战转。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽槐秧。三九已至啄踊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間刁标,已是汗流浹背颠通。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留膀懈,地道東北人顿锰。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像启搂,于是被迫代替她去往敵國和親硼控。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

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

  • 最近看了一本關于學習方法論的書胳赌,強調(diào)了記筆記和堅持的重要性牢撼。這幾天也剛好在學習React,所以我打算每天堅持一篇R...
    gaoer1938閱讀 1,685評論 0 5
  • HTML模版 之后出現(xiàn)的React代碼嵌套入模版中疑苫。 1. Hello world 這段代碼將一個一級標題插入到指...
    ryanho84閱讀 6,243評論 0 9
  • It's a common pattern in React to wrap a component in an ...
    jplyue閱讀 3,272評論 0 2
  • GUIDS 第一章 為什么使用React浪默? React 一個提供了用戶接口的JavaScript庫。 誕生于Fac...
    jplyue閱讀 3,538評論 1 11
  • 自己最近的項目是基于react的缀匕,于是讀了一遍react的文檔,做了一些記錄(除了REFERENCE部分還沒開始讀...
    潘逸飛閱讀 3,392評論 1 10