微信小程序點(diǎn)擊切換class

問題描述

在瀏覽器端開發(fā)時(shí)锅睛,經(jīng)常會(huì)有這種情況:?jiǎn)螕裟硞€(gè)元素煌茴,讓其高亮顯示,例如下圖


點(diǎn)擊添加class

這個(gè)用 js 很容易實(shí)現(xiàn)双妨, 因?yàn)閱螕羰录|發(fā)時(shí)淮阐,函數(shù)傳入的 event 事件包含 target 對(duì)象,里面會(huì)有觸發(fā)事件的 DOM 元素刁品,我們只需要操作這個(gè) DOM 元素泣特,為其添加 class 名就好了。

而在微信小程序開發(fā)時(shí)挑随,由于其類似于 vue 不建議直接操作 DOM (兩者都有API可以做到)状您,事件觸發(fā)的時(shí)候同樣會(huì)有默認(rèn)參數(shù)傳入, 但是無法直接取到 DOM 節(jié)點(diǎn)本身兜挨,而是包含掛載的一些數(shù)據(jù)膏孟,和點(diǎn)擊部位的坐標(biāo)信息等,具體參閱官方文檔《事件·小程序》 拌汇,this 也總是指向 Page 柒桑,所以我們就需要通過數(shù)據(jù)間接操縱 DOM來實(shí)現(xiàn)。

例如我遇到的問題是担猛,我想做一個(gè)月歷幕垦,當(dāng)你選中某一天的時(shí)候,那一天高亮顯示傅联。

參考解決方案

由于自己在做這一塊時(shí)遇到了很多這方面的困惑先改,所以我在網(wǎng)上看了一些解決方案,下面列舉一種在 CSDN 上看到的方案

  • wxml
<view class="list-wrapper">
      <view class="list-top">
         <view data-num="1" class="list-menu list-menu1 {{_num==1?'cur':''}}" bindtap="menuClick">頭條</view>
         <view data-num="2" class="list-menu list-menu2 {{_num==2?'cur':''}}" bindtap="menuClick">活動(dòng)</view>
         <view data-num="3" class="list-menu list-menu3 {{_num==3?'cur':''}}" bindtap="menuClick">公告</view>
      </view>
</view>
  • js
menuClick:function(e){
  this.setData({
    _num:e.target.dataset.num
  })
},

這個(gè)方法綁定了一個(gè)動(dòng)態(tài)的 class 名蒸走,用一個(gè)變量 _num 可以做到切換 class 的作用仇奶,當(dāng)點(diǎn)擊元素時(shí),js 獲取到節(jié)點(diǎn)上 data-num 上的值比驻,這里將值賦給變量 _num 该溯,相應(yīng)的由于是數(shù)據(jù)驅(qū)動(dòng),節(jié)點(diǎn)上的 class 名經(jīng)過計(jì)算變化為 cur 别惦,其他的同理狈茉。

原始解決方案

在沒有搞清這個(gè)方法前,我制作月歷是使用的條件渲染掸掸。具體做法是氯庆,每個(gè)日期節(jié)點(diǎn)準(zhǔn)備兩個(gè) DOM 元素蹭秋,一個(gè)帶有 class="selected" ,一個(gè)沒有堤撵, 經(jīng)過列表渲染之后每個(gè)單位實(shí)際上存在兩個(gè)邏輯上的元素仁讨,這個(gè)時(shí)候通過點(diǎn)擊改變 Pagedata 里面的 selectedDateselectedDate ,進(jìn)一步控制 wx:if 的條件來實(shí)現(xiàn)元素的渲染與否实昨。

<!-- 列表渲染 -->
<view wx:for="{{unit.dates}}" wx:key="item.date">
  <view wx:if="{{item.date == selectedDate && item.month == selectedMonth}}" class="selected" data-year="{{item.year}}" data-month="{{item.month}}" data-date="{{item.date}}">{{item.date}}</view>
  <view wx:else data-year="{{item.year}}" data-month="{{item.month}}" data-date="{{item.date}}">{{item.date}}</view>
</view>

點(diǎn)擊事件發(fā)生時(shí)洞豁,獲取節(jié)點(diǎn)中的 data-monthdata-date 值, 并賦給 selectedDateselectedDate

由于每個(gè)月都有某些日期荒给, 所以加個(gè)月份限制丈挟,這里我設(shè)置了只做從這個(gè)月到未來6個(gè)月的月歷,所以不需要加年份限制锐墙。

深知這個(gè)方案問題很大礁哄,是這一類的MVVM框架因的條件渲染切換消耗較大,微信小程序開發(fā)文檔中介紹了 wx:if 相關(guān)

