vue.js實(shí)現(xiàn)todomvc---實(shí)踐學(xué)vue(中)

本期教程目標(biāo)

  • 點(diǎn)擊x刪除任務(wù)

  • 雙擊任務(wù)對(duì)任務(wù)進(jìn)行編輯

  • 編輯任務(wù)后按enter鍵或者讓輸入框失去焦點(diǎn)時(shí)會(huì)保存編輯的任務(wù)。而按esc鍵時(shí),會(huì)撤銷編輯。


    Snipaste_2018-01-22_00-03-51.png

    ??相信通過(guò)上一期的學(xué)習(xí),我們對(duì)todomvc有一個(gè)大概的了解,當(dāng)然了大伙都知道打打豆豆并不是一個(gè)好行為,這一章節(jié),我們有三個(gè)目標(biāo),都是圍繞著修改打打豆豆展開(kāi)的,最終目標(biāo)就是讓豆豆不被挨打,瞧多么重要的事情,讓我們來(lái)完成吧。

    目標(biāo)1:點(diǎn)擊x刪除某一項(xiàng)任務(wù)
    

??要想完成這一目標(biāo),我們還是需要從數(shù)據(jù)驅(qū)動(dòng)來(lái)思考。其實(shí)上一章節(jié)中,我們已經(jīng)知道,每一個(gè)任務(wù),其實(shí)都是list數(shù)組v-for出來(lái)的,所以我們只需要將數(shù)組中的數(shù)據(jù)刪除,這樣被刪除的數(shù)據(jù)就不能再渲染到視圖上,從而實(shí)現(xiàn)刪除任務(wù)的效果。既然有了思路,剩下的就簡(jiǎn)單很多了。

Snipaste_2018-01-22_00-19-35.png

??通過(guò)調(diào)試工具我們可以輕松的找到x對(duì)應(yīng)的html結(jié)構(gòu)(這里說(shuō)個(gè)題外的,自己手?jǐn)]頁(yè)面的時(shí)候發(fā)現(xiàn),跟火狐相比V8引擎是真的快,奈何需要翻墻才能裝插件,確實(shí)也是真的煩),找到按鈕后我們可以通過(guò)v-on為按鈕添加一個(gè)刪除事件處理函數(shù)。
Snipaste_2018-01-22_00-31-59.png

這個(gè)處理函數(shù)的偽代碼應(yīng)該是這樣的找到當(dāng)前item在數(shù)組中的位置,然后刪除它所以真是代碼為
Snipaste_2018-01-22_00-32-08.png

很好這樣我們就能完成刪除打打豆豆的任務(wù)了,非常好!但是堵不如疏,我們更希望的并不是不打豆豆而是將打豆豆的行為變?yōu)閻?ài)護(hù)豆豆的行為,這時(shí)候我們就需要進(jìn)行任務(wù)的修改了。

  目標(biāo)2:修改任務(wù)內(nèi)容

??我們需要的效果是,雙擊任務(wù),彈出一個(gè)輸入框,進(jìn)行輸入。為了達(dá)到這樣的效果,我們需要先將對(duì)應(yīng)的class類名找到,大概效果就是隱藏當(dāng)前標(biāo)簽,出現(xiàn)一個(gè)輸入框,猜測(cè)下,應(yīng)該可以通過(guò)定位完成,所以我們現(xiàn)在任務(wù)標(biāo)簽附近尋找,有無(wú)輸入框,很但是這里0-06.png](http://upload-images.jianshu.io/upload_images/9947395-75111b289dfd52ff.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
當(dāng)然了這一步如果沒(méi)有文檔我們只能推測(cè)出,修改肯定是在li內(nèi)的input上,但是很難推測(cè)到底是添加或刪除那個(gè)類名才能實(shí)現(xiàn)編輯的效果,索性文檔中已經(jīng)提到了List items should get the class editing when editing and completed when marked as completed
這句話告訴我們,在需要編輯時(shí)添加editing類名在li上,而任務(wù)完成時(shí),需要添加completed類。這里我們只用得上前半句

Snipaste_2018-01-22_09-30-00.png

Snipaste_2018-01-22_09-31-57.png

??嗯?看起來(lái)很美,但是真的沒(méi)毛病嗎?當(dāng)然是有問(wèn)題了,這又是一個(gè)坑,當(dāng)時(shí)我在寫這段代碼的時(shí)候就自然而然的掉進(jìn)坑里了,當(dāng)時(shí)花了2個(gè)小時(shí)才想通為什么錯(cuò)了的原理,希望大伙看了這篇章節(jié),能夠輕松跳過(guò)這個(gè)坑。
??首先我們的思路是將"bianji"這個(gè)變量私有到對(duì)應(yīng)的對(duì)象中,從而實(shí)現(xiàn)雙擊對(duì)應(yīng)的任務(wù)改變對(duì)應(yīng)的視圖。但是真的當(dāng)我們雙擊時(shí),視圖并不會(huì)改變,item.bianji的值卻實(shí)實(shí)在在的變?yōu)榱藅rue。出現(xiàn)這個(gè)問(wèn)題,我的第一反應(yīng)就是數(shù)據(jù)沒(méi)有響應(yīng)的綁定到視圖上,但是相信大伙在剛剛接觸vue的時(shí)候,總會(huì)被響應(yīng)的數(shù)據(jù)綁定這句話所震撼,自然而然的想到,在vue中無(wú)論什么地方的數(shù)據(jù)都會(huì)響應(yīng)的綁定到視圖中,但是文檔中有明確的說(shuō)明。讓我們來(lái)看看文檔的這一句話

