第一個前端組件-tab

自學(xué)前端不久,記錄遇到的問題和解決方案-------作者按

選項(xiàng)卡是一個非常常見的組件,也相對簡單,下面記錄了我遇到的一些問題和總結(jié)反思。

目標(biāo)是最普通的選項(xiàng)卡,上面有三個按鈕,點(diǎn)擊按鈕在下方內(nèi)容區(qū)分別顯示不同內(nèi)容。

html和css實(shí)現(xiàn):

方法一:將三張圖片從上到下堆放,將內(nèi)容區(qū)設(shè)置為overflow:hidden,獲取內(nèi)容的top值,通過改變top值來顯示不同圖片。

方法二:方法一的實(shí)現(xiàn)方式有違選項(xiàng)卡的含義,因此在方法二中選擇讓圖片們進(jìn)行絕對定位,相互層疊,設(shè)置display:none,opacity:0,當(dāng)選項(xiàng)被激活,設(shè)置active類為display:block,opacity:1,z-index:3。

到這里位置基本實(shí)現(xiàn)功能,考慮到組件化對命名的要求,參考 puerh的命名規(guī)則重新命名,如下:

使用類名選擇器對樣式進(jìn)行設(shè)置,如下所示(部分):

下面進(jìn)行js部分的書寫:

作為前端菜鳥剛開始選擇了最菜鳥的寫法,將每個按鈕的事件分別添加,如下:

寫完這部分丑陋的js就可以看到功能完整的選項(xiàng)卡了:

下面就要進(jìn)入本文的重點(diǎn),js組件化

作為一個菜鳥看到上面的成果還是有點(diǎn)高興,但仔細(xì)一想,發(fā)現(xiàn)這是一個不能重用的“組件”,主要問題出在哪里呢?就是js,目前的js操作只針對當(dāng)前這唯一一個tab,假如我復(fù)制一個tab,完全不能實(shí)現(xiàn)同樣的功能。此外上圖所示的js代碼冗長多余,應(yīng)該使用循環(huán)嵌套的方式,如下:

結(jié)果運(yùn)行出錯,Uncaught TypeError: Cannot set property 'className' of undefined,仔細(xì)查看了幾遍代碼發(fā)現(xiàn)是作用域的問題,事件里面的函數(shù)將會在for循環(huán)完成后才會被觸發(fā),因此導(dǎo)致這時的i已經(jīng)變成了lists.length。

解決方案:在外面包一個函數(shù),如下:

復(fù)制一份tab,運(yùn)行,大功告成:


上述解決方案使用了兩層閉包,可以改寫成下面這樣,結(jié)構(gòu)比較清晰

當(dāng)然如果采用Jquery這個組件就非常簡單了,三行代碼就ok

后記:雖然是個非常簡單地組件,可能做得也不完善,但收獲不少,特此記錄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,420評論 25 708
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,246評論 4 61
  • 初級階段 探求人性的原理,用醫(yī)學(xué)手段或完善社會結(jié)構(gòu)使人的本性與社會結(jié)構(gòu)高度統(tǒng)一,充分發(fā)揮人的自我發(fā)展。推動科學(xué)發(fā)展...
    問思答閱讀 416評論 0 0
  • 1. 距離學(xué)習(xí)JavaScript編程語言網(wǎng)絡(luò)課程,已經(jīng)結(jié)束一周了多了。原來每周兩次的直播,現(xiàn)在突然結(jié)束了,還真有...
    西門吹餅閱讀 955評論 2 2
  • 汪瓊 題記:對在乎的人與事,拼盡當(dāng)時的全力,以為會少些遺憾、愧疚,但終是有太多遺憾、太多愧疚。時間也許不是解藥,但...
    犟龜汪瓊閱讀 491評論 1 1