青海省建設網(wǎng)站多少錢今日頭條(官方版本)
目錄
一、key的作用原理
二、實現(xiàn)列表遍歷并對在列表最前方進行追加元素
三、實現(xiàn)列表過濾搜索
1、用computed計算屬性來實現(xiàn)
2、用watch監(jiān)聽輸入值的變化來實現(xiàn)
四、按年齡排序輸出列表
一、key的作用原理
1. 虛擬DOM中key的作用:
?key是虛擬DOM對象的標識,當數(shù)據(jù)發(fā)生變化時,Vue會根據(jù)【新數(shù)據(jù)】生成【新的虛擬DOM】,隨后Vue進行【新虛擬DOM】與【舊虛擬DOM】的差異比較,比較規(guī)則如下:
2.對比規(guī)則:
(1).舊虛擬DOM中找到了與新虛擬DOM相同的key:
? ? ? ? ①.若虛擬DOM中內容沒變, 直接使用之前的真實DOM!
? ? ? ? ②.若虛擬DOM中內容變了, 則生成新的真實DOM,隨后替換掉頁面中之前的真實DOM。
(2).舊虛擬DOM中未找到與新虛擬DOM相同的key
? ? ? ? ? 創(chuàng)建新的真實DOM,隨后渲染到到頁面。
?3. 用index作為key可能會引發(fā)的問題:
(1).若對數(shù)據(jù)進行:逆序添加、逆序刪除等破壞順序操作:
? ? ? ? 會產(chǎn)生沒有必要的真實DOM更新 ==> 界面效果沒問題, 但效率低。
(2). 如果結構中還包含輸入類的DOM:
? ? ? ? ? ? ? 會產(chǎn)生錯誤DOM更新 ==> 界面有問題
4. 開發(fā)中如何選擇key?
(1).最好使用每條數(shù)據(jù)的唯一標識作為key, 比如id、手機號、身份證號、學號等唯一值。
(2).如果不存在對數(shù)據(jù)的逆序添加、逆序刪除等破壞順序操作,僅用于渲染列表用于展示,使用index作為key是沒有問題的。
二、實現(xiàn)列表遍歷并對在列表最前方進行追加元素
追加采用unshift函數(shù),在最前面追加,若此時的key='index',因為有輸入類DOM更新則會產(chǎn)生錯誤,所以應給其特定的id。若用push在最后方追加,則key=‘index’不存在問題
?
代碼部分
<div id="root"><h4>一、人員遍歷</h4><button @click="add">添加一個老劉</button><!-- 讓每一位人都有一個 自己特定的id --><ul><li v-for="person in persons" :key="person.id">{{person.name}}-{{person.age}}<input type="text"></li></ul></div><script text="text/javascript">new Vue({el:"#root",data:{persons:[{id:'001',name:'張三',age:'21'},{id:'002',name:'李四',age:'20'},{id:'003',name:'王五',age:'22'},]},methods: {add(){const s={id:'004',name:'老劉',age:20}// 追加數(shù)據(jù),在前面追加this.persons.unshift(s)}},})</script>
三、實現(xiàn)列表過濾搜索
1、用computed計算屬性來實現(xiàn)
將filter過濾器得到的結果返回給新的對象,遍歷新的對象實現(xiàn)搜索功能
<body><div id="root"><h4>一、人員遍歷</h4><input type="text" v-model="keyword"><ul><li v-for="person in filterpersons" :key="persons.id">{{person.name}}-{{person.age}}--{{person.sex}}</li></ul></div><script text="text/javascript">// 用計算屬性實現(xiàn)new Vue({el:"#root",data:{keyword:'',persons:[{id:'001',name:'馬冬梅',age:'21',sex:'女'},{id:'002',name:'周杰倫',age:'20',sex:'男'},{id:'003',name:'周冬雨',age:'22',sex:'女'},{id:'004',name:'周天氣',age:'24',sex:'男'},{id:'005',name:'馬萬里',age:'23',sex:'男'},],},computed:{// 計算屬性的值為其返回的值,其默認是一開始就加載filterpersons(){return this.persons.filter((person)=>{// 找不到返回的就是-1,找到的話是正常的下標return person.name.indexOf(this.keyword)!==-1})}}})
2、用watch監(jiān)聽輸入值的變化來實現(xiàn)
將computed部分替換為watch
watch:{keyword:{immediate:true,其val相當于keyword新的值handler(val){this.filterpersons=this.persons.filter((person)=>{return person.name.indexOf(val)!==-1})}}
}
四、按年齡排序輸出列表
在搜索的基礎上對年齡進行升序、降序輸出調用sort函數(shù)
代碼部分
new Vue({el:"#root",//0原序,1升序,2降序data:{keyword:'',sortType:0,persons:[{id:'001',name:'馬冬梅',age:'21',sex:'女'},{id:'002',name:'周杰倫',age:'20',sex:'男'},{id:'003',name:'周冬雨',age:'22',sex:'女'},{id:'004',name:'周天氣',age:'24',sex:'男'},{id:'005',name:'馬萬里',age:'23',sex:'男'},],},computed:{filterpersons(){const arr= this.persons.filter((person)=>{return person.name.indexOf(this.keyword)!==-1})// 需要判斷其是否需要排序if(this.sortType){arr.sort((p1,p2)=>{return this.sortType===1?p1.age-p2.age:p2.age-p1.age})}return arr},}})