Vue (4) — 绑定class、style样式,条件渲染(v-if、v-show)、列表渲染(v-for)、key的内部原理

目录

一、绑定样式

  1.绑定class样式 

        (1).字符串写法

        (2).数组写法

        (3). 对象写法

  2.绑定style样式

        (1).对象写法

        (2). 数组写法

二、条件渲染

  1.v-if

        (1).写法

        (2).适用于

        (3).特点

  2.v-show

        (1).写法

        (2).适用于

        (3).特点

三、列表渲染

  1.用处

  2.语法

  3.可遍历

        1.遍历数组

        2.遍历对象

        3.遍历字符串(用的很少)

        4.遍历指定次数(用的很少)

      4.key的内部原理 

        0.使用index和id分别作为key的情况

        1.虚拟DOM中key的作用

        2.对比规则

        3.用index作为key可能会引发的问题

        4.开发中如何选择key?


一、绑定样式

        此处为下面的例子需要用到的样式:

<style>
        .basic{
            height: 100px;
            width: 200px;
            border:2px black solid
        }
        .mood1{
            background-color: red;
        }
        .mood2{
            background-color: skyblue;
        }
        .mood3{
            background-color: slategrey;
        }
        .shape1{
            border-radius: 20px;
        }
        .shape2{
            border-style:double;
        }
        .shape3{
            text-decoration: underline;
        }
    </style>

  1.绑定class样式 

        (1).字符串写法

         适用于:要绑定的样式个数不确定、名字也不确定

<body>
    <div id="root">
        <div class="basic" :class="mood" @click="changeMood">{
   
   {content}}</div>
    </div>
</body>
<script>
    Vue.config.productionTip = false //阻止Vue在启动时生成生产提示
    new Vue({
        el:'#root',
        data:{
            content:'test',
            mood:'mood2'
            }
        },
        methods: {
            changeMood(){
                const arr = ['mood1','mood2','mood3']
                const index = Math.floor(Math.random()*3)
                this.mood = arr[index]
            }
        },
    })
</script>

 

 :class="mood" 说明 vue 中有个叫 mood 的属性,这个标签的class 就是mood的值 

@click="changeMood" 实现了随机切换mood1,mood2,mood3样式的功能

        (2).数组写法

         适用于:要绑定的样式个数不确定、名字也不确定

<body>
    <div id="root">
        <div class="basic" :class="classArr" >{
   
   {content}}</div>
    </div>
</body>
<script>
    Vue.config.productionTip = false //阻止Vue在启动时生成生产提示
    new Vue({
        el:'#root',
        data:{
            content:'test',
            mood:'mood2',
            classArr:['shape1','shape2','shape3'] 
        }
    })
</script>

在数组中,

元素带引号,说明是类名

元素不带引号就是data中的属性对应的值。

        (3). 对象写法

         适用于:要绑定的样式个数确定、名字也确定,但要动态决定用不用

<body>
    <div id="root">
        <div class="basic" :class="classObj" >{
   
   {content}}</div>
    </div>
</body>
<script>
    Vue.config.productionTip = false //阻止Vue在启动时生成生产提示
    new Vue({
        el:'#root',
        data:{
            content:'test',
            mood:'mood2',
            classObj:{
                shape1:false,
                shape2:false
            }
        }
    })
</script>

 

  2.绑定style样式

        (1).对象写法

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

<body>
    <div id="root">
        <div class="basic" :style='styleObj' >{
   
   {content}}</div>
    </div>
</body>
<script>
    Vue.config.productionTip = false //阻止Vue在启动时生成生产提示
    new Vue({
        el:'#root',
        data:{
            content:'test',
            styleObj:{
                fontSize:'40px',
                color:'red',
                backgroundColor:'orange'
            }
        }
    })
</script>

        (2). 数组写法

         :style="[a,b]"  其中a,b是样式对象

<body>
    <div id="root">
        <div class="basic" :style='styleArr' >{
   
   {content}}</div>
    </div>
</body>
<script>
    Vue.config.productionTip = false //阻止Vue在启动时生成生产提示
    new Vue({
        el:'#root',
        data:{
            content:'test',
            styleArr:[
                {
                    fontSize:'40px',
                    color:'red'
                },
                {
                    backgroundColor:'orange'
                }
            ]
        }
    })
</script>

二、条件渲染

  1.v-if

        (1).写法

                v-if="表达式"

                v-else-if="表达式"

                v-else="表达式"

        (2).适用于

                切换频率较低的场景

        (3).特点

                不展示的DOM元素直接被移除

 注意:v-if可以和v-else-if、v-else一起使用,但要求结构不能被“打断”

            v-if和template配合使用,可以保持其内部结构(如下例中连续的三个<h2>标签)

<body>
    <div id="root">
        <h2>当前的n值是:{
   
   {n}}</h2>
        <button @click="n++">点我+1</button>
       
        <!-- 使用v-if做条件渲染 -->
        <h2 v-if="false">Hello,{
   
   {name}}</h2>
        <h2 v-if="1 === 1">Hello,{
   
   {name}}</h2>

        <div v-if="n===1">Angular</div>
        <div v-else-if="n===1">React</div>
        <div v-else-if="n===3">Vue</div>
        <div v-else>hhhhh</div>

        <!-- v-if和template的配合使用 -->
        <template v-if="n===1">
            <h2>你好</h2>
            <h2>张三</h2>
            <h2>西安</h2>
        </template>
    </div>
