Vue2学习之路 · 三 :绑定样式、条件渲染、列表渲染、key的内部原理

76 阅读4分钟

绑定样式

CSS样式

写法::class="xxx" xxx可以是字符串、数组、对象

字符串写法适用于类名不确定,需要动态获取

数组写法适用于需要绑定多个样式,个数不确定,名字也不确定

对象写法适用于需要绑定多个样式,个数确定,名字确定,但是用不用不确定

style内联样式

:style="{fontSize:xxx}" 其中xxx时动态值

:style="a/b" 其中a、b是样式对象

<div id="root">
    <!-- 绑定class样式,字符串写法,适用于样式的类名不确定,需要动态指定 -->
    <div class="basic" :class="a" @click="setStyle">{{name}}</div><br>
    <!-- 绑定class样式,数组写法,适用于样式的个数不确定、名字也不确定 -->
    <div class="basic" :class="arr">{{name}}</div><br>
    <!-- 绑定class样式,对象写法,适用于样式的个数确定、名字也确定,但是要动态决定用不用 -->
    <div class="basic" :class="obj1">{{name}}</div><br>

    <!-- 绑定内联(style)样式 对象写法 -->
    <div class="basic" :style="styleObj">{{name}}</div><br>
     <!-- 绑定内联(style)样式 数组写法 -->
     <div class="basic" :style="objArr">{{name}}</div>
</div>
<script>
    new Vue({
        el:'#root',
        data:{
            name:'稀土掘金',
            a:'basic',
            arr:['happy','sad','normal'],
            obj1:{
                happy:false,
                sad:false
            },
            styleObj:{
                fontSize:'20px'
            },
            objArr:[
                {
                    fontSize:'50px'
                },
                {
                    backgroundColor:'red'
                }
            ]
        },
        methods:{
            setStyle(){
                const arr = ['happy','sad','normal']
                let index = Math.floor(Math.random() * arr.length);
                console.log(index);
                this.a = arr[index];
            },
        }
    })
</script>

条件渲染

v-if

v-if="表达式" true则显示,false则隐藏

v-else-if="表达式" true则显示,false则隐藏

v-if="表达式" true则显示,false则隐藏

适用于:切换频率比较低的场景

特点:不展示的DOM元素,直接被移除

注意:v-if可以和v-else-if、v-else一起使用,但要求结构不能被打断,意思是多个元素中间不能有间隔

v-show

v-show="表达式" true则显示,false则隐藏

适用于:切换频率比较高的场景

特点:不展示的DOM元素未被移除,仅仅是使用样式被隐藏了

注意

使用v-if时,元素可能无法获取到,但是使用v-show一定可以获取到

<div id="root">
    <h2>当前n的值为:{{n}}</h2>
    <button @click="n++">点我n+1</button>
    <!-- 使用v-show做条件渲染 -->
    <!-- <h2 v-show="n>=1">1111</h2>
    <h2 v-show="n===2">2222</h2> -->

    <!-- 使用v-if做条件渲染 -->
    <!-- <h2 v-if="false">欢迎来到{{name}}</h2> -->
    <!-- <h2 v-if="1===1">欢迎来到{{name}}</h2> -->

    <!-- 使用v-else-if和v-else做条件渲染 -->
    <!-- <h2 v-if="n>10">111</h2> -->
    <!-- <h2 v-else-if="false">222</h2> -->
    <!-- <h2 v-else-if="false">333</h2> -->
    <!-- <h2 v-else>444</h2> -->

    <!-- template就是模板的意思,在页面显示中不会显示,但是可以使用v-if来控制内部的元素是否显示,v-show不可以在template中设置 -->
    <template v-if="n===2">
        <h2>111</h2> 
        <h2>222</h2>
        <h2>333</h2>
        <h2>444</h2>
    </template>
</div>
<script>
    new Vue({
        el:'#root',
        data:{
            name:'稀土掘金',
            n:0
        },
    })
</script>

列表渲染

v-for

1、用于展示列表数据

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

3、可以遍历数组、对象、字符串,还能遍历指定次数

<div id="root">
    <!-- 测试遍历数组 -->
    <ul>
        <li v-for="(p,key) in persons" :key="key">{{p.name}} : {{p.age}} : {{p}}</li>
    </ul>
    <!-- 测试遍历对象 -->
    <ul>
        <li v-for="(car,key) in car" :key="key">{{key}} : {{car}}</li>
    </ul>
    <!-- 测试遍历字符串 -->
    <ul>
        <li v-for="(str,key) in str" :key="key">{{key}} : {{str}}</li>
    </ul>
     <!-- 测试遍历指定次数 -->
     <ul>
        <li v-for="(number,index) in 5" :key="index">{{index}} : {{number}}</li>
    </ul>
</div>


<script>
    new Vue({
        el:'#root',
        data:{
            persons:[
                {id:'001',name:'赵云',age:18},
                {id:'002',name:'张飞',age:55},
                {id:'003',name:'倚天',age:6}
            ],
            car:{
                name:'奥迪',
                price:'18万',
                color:'黑色'
            },
            str:"helloworld"
        }
    })
</script>

react和vue中key的内部原理

虚拟DOM中key的作用

key时虚拟DOM对象的标识,当数据发生变化时,Vue会根据新数据生成新的虚拟DOM,然后Vue把新的虚拟DOM和旧的虚拟DOM进行差异比较

比较规则:

当旧的虚拟DOM中找到了和新的虚拟DOM中相同的key时

1、如果两个虚拟DOM中的内容一样,没有变化,就直接使用旧的真实DOM

2、如果两个虚拟DOM中的内容不一样,发生了变化,则生成新的真实DOM,然后替换掉页面中旧的真实DOM

3、注意:不同的元素会分开比较

当旧的虚拟DOM中没有找到和新的虚拟DOM中相同的key时

1、则创建新的真实DOM,然后渲染到页面中

使用index作为key可能会发生的问题

如果对数据进行逆序添加、逆序删除等破坏顺序的操作,就会产生没有必要的真实DOM的更新,会导致效率变低

如果结构中还包含输入类的DOM,就会产生错误的真实DOM的更新,就会导致页面出现问题

在开发中如何选择key

最好使用每条数据的唯一标识作为key值,如:id、手机号、身份证号、学号等唯一的值

如果不存在对数据的逆序添加、逆序删除等破坏顺序的操作,仅仅是渲染列表进行展示,那么使用index作为key是没有问题的