先來描述一下遇到的問題:
條件1:父組件A調(diào)用子組件B寝并,并傳入了一個數(shù)組羊苟,在組件B中需要根據(jù)組件A傳過來的數(shù)組遍歷出一個個li 標(biāo)簽,并且能夠?qū)崿F(xiàn)對li標(biāo)簽的多選爱态。
條件2:項目引用的圖標(biāo)是基于iconfont實現(xiàn)的谭贪,為了統(tǒng)一規(guī)則,圖標(biāo)只能在js中引用锦担,不可以在css中引用俭识,所以在代碼中會一次性引入兩個icon,那么到底顯示哪個呢洞渔?那就需要css來解決了套媚。
先看一下 iconfont 中我需要的兩個 icon?
很明顯,一個表示選中狀態(tài)一個表示沒有選中的狀態(tài)磁椒,在代碼中使用的規(guī)則如下:
剛剛說到堤瘤,兩個icon同時放到一個div中的話就會導(dǎo)致同時看到就會兩個icon,這個時候div的className是一個變量“select”就是這里的關(guān)鍵浆熔,看一下select是如何設(shè)值的:
上面中的file就是數(shù)組的一個元素本辐,剛開始的時候file沒有isselected這個元素,也就是說file.isselected應(yīng)該是等于undefined的医增,那么就是執(zhí)行else語句慎皱,那么就應(yīng)該是
然后在css里面進(jìn)行布局設(shè)置:
1.如果沒有選中,div的class就是select叶骨,那么就應(yīng)該根據(jù)css的上半部分來顯示茫多,也就是顯示.active的內(nèi)容
2.如果選中,div的class就是 select active忽刽,會渲染上面的css天揖,但是最終的效果還是下面的:顯示alicon的內(nèi)容夺欲,隱藏active的內(nèi)容
這樣就實現(xiàn)了他們之間的切換。
但是1ζ省=嗳颉!
file.isselected這個值如何設(shè)置呢万细?
這個就需要通過state來實現(xiàn)了,給div綁定一個click事件:
這里只簡單的說一下方法的思路纸泄,具體實現(xiàn)看上面的代碼就可以了:
首先我們根據(jù) 點(diǎn)擊的這個div綁定的file就可以獲取到這個file的myid值(這里file是有這個值的赖钞,前面沒交代清楚),然而 file 是屬于allfilepackageList 數(shù)組中的某一個(請注意這里的某一個聘裁,我們現(xiàn)在還不知道具體是哪個)雪营,
我們就遍歷allfilepackageList數(shù)組,然后將每一個值的myid和file的myid值進(jìn)行比較衡便,如果相等就是說明目前點(diǎn)擊的就是這個file献起,那么它就被選中了(也有可能是被選中了或者取消選中),那么只需要將這個this.state.allfilepackageList【i】的isselected進(jìn)行取反就可以了(如果原來被選中镣陕,就取消選中谴餐,設(shè)值為false;如果原來沒有被選中呆抑,就選中岂嗓,設(shè)值為true)
然后通過setState來重新渲染就可以實現(xiàn)了
寫在最后面的話:
這篇文章是在實際項目中遇到的問題而“終結(jié)”出來的,說是終結(jié)還不如說是抄過來的鹊碍,但是咱不怕厌殉。把別人的東西變成自己的東西那也是自己的是吧?
工作了半年之久侈咕,遇到了很多的問題公罕,也很少總結(jié)。這篇所謂的總結(jié)也只是遇到問題耀销、解決方法楼眷。然而沒有更深入的理解里面的原理,甚至從始至終都沒有看過源碼树姨。這是我自身一個很大的問題摩桶!
希望能找到好的方法總結(jié)學(xué)習(xí),希望自己能夠更勤奮帽揪!深挖硝清,死究!努力提高自己的能力转晰,變得強(qiáng)大B谩J快!
戒躁蔗崎!