溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Vue中如何實現(xiàn)列表渲染,排序,過濾操作

發(fā)布時間:2022-02-25 09:24:31 來源:億速云 閱讀:195 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要為大家展示了“Vue中如何實現(xiàn)列表渲染,排序,過濾操作”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Vue中如何實現(xiàn)列表渲染,排序,過濾操作”這篇文章吧。

    1. 列表(渲染、排序、過濾)

    1.1 條件渲染指令

    有個小技巧:

     如果是查找對象中不存在的屬性,返回的是一個undefined,利用這一個點不管是v-show或者是v-if,如果值等于undefined的就不顯示,假設(shè)sex屬性不存在

    <p v-show="student.sex">性別:{{student.sex}}</p>

    1.1.1 v-show

    1.v-show的原理:通過display:none 對元素進(jìn)行隱藏,當(dāng)滿足條件時去除display:none這個樣式

    2.適用的場景是:切換頻率較高的場景

    3.在使用v-show隱藏元素的時候是可以獲取得到元素的,而v-if 是無法獲取到元素的

    1.1.2 v-if

    1.v-if的原理:將整個節(jié)點移除,滿足條件時添加節(jié)點

    2.v-else、v-else-if 需要配合v-if去使用,但是結(jié)構(gòu)不能被破壞

    必須要先寫v-if,例如:

    v-if = "xxx"
    v-else = "xxx"
    ---------------------
    v-if = "xxx"
    v-else-if = "xxx"
    v-else = "xxx"

    適用的場景:切換頻率比較低的場景

    template

    最大的特點就是不破壞結(jié)構(gòu)但是只能與 v-if 進(jìn)行配合使用

    1.1.3 v-if和v-show的小案例
     <div id="root">
            <h3>當(dāng)前n的值為:{{n}}</h3>
            <button @click="n++">點擊我n加1</button>
    
                <div class="box1" v-show = "true">你好?。∥沂莃ox1</div> 
                <div class="box1" v-show = "false">你好??!我是box1</div> 
            		<div class="box1" v-show="n === 1">你好??!box1</div>
            
                <div class="box2" v-if = "true">我是box2</div>
                <div class="box2" v-if = "false">我是box2</div> 
    
            		<div class="box2" v-if="n === 2">我是box2</div>
    
            <!-- 
                3. v-else-if  , v-else , v-if 的區(qū)別
    
                -  v-if必須先寫,才能寫v-else和v-else-if
                -  例如:
                    v-if
                    v-if
                    v-if
                    這樣是進(jìn)行3次判斷
                    -------------------------------
                    v-if
                    v-else-if
                    v-else-if
                    v-else
                    只要有一個判斷為真,下面的語句就不執(zhí)行
                    ----------------------------------
                    v-else
                    只要不滿足v-if的條件就執(zhí)行
    
             -->
    
             <div class="box3" v-if = "n===1">我是box31</div>  
             <div class="box3" v-else-if="n===1">我是box32</div>
             <div class="box3" v-else-if = "n===3">我是box33</div>
             <div class="box3" v-else>hhhhhhh</div>
    					//當(dāng)滿足條件的時候只輸出滿足條件的值,例如本例子輸出為 ‘我是box31'
    
             <!-- 
                 需求:當(dāng)n == 2時,在頁面輸出5句話
                 4. template  
                    - 最大的特點就是不破壞結(jié)構(gòu)
                    - 但是只能和 v-if進(jìn)行配合使用
              -->
    
              <template v-if="n === 2">
                  <h4>你好??!</h4>
                  <h4>猜猜我是誰?</h4>
                  <h4>我是box4</h4>
                  <h4>你猜對了嗎?</h4>
                  <h4>你真棒!</h4>
              </template>
        </div>
    
    
        <script>
            Vue.config.productionTip = false
            let vm = new Vue({
                el: '#root',
                data: {
                    n: 0,
                }
            })
        </script>
    1.1.4 v-for(key的原理)

    特點:

    1.可以遍歷數(shù)組

    2.可以遍歷對象

    3.可以遍歷字符串

    4.可以遍歷次數(shù)(用的很少)

    5.如果我們不寫key,默認(rèn)使用index

    作用:用于展示列表的數(shù)據(jù)

    語法v-for = "(item,index) in xxx" :key= "yyy"

    key的原理:(很重要)

    1.虛擬DOM中key的作用:

    key是虛擬DOM對象的標(biāo)識,當(dāng)數(shù)據(jù)發(fā)生變化時,Vue會根據(jù)【新數(shù)據(jù)】生成【新的虛擬DOM】, 隨后Vue進(jìn)行【新虛擬DOM】與【舊虛擬DOM】的差異比較,比較規(guī)則如下:

    (1). 舊虛擬DOM中找到了與新虛擬DOM相同的key

    ①若虛擬DOM中內(nèi)容沒變, 直接使用之前的真實DOM

    ②若虛擬DOM中內(nèi)容變了, 則生成新的真實DOM,隨后替換掉頁面中之前的真實DOM

    (2). 舊虛擬DOM中未找到與新虛擬DOM相同的key直接創(chuàng)建新的真實DOM,隨后渲染到到頁面。

    2.如果使用index作為key會引發(fā)以下的問題:

    (1)如果發(fā)生逆序添加、逆序刪除破壞了順序操作就會產(chǎn)生沒有必要的DOM更新而會造成達(dá)不到效果的問題

    (2)如果輸入結(jié)構(gòu)包括了輸入類的DOM元素,會產(chǎn)生更新問題比如:input的框的數(shù)據(jù)對不上等等

    3.所以在開發(fā)的過程中key的使用最好是使用唯一能夠標(biāo)識的值作為key,比如id,Date.now(),nanoid這個包npm i nanoid等等

    Vue中如何實現(xiàn)列表渲染,排序,過濾操作

    Vue中如何實現(xiàn)列表渲染,排序,過濾操作

    1.2 列表過濾

    使用computed

     <div id="root">
            <input type="text" placeholder="請輸入關(guān)鍵字" v-model="keyword">
            <br>
            <ul>
                <li v-for="value in filtername" :key="value.id" >
                    {{value.name}} -- {{value.age}} -- {{value.gender}}
                </li>
            </ul>
        </div>
    
        <script>
          Vue.config.productionTip = false
            let vm = new Vue({
                el: '#root',
                data: {
                    arr: [
                        { id: "001", name: "馬冬梅", age: 18, gender: "female" },
                        { id: "002", name: "周冬雨", age: 55, gender: "female" },
                        { id: "003", name: "周杰倫", age: 30, gender: "male" },
                        { id: "004", name: "郭艾倫", age: 30, gender: "male" },
                        { id: "005", name: "郭德綱", age: 30, gender: "male" },
                    ],
                    keyword:""
                },
                computed:{
                    filtername:{
                        get(){
                            return this.arr.filter((currentval)=>{
                                return currentval.name.indexOf(this.keyword) !== -1
                            })
                        }
                    }
                }
            })
        </script>

    使用watch

    <div id="root">
            <input type="text" placeholder="請輸入關(guān)鍵字" v-model="keyword">
            <br>
            <ul>
                <li v-for="value in filearr" :key="value.id" >
                    {{value.name}} -- {{value.age}} -- {{value.gender}}
                </li>
            </ul>
        </div>
        <script>
            /* 分享一個數(shù)組去重的方法
               var arr = [1,35,612,6546,1,51]
              var newarr = arr.filter((val,index)=>{
                   return arr.indexOf(val,0) === index
              }) 
              console.log(newarr); 
            filter(function(current,index,arr){return xxx})
              - return : 寫的是過濾的條件
              - 返回的是滿足條件的元素
            indexOf:
              - 第一個參數(shù)是:要查詢的元素
              - 第二個參數(shù)是:開始索引的位置
              - 它返回的值是當(dāng)前元素的索引值,如果沒有要查詢的元素返回的是-1
            */
            Vue.config.productionTip = false
            let vm = new Vue({
                el: '#root',
                data: {
                    arr: [
                        { id: "001", name: "馬冬梅", age: 18, gender: "female" },
                        { id: "002", name: "周冬雨", age: 55, gender: "female" },
                        { id: "003", name: "周杰倫", age: 30, gender: "male" },
                        { id: "004", name: "郭艾倫", age: 30, gender: "male" },
                        { id: "005", name: "郭德綱", age: 30, gender: "male" },
                    ],
                    keyword:'',
                    filearr:[]
                },
                /* 
                    需求:當(dāng)輸入某一個關(guān)鍵字,輸出相關(guān)的內(nèi)容 
                    思路:
                        1. 獲取到用戶輸入的數(shù)據(jù)
                        2. 篩選輸入的關(guān)鍵字是否在數(shù)據(jù)里面
                */
                // 先用watch寫
                watch:{
                    keyword:{
                        immediate:true, 
                        handler(newval,oldval){
                            this.filearr = this.arr.filter((currentval)=>{
                                return currentval.name.indexOf(newval) !== -1
                                /*
                                     這里有個細(xì)節(jié):indexOf去判斷 空字符串(不是空格) 時會返回0,
                                     所以整個列表都會出來
                                     例如:"asdf".indexOf("")   返回的是0
                                     所以需要向自調(diào)用一次使用immediate
                                 */
                            })
                        }
                    }
                }
            })
    
        </script>

    1.3 列表排序

     <div id="root">
            <h3>人員排序</h3>
            <input type="text" placeholder="請輸入關(guān)鍵字" v-model="keyword">
            <button @click="type = 2">年齡升序</button>
            <button @click="type = 1">年齡降序</button>
            <button @click="type = 0">原順序</button>
            <ul>
                <li v-for="val in filtername" :key="val.id">
                    {{val.name}} -- {{val.age}} -- {{val.gender}} 
                </li>
            </ul>
        </div>
        <script>
            Vue.config.productionTip = false
            let vm = new Vue({
                el: '#root',
                data: {
                    arr: [
                        { id: "001", name: "馬冬梅", age: 18, gender: "female" },
                        { id: "002", name: "周冬雨", age: 55, gender: "female" },
                        { id: "003", name: "周杰倫", age: 50, gender: "male" },
                        { id: "004", name: "郭艾倫", age: 59, gender: "male" },
                        { id: "005", name: "郭德綱", age: 30, gender: "male" },
                    ],
                    keyword:"",
                    type:0
                },
                computed:{
                    filtername:{
                        get(){
                            let arr = this.arr.filter((current)=>{
                                return current.name.indexOf(this.keyword) !== -1
                            })
                            arr.sort((a,b)=>{
                                /* 
                                    a永遠(yuǎn)在b前面
                                    如果返回的值是大于0則交換位置,小于等于0不交換位置
                                    return a-b 升序
                                    return b-a 降序
                                 */
                                if(this.type)
                                {
                                    return this.type == 1 ? b.age - a.age : a.age - b.age 
                                } 
                            })
                            return arr
                        }
                    }
                }
            })
        </script>

    以上是“Vue中如何實現(xiàn)列表渲染,排序,過濾操作”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    vue
    AI