wx:if vs hidden
因?yàn)?wx:if 之中的模板也可能包含數(shù)據(jù)綁定溪北,所有當(dāng) wx:if 的條件值切換時(shí)桐绒,框架有一個(gè)局部渲染的過程,因?yàn)樗鼤?huì)確保條件塊在切換時(shí)銷毀或重新渲染之拨。
同時(shí) wx:if 也是惰性的茉继,如果在初始渲染條件為 false,框架什么也不做蚀乔,在條件第一次變成真的時(shí)候才開始局部渲染烁竭。
相比之下,hidden 就簡(jiǎn)單的多吉挣,組件始終會(huì)被渲染派撕,只是簡(jiǎn)單的控制顯示與隱藏。
一般來說睬魂,wx:if 有更高的切換消耗而 hidden 有更高的初始渲染消耗终吼。因此,如果需要頻繁切換的情景下氯哮,用 hidden 更好际跪,如果在運(yùn)行時(shí)條件不大可能改變則 wx:if 較好。

當(dāng)用戶點(diǎn)擊某個(gè)日期的時(shí)候會(huì)重新渲染整個(gè) DOM 喉钢,所以這個(gè)方案并不好姆打。

改進(jìn)方案

<view class="day {{item.date > 0 ? '' : 'hidden'}}" wx:for="{{unit.dates}}" wx:key="item.date">
  <view wx:if="{{item.date > 0}}">
    <view class="{{item.date == selectedDate && item.month == selectedMonth ? 'selected' : ''}}" data-year="{{item.year}}" data-month="{{item.month}}" data-date="{{item.date}}">{{item.date}}</view>
  </view>
</view>

搞懂前面的邏輯,再來看這個(gè)方案就會(huì)很明白了肠虽。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末幔戏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子税课,更是在濱河造成了極大的恐慌评抚,老刑警劉巖豹缀,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異慨代,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)啸如,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門侍匙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叮雳,你說我怎么就攤上這事想暗。” “怎么了帘不?”我有些...
    開封第一講書人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵说莫,是天一觀的道長。 經(jīng)常有香客問我寞焙,道長储狭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任捣郊,我火速辦了婚禮辽狈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘呛牲。我一直安慰自己刮萌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開白布娘扩。 她就那樣靜靜地躺著着茸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪琐旁。 梳的紋絲不亂的頭發(fā)上涮阔,一...
    開封第一講書人閱讀 52,184評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音旋膳,去河邊找鬼澎语。 笑死,一個(gè)胖子當(dāng)著我的面吹牛验懊,可吹牛的內(nèi)容都是我干的擅羞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼义图,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼减俏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起碱工,我...
    開封第一講書人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤娃承,失蹤者是張志新(化名)和其女友劉穎奏夫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體历筝,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酗昼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了梳猪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片麻削。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖春弥,靈堂內(nèi)的尸體忽然破棺而出呛哟,到底是詐尸還是另有隱情,我是刑警寧澤匿沛,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布扫责,位于F島的核電站,受9級(jí)特大地震影響逃呼,放射性物質(zhì)發(fā)生泄漏鳖孤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一蜘渣、第九天 我趴在偏房一處隱蔽的房頂上張望淌铐。 院中可真熱鬧,春花似錦蔫缸、人聲如沸腿准。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吐葱。三九已至,卻和暖如春校翔,著一層夾襖步出監(jiān)牢的瞬間弟跑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來泰國打工防症, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留孟辑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓蔫敲,卻偏偏與公主長得像饲嗽,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奈嘿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

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

  • 前端開發(fā)者丨h(huán)ttp請(qǐng)求 https:www.rokub.com 前言見解有限貌虾, 如有描述不當(dāng)之處, 請(qǐng)幫忙指出裙犹,...
    麋鹿_720a閱讀 10,927評(píng)論 11 31
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案尽狠? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,758評(píng)論 1 92
  • 微信小程序官方文檔 一衔憨、準(zhǔn)備工作 申請(qǐng)賬號(hào) 安裝開發(fā)工具(微信自己的開發(fā)工具) 微信自己弄了一套語言,目錄結(jié)構(gòu)如下...
    Viaphlyn閱讀 416評(píng)論 0 0
  • 啦啦啦啦啦 夏天要來啦 短褲袄膏,烈日践图,還是西瓜 白裙,涼風(fēng)哩陕,還是初夏 誰替你回答 為什么選擇里 沒有完美的辦法 青春...
    我還是那只貓啊閱讀 196評(píng)論 0 0
  • 很久很久以前 山頂上住著一個(gè)姑娘 后來 她的一生就在平淡無奇中度過了 很久很久以前 城堡里住著一位王子 后來 他的...
    阿火moete閱讀 119評(píng)論 1 4