列表渲染

基本列表

v-for指令:
1.用于展示列表數(shù)據(jù)
2.語法:v-for="(item,index) in xxx" :key="yyy"
3.可遍歷:數(shù)組舌仍、對象、字符串(用的很少)泰偿、指定次數(shù)(用的很少)

key的原理

面試題:react熄守、vue的key有什么作用(key的內(nèi)部原理)
1.虛擬DOM中key的作用:
key是虛擬DOM對象的標識,當狀態(tài)中的數(shù)據(jù)發(fā)生變化時耗跛,Vue會根據(jù)【新數(shù)據(jù)】生成【新的虛擬DOM】
隨后Vue進行【新虛擬DOM】與【舊虛擬DOM】的差異比較裕照,比較規(guī)則如下:

2.對比原則:
(1)舊虛擬DOM中找到了與新虛擬DOM相同的key
若虛擬DOM中內(nèi)容沒變,直接使用之前的真實DOM
若虛擬DOM中內(nèi)容變了调塌,則生成新的真實DOM晋南,隨后替換掉頁面中之前的真實DOM
(2)舊虛擬DOM中未找到與新虛擬DOM相同的key,創(chuàng)建新的真實DOM,隨后渲染到頁面

3.用index作為key可能會引發(fā)的問題:
( 1)若對數(shù)據(jù)進行:逆序添加羔砾、逆序刪除等破壞順序操作:
會產(chǎn)生沒有必要的真實DOM更新 =》界面效果沒問題负间,但效率低
(2)如果結(jié)構(gòu)中還包含輸入類的DOM:
會產(chǎn)生錯誤的DOM更新=》界面有問題

4.開發(fā)中如何選擇key
(1)最好使用每條數(shù)據(jù)的唯一標識作為key,比如ID姜凄、手機號政溃、身份證號、學號等
(2)如果不存在對數(shù)據(jù)的逆序添加檀葛、逆序刪除等破壞順序操作玩祟,僅用于渲染列表用于展示,使用index作為key是沒有問題的

 <div id="root">
            <!-- 遍歷數(shù)組 -->
            <h2>人員列表(遍歷數(shù)組)</h2>
            <ur>
                <li v-for="(person,index) in persons" :key="person.id">
                    {{person.name}} - {{person.age}} - {{index}}
                </li>
            </ur>

            <!-- 遍歷對象 -->
            <h2>汽車信息(遍歷對象)</h2>
            <ur>
                <li v-for="(value,key) of car" :key="key">
                    {{key}} - {{value}} 
                </li>
            </ur>

             <!-- 遍歷字符串 -->
            <ur>
                <li v-for="(char,index) of str" :key="index">
                    {{index}} - {{char}} 
                </li>
            </ur>

            <!-- 遍歷指定次數(shù) -->
            <ur>
                <li v-for="(number,index) of 5" :key="index">
                    {{index}} - {{number}} 
                </li>
            </ur>
         </div>
        <script type="text/javascript">
             Vue.config.productionTip = false
              const vm = new Vue({
                 el:"#root",
                 data:{
                     persons:[
                         {id:'001',name:'張三',age:18},
                         {id:'002',name:'李四',age:19},
                         {id:'003',name:'王五',age:20},
                     ],
                     car:{
                        name:'奧迪',
                        price:'20萬',
                        color:'黑色'
                    },
                    str:'hello'
                 },
             })
        </script>

列表過濾

<body>
        <div id="root">
            <h2>人員列表</h2>
            <input type="text" placeholder="請輸入名字" v-model="keyWord">
            <ur>
                <li v-for="(p,index) in filPersons" :key="p.id">
                    {{p.name}} - {{p.age}} - {{p.sex}}
                </li>
            </ur>
         </div>
        <script type="text/javascript">
             Vue.config.productionTip = false
             //watch實現(xiàn)
              //#region
              /*const vm = new Vue({
                 el:"#root",
                 data:{
                    keyWord:'',
                     persons:[
                         {id:'001',name:'馬冬梅',age:34,sex:'女'},
                         {id:'002',name:'周冬雨',age:29,sex:'女'},
                         {id:'003',name:'周杰倫',age:30,sex:'男'},
                         {id:'004',name:'溫兆倫',age:40,sex:'男'}
                     ],
                     filPersons:[]
                 },
                 watch:{
                    keyWord:{
                         immediate:true,
                         handler(val){
                            this.filPersons = this.persons.filter((p)=>{
                               return p.name.indexOf(val) !== -1
                            })
                         }
                     }
                 }
             })*/
            //  #region


              //用computed實現(xiàn)
              new Vue({
                el:"#root",
                 data:{
                    keyWord:'',
                     persons:[
                         {id:'001',name:'馬冬梅',age:34,sex:'女'},
                         {id:'002',name:'周冬雨',age:29,sex:'女'},
                         {id:'003',name:'周杰倫',age:30,sex:'男'},
                         {id:'004',name:'溫兆倫',age:40,sex:'男'}
                     ],
                 },
                 computed:{
                    filPersons(){
                        return this.persons.filter((p)=>{
                               return p.name.indexOf(this.keyWord) !== -1
                            })
                    }
                 }
              })
        </script>

