在用vue做三級聯(lián)動(dòng)時(shí)遇到的監(jiān)測問題(附與angular臟檢查區(qū)別)

做一個(gè)三級聯(lián)動(dòng)時(shí)遇到了樣式?jīng)]有跟著當(dāng)次數(shù)據(jù)變化時(shí)變化的問題


image.png

也就是說點(diǎn)擊title標(biāo)簽的時(shí)候按理來說 數(shù)據(jù)發(fā)生變化 vue 應(yīng)該可以監(jiān)測到并且渲染在頁面上 color標(biāo)簽里的 按鈕狀態(tài)就會(huì)實(shí)時(shí)更新

原理是

 <div class="specSel">
              <h3 class="selLine">
                <p>Title</p>
              </h3>
              <button class="btn btn-danger" v-for="test in sortByName(testList)" @click="selName(test)">
                {{test.name}}
              </button>
              <h3 class="selLine">
                <p>Color</p>
              </h3>
              <button class="btn btn-danger" :class="{active:current_selectSpec.option1===test.option1,disabled:current_selectSpec.name!==test.name}"
                      v-for="test in sortByColor(testList)" @click="selOpt1(test)">
                {{test.option1}}
              </button>
              <h3 class="selLine">
                <p>Style</p>
              </h3>
              <button :class="{active:current_selectSpec.option2===test.option2,disabled:current_selectSpec.option1!==test.option1}" class="btn btn-danger" v-for="test in sortByStyle(testList)" @click="selOpt2(test)">
                {{test.option2}}
              </button>
</div>
 data() {
      return {
        current_selectSpec: {},
},
methods: {
 sortByName(list) {
        var arr = [];
        return list.filter(function (i) {
          if (arr.indexOf(i.name) < 0) {
            arr.push(i.name);
            return true;
          }
          return false;
        });
      },
      sortByColor(list) {
        let aaalist = [];//對象數(shù)組
        let bbblist = [];//規(guī)格數(shù)組
        if (this.current_selectSpec.name) {//判斷選中1級
          for (let i in list) {
            let spec = list[i];
            if (this.current_selectSpec.name === spec.name) {
              //如果接收到的數(shù)據(jù)里名字有和當(dāng)前選中的數(shù)據(jù)名字一樣的就把該條數(shù)據(jù)的名字加入規(guī)格數(shù)組亚脆,把該條數(shù)據(jù)所在的對象加入到對象數(shù)組中
              if (bbblist.indexOf(spec.option1) < 0) {
                bbblist.push(spec.option1);
                aaalist.push(spec);
                bbblist.sort();
              }
            }
            for(let i in list){
              let spec = list[i];
              if (bbblist.indexOf(spec.option1) < 0) {//補(bǔ)充其他一級規(guī)格中的二級規(guī)格到數(shù)組,查找二級規(guī)格是否已經(jīng)存在
                aaalist.push(spec);
                bbblist.push(spec.option1);
              }
            }
          }
        }
        else {//1級沒有選中(頁面剛打開)
          for(let i in list) {//去重
            let spec = list[i];
            if (bbblist.indexOf(spec.option1) < 0) {
              bbblist.push(spec.option1);
              aaalist.push(spec);
              bbblist.sort();
            }
          }
        }
        return aaalist;
      },
      sortByStyle(list) {
        let aaalist = [];//對象數(shù)組
        let bbblist = [];//規(guī)格數(shù)組
        if (this.current_selectSpec.option1) {//判斷選中1級
          for (let i in list) {
            let spec = list[i];
            if (this.current_selectSpec.option1 === spec.option1) {
              //如果接收到的數(shù)據(jù)里名字有和當(dāng)前選中的數(shù)據(jù)名字一樣的就把該條數(shù)據(jù)的名字加入規(guī)格數(shù)組渐逃,把該條數(shù)據(jù)所在的對象加入到對象數(shù)組中
              if (bbblist.indexOf(spec.option2) < 0) {
                bbblist.push(spec.option2);
                aaalist.push(spec);
                bbblist.sort();
              }
            }
            for(let i in list){
              let spec = list[i];
              if (bbblist.indexOf(spec.option2) < 0) {//補(bǔ)充其他一級規(guī)格中的二級規(guī)格到數(shù)組,查找二級規(guī)格是否已經(jīng)存在
                aaalist.push(spec);
                bbblist.push(spec.option2);
              }
            }
          }
        }
        else {//1級沒有選中(頁面剛打開)
          for(let i in list) {//去重
            let spec = list[i];
            if (bbblist.indexOf(spec.option2) < 0) {
              bbblist.push(spec.option2);
              aaalist.push(spec);
              bbblist.sort();
            }
          }
        }
        return aaalist;
      },
}

ui框架用的是bootstrap

看著代碼是沒問題的新娜,但是在頁面里點(diǎn)擊了title里的按鈕之后 二級按鈕的可選狀態(tài)并沒有更新

這個(gè)問題困擾了我很長時(shí)間 偶然發(fā)現(xiàn)改變一個(gè)有v-model屬性的input框的value值時(shí) 按鈕的可選狀態(tài)更新了曹仗,

由此得出結(jié)論 是因?yàn)関ue沒有檢測到

