2021.7.13 Vue--绑定样式,条件渲染,列表渲染

368 阅读4分钟

绑定样式

我们可以将样式按照类名区分提前通过CSS定义,再通过Vue框架将样式绑定到标签上。

1.class的字符串写法
    <div id="root">
        <h2 :class="myStyle">{{title}}</h2>
   </div>
   <script>
        new Vue({
            el:'#root',
            data:{
                title:'今天天气真不错',
                myStyle:'classA'
            }
        })
    </script>

这种写法多适用于类名不确定,需要进行动态获取时。

2.class的对象写法
    <div id="root">
        <h2 :class="{classB:hasB,classC:hasC}">{{title}}</h2>
   </div>
   <script>
        new Vue({
            el:'#root',
            data:{
                title:'今天天气真不错',
                hasB:true, //用来标识classB是否应用
                hasC:true
            }
        })
    </script>

这种写法多适用于,类名已经确定,但是不确定是否要使用该样式,或者样式需要进行切换时使用。

3.class的数组写法
<div id="root">
        <h2 :class="[a,b,c]">{{title}}</h2>
   </div>
   <script>
        new Vue({
            el:'#root',
            data:{
                title:'今天天气真不错',
                a:'classA',
                b:'classB',
                c:'classC'
            }
        })
    </script>

这种写法适用于已确定类名,且同时需要应用多种样式时。

条件渲染

条件渲染指的是,在我们点击按钮或者进行某种操作时,让界面效果发生切换。

主要方法有v-if和v-show两种。

v-if
<div id="root">
        <h2>今天天气很{{isHot?'炎热':'凉爽'}}</h2>
        <button @click="isHot = !isHot">切换天气</button>
        <br><br>
        <!-- 只有天气炎热才会展示下面的div -->
        <div v-if="isHot">
            <span>建议:心静自然凉</span>
        </div>
        <!-- 只有天气凉爽才会展示下面的div -->
         <div v-else>
            <span>建议:穿秋裤了!</span>
        </div>
    </div>

    <script>
        new Vue({
            el:'#root',
            data:{
                isHot:true
            },
            
        })
    </script>

v-if可以搭配v-else一起使用,如果有多种样式需要切换,也可以再添加v-else-if。

只有当v-if的表达式返回值为true的时候该样式才会被应用。

注意:v-else必须跟在v-if后使用,单独使用不会被识别。

v-show
<div id="root">
        <h2>今天天气很{{isHot?'炎热':'凉爽'}}</h2>
        <button @click="isHot = !isHot">切换天气</button>
        <br><br>
        <!-- 只有天气炎热才会展示下面的div -->
        <div v-show="isHot">
            <span>建议:心静自然凉</span>
        </div>
        

        <!-- 只有天气凉爽才会展示下面的div -->
        <div v-show="!isHot">
            <span>建议:穿秋裤了!</span>
        </div>

    </div>
    <script>
        new Vue({
            el:'#root',
            data:{
                isHot:true
            },
            
        })
    </script>

v-show的使用方法与v-if大体一致,但是v-show是通过改变元素的display:none属性来控制元素是否显示的。

如果一定要说,那么v-if才是真正的条件渲染。v-if会让不显示的元素直接消失在DOM中,当切换为显示时则会进行重新渲染。

如果v-if的初始值是false,那么初渲染时不会渲染到此节点,只有当条件切换时才会进行渲染。而v-show则会在一开始就进行全部渲染,只是通过CSS样式决定其是否显示。 因此,使用v-if时可能会获取不到某些DOM节点。

总结来说,如果一个节点切换的频率很低,那我们应该使用v-if,如果节点需要进行高频切换,那么v-show更为适合。

列表渲染

基本列表

在Vue中,我们可以使用v-for对数组进行遍历。

<div id="root">
        <ul>
            <!-- 使用v-for遍历数组 -->
            <li v-for="p in persons" :key="p.id">
                {{p.name}}--{{p.age}}--{{p.sex}}
            </li>
</div>

    <script>
        new Vue({
            el:'#root',
            data:{
                persons:[
                    {id:'001',name:'老刘',age:20,sex:'男'},
                    {id:'002',name:'老李',age:19,sex:'男'},
                    {id:'003',name:'老王',age:18,sex:'女'},
                    {id:'004',name:'老张',age:17,sex:'女'}
                ]}
        })
    </script>
                

v-for也可以用来遍历对象和字符串,可以返回内容及索引。

列表过滤

computed: {
          fmtPersons() {
              const { persons, keyWord } = this;
              return persons.filter(p => p.name.indexOf(keyWord) !== -1)
                }
            }

watch也可以实现对列表进行过滤,但是使用watch实现会导致原数据也发生改变。我们当然也可以选择再新建一个新的数组存储,但是这样会非常繁琐。

因此,可以使用计算属性computed来完成这一功能。计算属性可以为原对象添加新的进行计算后的属性,不会改变原数据。

列表排序

data:{sortType:0, //0原顺序,1升序,2降序},
computed: {
        fmtPersons() {
            const { persons, keyWord ,sortType} = this;
              //过滤
            let arr = persons.filter(p => p.name.indexOf(keyWord) !== -1)
            //排序
            if(sortType){
                 arr.sort((a,b)=>{
                       if(sortType === 1) return a.age - b.age;
                            else return b.age - a.age;
                    })
                    }
                    return arr;
                }
            }

想对过滤后的列表内容进行排序,可以在computed中增加排序代码,使用sort函数,通过给按钮绑定sortType的值来实现选择语句,进行排序。

列表更新

methods: {
                updateMei(){
                    this.persons[0].name = '佩奇';
                    this.persons[0].age = 99;
                    this.persons[0].sex = '男';
                    
                    /*this.persons[0] = {
                        name:'佩奇',age:99,sex:'男'
                    };
                    this.persons.push();*/

                }
            }

此处应注意Vue的更新数据机制。

在Vue的封装中,作者为整个Vue框架中的每一个属性都添加了set和get函数,以及重新刷新页面命令,这样可以保证每个属性都可以被检测到,当发生数据改变时,set函数马上会被调用,数据可以进行实时更新,因此我们可以通过单独更改对象中每个属性的方式来进行数据刷新。

但是当我们改变了数组中的某一项(且为一个对象)时,整个对象都被完全替换,而我们手动更改的对象中是不含有set和get函数的,因此我们更改的数据并不被Vue识别到,页面也就不会进行实时更新。

可进行的解决方法:作者给Vue中的某些数组方法也封装了页面刷新命令,当我们对数据进行方法调用时(比如push(),我们实际并没有push元素进去,但是却可以进行一次更新。

但是注意:即使我们用了这样的解决方法,更改后的数组元素也与数组中其他元素不同,没有set和get函数了。