列表排序

<body>
         <!--
           
        -->
        <div id="root">
            <h2>人員列表</h2>
            <input type="text" placeholder="請輸入名字" v-model="keyWord">
            <button @click="sortType = 2">年齡升序</button>
            <button @click="sortType = 1">年齡降序</button>
            <button @click="sortType = 0">原順序</button>
            <ur>
                <li v-for="(p,index) in filPersons" :key="p.id">
                    {{p.name}} - {{p.age}} - {{p.sex}}
                </li>
            </ur>
         </div>
        <script type="text/javascript">
             Vue.config.productionTip = false
              //用computed實現(xiàn)
              new Vue({
                el:"#root",
                 data:{
                    keyWord:'',
                    sortType:0,//0原順序 1:降序 2屿聋;升序
                     persons:[
                         {id:'001',name:'馬冬梅',age:34,sex:'女'},
                         {id:'002',name:'周冬雨',age:29,sex:'女'},
                         {id:'003',name:'周杰倫',age:30,sex:'男'},
                         {id:'004',name:'溫兆倫',age:40,sex:'男'}
                     ],
                 },
                 computed:{
                    filPersons(){
                        const arr = this.persons.filter((p)=>{
                               return p.name.indexOf(this.keyWord) !== -1
                            })
                            //判斷是否需要排序 
                            if(this.sortType){
                                arr.sort((p1,p2)=>{
                                    return this.sortType === 1 ? p2.age-p1.age  : p1.age-p2.age
                                })
                            }
                            return arr

                    }
                 }
              })
        </script>
    </body>

注意:更新數(shù)據(jù)時空扎,直接賦值無效,用splice方法有效

updateMei(){
//無效
  // this.persons[0]= {id:'001',name:'馬老師',age:50,sex:'女'}  
 this.persons.splice(0,1,{id:'001',name:'馬老師',age:50,sex:'女'})
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末润讥,一起剝皮案震驚了整個濱河市转锈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌楚殿,老刑警劉巖撮慨,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡砌溺,警方通過查閱死者的電腦和手機影涉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來规伐,“玉大人蟹倾,你說我怎么就攤上這事〔粒” “怎么了鲜棠?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長培慌。 經(jīng)常有香客問我豁陆,道長,這世上最難降的妖魔是什么吵护? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任盒音,我火速辦了婚禮,結(jié)果婚禮上何址,老公的妹妹穿的比我還像新娘里逆。我一直安慰自己进胯,他們只是感情好用爪,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布行疏。 她就那樣靜靜地躺著氓英,像睡著了一般涵但。 火紅的嫁衣襯著肌膚如雪扑眉。 梳的紋絲不亂的頭發(fā)上撩幽,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天爷狈,我揣著相機與錄音锌云,去河邊找鬼坡椒。 笑死就缆,一個胖子當著我的面吹牛帖渠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播竭宰,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼空郊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了切揭?” 一聲冷哼從身側(cè)響起狞甚,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎廓旬,沒想到半個月后哼审,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年涩盾,在試婚紗的時候發(fā)現(xiàn)自己被綠了十气。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡春霍,死狀恐怖桦踊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情终畅,我是刑警寧澤籍胯,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站离福,受9級特大地震影響杖狼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜妖爷,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一蝶涩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧絮识,春花似錦绿聘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至彼念,卻和暖如春挪圾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逐沙。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工哲思, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吩案。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓棚赔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親徘郭。 傳聞我的和親對象是個殘疾皇子靠益,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

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