image.png

看了一下我用來push給臨時(shí)數(shù)組的對象

果然

current_selectSpec: {},

是空的,所以并不是class沒給上,因?yàn)関ue的監(jiān)測機(jī)制 每條數(shù)據(jù)的監(jiān)測都是獨(dú)立的 所以在該次監(jiān)測中 current_selectSpec對象里面并沒有name 、option等鍵值杂腰,沒有初始化屬性,所以才會(huì)出現(xiàn)這種bug椅文。
改變v-model里的值時(shí) 由于另一個(gè)監(jiān)測讓頁面重新渲染 所以它的可選狀態(tài)跟著更新了喂很。
所以這里初始化一下這個(gè)對象的屬性

current_selectSpec: {name:'',option1:'',option2:''},

分割線


相比起angular的臟檢查,Vue.js 有更好的性能,并且非常非常容易優(yōu)化皆刺,因?yàn)樗皇褂门K檢查恤筛。

Angular,因?yàn)樽饔糜騼?nèi)的每一次變化芹橡,所有 watcher 都要重新計(jì)算毒坛,所以當(dāng) watcher 越來越多時(shí)會(huì)變得越來越慢。并且林说,如果一些 watcher 觸發(fā)另一個(gè)更新煎殷,臟檢查循環(huán)(digest cycle)可能要運(yùn)行多次。

而vue使用基于依賴追蹤的觀察系統(tǒng)并且異步列隊(duì)更新腿箩,所有的數(shù)據(jù)變化都是獨(dú)立地觸發(fā)豪直,除非它們之間有明確的依賴關(guān)系。唯一需要做的優(yōu)化是在 v-for 上使用 track-by珠移。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末弓乙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子钧惧,更是在濱河造成了極大的恐慌暇韧,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浓瞪,死亡現(xiàn)場離奇詭異懈玻,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)乾颁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門涂乌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來艺栈,“玉大人,你說我怎么就攤上這事湾盒∈遥” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵罚勾,是天一觀的道長诅需。 經(jīng)常有香客問我,道長荧库,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任赵刑,我火速辦了婚禮分衫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘般此。我一直安慰自己蚪战,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布铐懊。 她就那樣靜靜地躺著邀桑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪科乎。 梳的紋絲不亂的頭發(fā)上壁畸,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機(jī)與錄音茅茂,去河邊找鬼捏萍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛空闲,可吹牛的內(nèi)容都是我干的令杈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼碴倾,長吁一口氣:“原來是場噩夢啊……” “哼逗噩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起跌榔,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤异雁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后僧须,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體片迅,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年皆辽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了柑蛇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芥挣。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖耻台,靈堂內(nèi)的尸體忽然破棺而出空免,到底是詐尸還是另有隱情,我是刑警寧澤盆耽,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布蹋砚,位于F島的核電站,受9級特大地震影響摄杂,放射性物質(zhì)發(fā)生泄漏坝咐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一析恢、第九天 我趴在偏房一處隱蔽的房頂上張望墨坚。 院中可真熱鬧,春花似錦映挂、人聲如沸泽篮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帽撑。三九已至,卻和暖如春鞍时,著一層夾襖步出監(jiān)牢的瞬間亏拉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工逆巍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留专筷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓蒸苇,卻偏偏與公主長得像磷蛹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子溪烤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

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

  • vue對比react檬嘀、Angular(轉(zhuǎn)官方文檔) React React 和 Vue 有許多相似之處槽驶,它們都有:...
    simple_50a1閱讀 1,358評論 0 5
  • ReactReact 和 Vue 有許多相似之處掂铐,它們都有:使用 Virtual DOM提供了響應(yīng)式(Reacti...
    神奇的的奇閱讀 693評論 0 2
  • Vue 的一些語法和 Angular 的很相似(例如 v-if vs ng-if) 因?yàn)?Angular 是 Vu...
    LiLi原上草閱讀 1,102評論 0 6
  • Vue對比其他框架 這個(gè)頁面無疑是最難編寫的,但我們認(rèn)為它也是非常重要的∪桑或許你曾遇到了一些問題并且已經(jīng)用其他的框...
    伊滴墨閱讀 1,806評論 0 15
  • 一爆班,vue是什么? Vue.js(讀音 /vju?/, 類似于view) 是一套構(gòu)建用戶界面的漸進(jìn)式框架辱姨。與其他重...
    米塔塔閱讀 824評論 2 15