</body>
<script>
    Vue.config.protuctionTip = false //阻止Vue在启动时生成生产提示
    new Vue({
        el:"#root",
        data:{
            name:'张三',
            n:0
        }
    })
</script>

 

  2.v-show

        (1).写法

                v-show="表达式"

        (2).适用于

                切换频率较高的场景

        (3).特点

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

<body>
    <div id="root">
        <h2>当前的n值是:{
   
   {n}}</h2>
        <button @click="n++">点我+1</button>
        <!-- 使用v-show做条件渲染 -->
        <h2 v-show="false">Hello,{
   
   {name}}</h2>
        <h2 v-show="1 === 1">Hello,{
   
   {name}}</h2>

        <div v-show="n===1">Angular</div>
        <div v-show="n===2">React</div>
        <div v-show="n===3">Vue</div>
    </div>
</body>
<script>
    Vue.config.protuctionTip = false //阻止Vue在启动时生成生产提示
    new Vue({
        el:"#root",
        data:{
            name:'张三',
            n:0
        }
    })
</script>

 备注:使用v-if的时候,元素可能无法获取到,而使用v-show一定可以获取到

三、列表渲染

        v-for指令

  1.用处

        用于展示列表数据

  2.语法

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

  3.可遍历

        1.遍历数组

<body>
    <div id="root">
        <!-- 遍历数组 -->
        <h2>人员列表</h2>
        <ul>
            <li v-for="(p,index) in persons" :key="index">
                {
   
   {p.name}}-{
   
   {p.age}}-----{
   
   {index}}
            </li>
        </ul>
    </div>
</body>
<script>
    Vue.config.productionTip = false//阻止Vue在启动时生成生产提示
    new Vue({
        el:"#root",
        data:{
            persons:[
                {id:'001',name:"张三",age:18},
                {id:'002',name:"李四",age:19},
                {id:'003',name:"王五",age:20},
            ]
        }
    })
</script>

 运行结果:

 

        2.遍历对象

<body>
    <div id="root">
        <!-- 遍历对象 -->
        <h2>汽车信息</h2>
        <ul>
            <li v-for="(value,,key) in car" :key="key">
                {
   
   {key}}-{
   
   {value}}
            </li>
        </ul>
    </div>
</body>
<script>
    Vue.config.productionTip = false//阻止Vue在启动时生成生产提示
    new Vue({
        el:"#root",
        car:{
            name:"五菱宏光",
            price:"200W",
            color:"black"
            }
        }
    })
</script>

运行结果:

 

        3.遍历字符串(用的很少)

<body>
    <div id="root">
        <!-- 遍历字符串 -->
        <h2>遍历字符串</h2>
        <ul>
            <li v-for="(char,index) in str" :key="index">
                {
   
   {char}}-{
   
   {index}}
            </li>
        </ul>
    </div>
</body>
<script>
    Vue.config.productionTip = false//阻止Vue在启动时生成生产提示
    new Vue({
        el:"#root",
        data:{
            str:"hello"
        }
    })
</script>

运行结果: 

 

        4.遍历指定次数(用的很少)

<body>
    <div id="root">
        <!-- 遍历指定次数 -->
        <h2>遍历指定次数</h2>
        <ul>
            <li v-for="(number,index) of 10" >
                {
   
   {index}}-{
   
   {number}}
            </li>
        </ul>
    </div>
</body>
<script>
    Vue.config.productionTip = false//阻止Vue在启动时生成生产提示
    new Vue({
        el:"#root",
        str:"hello"
        }
    })
</script>

运行结果:

 

      4.key的内部原理 

        0.使用index和id分别作为key的情况

 

 

        1.虚拟DOM中key的作用

                key是虚拟DOM的标识,当状态中的数据发生变化时,Vue会根据【新数据】生成【新的虚拟DOM】,随后Vue进行【新虚拟DOM】与【旧虚拟DOM】的差异比较,比较规则如下:

            2.对比规则

                (1).旧虚拟DOM中找到了与新虚拟DOM相同的key:

                    1.若虚拟DOM中的内容没变,直接使用之前的真实DOM

                    2.若虚拟DOM中的内容改变,则生成新的真实DOM,随后替换掉页面中之前的真实DOM            

                (2).旧虚拟DOM中未找到与新虚拟DOM相同的key

                    创建新的真实DOM,随后渲染到页面

            3.用index作为key可能会引发的问题

                (1).若对数据进行:逆序添加、逆序删除等破坏顺序操作:

                    会产生没有必要的真实DOM更新,造成界面效果没问题,但效率低

                (2).如果结构中还包含输入类的DOM:

                    会产生错误DOM更新,导致界面有问题

            4.开发中如何选择key?

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

                (2).如果不存在对数据的逆序添加、逆序删除等破坏顺序操作,仅用于渲染列表用于展示

                    使用index作为key是没有问题的

猜你喜欢

转载自blog.csdn.net/m0_59897687/article/details/121522248