使用react實現(xiàn)一個todolist

效果如下:


image.png

分析組件:
1.頭部:標題
2.內(nèi)容:列表項+刪除
3.尾部:添加列表項
4.包裹所有組件的App.js,在這個大的組件包含所有的屬性及操作


image.png

標題

//header.js
import React,{Component } from 'react';
import "./header.css"

class Header extends Component{
    render(){
        return (
            <div className="header">
                任務便簽
            </div>
        )
    }
}
export default Header

在App.js引出:

<Header />

尾部添加

分析:
1.因為所有的操作都會在App.js里面去操作,所以子組件的所以初始化的屬性都需要通過父組件傳值給子組件藕筋;比如輸入框的value屬性值
2.通過onChange事件獲取用戶輸入的值牍帚,試想:怎么讓用戶輸入的值顯示在輸入框里面呢:也就是說我怎么把輸入的值賦值給父組件的value骚露,這就需要使用子組件觸發(fā)父組件的函數(shù)孽江,并傳值給父組件:this.props.這個方法(傳的值)
3.當點擊添加按鈕的時候辜腺,我需要將輸入的值追加到定義的List,同樣在子組件點擊按鈕默勾,觸發(fā)父組件的方法
footer.js

class Header extends Component{
        handleInput(e){
          this.props.handleInput(e.target.value)
        }
        handleAdd(){
          this.props.handleAdd()
        }
     render(){
        return (
            <div className="footer">
                <input type="text" value={this.props.value} onChange={this.handleInput.bind(this)}>
                              <button onChlick={this.handleAdd.bind(this)}>添加</button>
            </div>
        )
    }
}
//父組件
constructor(props) {
        super(props)
        this.state = {
            list: [{
                name: 'learn english',
                status: 0
            }, {
                name: 'Learn guitar',
                status: 0
            }, {
                name: 'weight less than 100',
                status: 0
            }, {
                name: 'have 100,000 deposit',
                status: 0
            }],
            value:"",
        }
    }
//父組件接受子組件傳的值
handleInput(val){
  this.setData({
    value:val
  })
}
handleAdd(){
  if(!this.state.value){
    return false
  }
  this.setState({
    list:[...this.state.list,{
      name:this.state.value,
      status:0,
    }],
  value:""
  })
}
render{
  return (
  <Footer value={this.state.list} handleInput={this.handleInput.bind(this)} handleAdd={this.handleAdd.bind(this)}  />
)
}

中間列表項

分析:
1.列表項是由一個單選框碉渡,名字,刪除按鈕
2.因為列表項可能會有很多母剥,則使用map方法
3.單選框的選中狀態(tài)是由List的status為1才表示已選中爆价,當選中狀態(tài)發(fā)生改變時,怎么讓list的status實時去改變呢媳搪,所以需要出發(fā)父組件的方法铭段,
4.當該列表項為選中時,則該文字會加上刪除線:利用text-decoration-line:值為"line-through"時表示文字中間部分畫線
5.點擊刪除按鈕是需要刪除當前用戶點擊的那一行秦爆,所以怎么判斷用戶是當前那一行是一個問題:
6.已完成的數(shù)量是表示status為1的個數(shù)

// this.handleclick.bind(this序愚,要傳的參數(shù))  handleclick(傳過來的參數(shù),event)
class ListItem extends Component{
    handleFished(name){
        // 子組件向父組件傳值
        // 在子組件點擊的li得到的值等限,交給父組件去做交互
        this.props.handleFished(name);
    }
    handleDelete(name){
        this.props.handleDelete(name)
    }
    render(){
        return (
            <ul>
                {this.props.data.map((item,index)=>{
                    return (
                        <li key={index} className="listItem">
                            <input type="checkbox" checked={item.status===1} onChange={this.handleFished.bind(this,item.name)} />
                            <span style={{textDecorationLine:item.status===0?'none':'line-through'}}>{item.name}</span>
                            <button className="delete" onClick={this.handleDelete.bind(this,item.name)}>刪除</button>
                        </li>
                    )
                })}
                <li>已完成:{this.props.finished}/總數(shù):{this.props.data.length}</li>
            </ul>
        )
    }
}
export default ListItem

父組件:

constructor(props) {
        super(props)
        this.state = {
            list: [{
                name: 'learn english',
                status: 0
            }, {
                name: 'Learn guitar',
                status: 0
            }, {
                name: 'weight less than 100',
                status: 0
            }, {
                name: 'have 100,000 deposit',
                status: 0
            }],
            finished:0,//已完成的個數(shù)
        }
}
handleFished(name){
  const list=[];
  let sum=0;
  this.state.list.forEach((item,index){
    //判斷用戶點擊的是當前所點擊的那一行
    if(item.name=name){
      let val=this.state.list[index]
      let obj={
        name:val.name,
        status:val.status===0?1:0
      }
      list.push(Object.assign({},obj))
      this.setState({
        list:list
      },()=>{
        this.state.list.forEach(item=>{
          if(item.status===1){
            sum++;
          }
          this.setState({
            finished:sum
          })
        })
      })
    } else{
      list.push(item)
    }
  })

}
handleDelete(name){
  let arr=this.state.list.filter((item)=>{
            return item.name!==name
        })
        this.setState({
            list:arr
        })
}
render(){
  return(
    <ListItem data={this.state.list} finished={this.state.finished} handleFished={this.handleFished.bind(this)} handleDelete={this.handleDelete.bind(this)}  />
  )
}

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爸吮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子望门,更是在濱河造成了極大的恐慌形娇,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筹误,死亡現(xiàn)場離奇詭異桐早,居然都是意外死亡,警方通過查閱死者的電腦和手機厨剪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門哄酝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人祷膳,你說我怎么就攤上這事陶衅。” “怎么了直晨?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵搀军,是天一觀的道長膨俐。 經(jīng)常有香客問我,道長罩句,這世上最難降的妖魔是什么吟策? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮的止,結果婚禮上檩坚,老公的妹妹穿的比我還像新娘。我一直安慰自己诅福,他們只是感情好匾委,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著氓润,像睡著了一般赂乐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咖气,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天挨措,我揣著相機與錄音,去河邊找鬼崩溪。 笑死浅役,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的伶唯。 我是一名探鬼主播觉既,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼乳幸!你這毒婦竟也來了瞪讼?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤粹断,失蹤者是張志新(化名)和其女友劉穎符欠,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓶埋,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡希柿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了悬赏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狡汉。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖闽颇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寄锐,我是刑警寧澤兵多,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布尖啡,位于F島的核電站,受9級特大地震影響剩膘,放射性物質(zhì)發(fā)生泄漏衅斩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一怠褐、第九天 我趴在偏房一處隱蔽的房頂上張望畏梆。 院中可真熱鬧,春花似錦奈懒、人聲如沸奠涌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽溜畅。三九已至,卻和暖如春极祸,著一層夾襖步出監(jiān)牢的瞬間慈格,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工遥金, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留浴捆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓稿械,卻偏偏與公主長得像汤功,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子溜哮,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

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