Snipaste_2018-01-22_09-39-22.png

Snipaste_2018-01-22_09-40-00.png

相信大伙看到這里就明白很多了,我們使用上面那種辦法,確實(shí)是改變了想要改變的數(shù)據(jù),但是,item.bianji并沒(méi)有出現(xiàn)在vue的data函數(shù)中,這樣無(wú)論item.bianji怎樣改變,只有當(dāng)因?yàn)閯e的原因視圖更新時(shí),item.bianji的值才會(huì)更新到視圖上,所以并不能實(shí)現(xiàn)雙擊編輯任務(wù)的效果。很好,既然知道是哪里錯(cuò)了,問(wèn)題就會(huì)變得很簡(jiǎn)單,我們只要想辦法將item.編輯加入data中即可,這次我把目標(biāo)放在了data中的list上,list更新時(shí)也會(huì)響應(yīng)到視圖中,我們只要能找到雙擊時(shí)對(duì)應(yīng)的item,然后在改變那個(gè)item里面的bianji屬性即可。具體的代碼實(shí)現(xiàn)為:
Snipaste_2018-01-22_09-50-32.png

html的結(jié)構(gòu)不用修改,只用在添加任務(wù)的時(shí)候,加入bianji屬性,這樣bianji屬性就相當(dāng)于是添加到了data中,此時(shí)再改變item.bianji就會(huì)產(chǎn)生響應(yīng)的視圖效果。這樣我們就達(dá)到了,雙擊鼠標(biāo),編輯任務(wù)的效果。這里防止新手大伙跳入另一個(gè)坑就再多提一句
Snipaste_2018-01-22_09-53-55.png

文檔中的這句話告訴我們,在vue實(shí)例創(chuàng)造后,動(dòng)態(tài)添加的新屬性并不能響應(yīng)的綁定到視圖中。
  目標(biāo)3:編輯任務(wù)后按enter鍵或者讓輸入框失去焦點(diǎn)時(shí)會(huì)保存編輯的任務(wù)。而按esc鍵時(shí),會(huì)撤銷編輯。

首先,編輯任務(wù)后按enter鍵或者讓輸入框失去焦點(diǎn)時(shí)會(huì)保存編輯的任務(wù),這兩點(diǎn)都很簡(jiǎn)單,無(wú)非就是給input編輯框綁定兩個(gè)事件即可。這里沒(méi)有什么大伙需要注意的坑,代碼實(shí)現(xiàn)如下:
Snipaste_2018-01-22_10-05-24.png
Snipaste_2018-01-22_10-05-38.png

以上唯一需要注意的點(diǎn)就是:
Snipaste_2018-01-22_10-08-04.png

??之所以能夠這么處理,還是因?yàn)閕tem.title是data中的東西,雙向綁定后,試圖影響內(nèi)存中的數(shù)據(jù),所以修改完成后,取消編輯類名editing就可以看到編輯完成的狀態(tài),因?yàn)閐ata中的數(shù)據(jù)都是響應(yīng)的綁定在視圖中。
??很好,現(xiàn)在就剩最后一個(gè)點(diǎn)了,編輯時(shí)按esc鍵時(shí),會(huì)撤銷編輯。
??想要實(shí)現(xiàn)這樣的效果的思路是,雙擊時(shí)將被編輯的任務(wù)數(shù)據(jù)保存起來(lái),如果監(jiān)聽(tīng)到esc按下,則將保存的值重新賦值給原來(lái)的item.title。所以代碼實(shí)現(xiàn)為:


Snipaste_2018-01-22_10-28-47.png
Snipaste_2018-01-22_10-30-00.png

以上就完成了本章節(jié)的所有內(nèi)容。

  • 下節(jié)預(yù)告:


    Snipaste_2018-01-22_10-31-24.png
  • 實(shí)現(xiàn)上圖中顯示未完成任務(wù)個(gè)數(shù)的動(dòng)態(tài)響應(yīng)
  • vue的路由切換
  • 以及點(diǎn)擊clear completed按鈕,清除所有完成任務(wù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 翻譯自“Collection View Programming Guide for iOS” 0 關(guān)于iOS集合視...
    lakerszhy閱讀 4,076評(píng)論 1 22
  • 這是vue官網(wǎng)的一個(gè)例子,挺適合作為vue應(yīng)用的入門的。通過(guò)這個(gè)應(yīng)用,我們能學(xué)到vue的【雙向綁定】,【v-for...
    進(jìn)擊的前端閱讀 10,261評(píng)論 3 33
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,379評(píng)論 4 61
  • 看見(jiàn)這個(gè)標(biāo)題,你們第一反應(yīng)會(huì)想到什么? 按照慣性一般會(huì)說(shuō),你肯定是感冒了,鼻涕像關(guān)不掉的水龍頭一樣一直流。 其實(shí)沒(méi)...
    于炫閱讀 489評(píng)論 0 1
  • 精英群周大事件:成立開(kāi)源社區(qū) Higer發(fā)布: 區(qū)塊鏈研習(xí)社的開(kāi)源社區(qū)成立啦!這個(gè)社區(qū)將延續(xù)比特幣開(kāi)源,共享,平等...
    loloooo閱讀 1,461評(píng)論 0 7

友情鏈接更多精彩內(nèi)容