11.VUE中的条件渲染及列表渲染

v-if指令:控制一个模板标签是否在页面上显示 v-if后面跟着一个js表达式 这个表达式的返回值决定了div标签是否真实的挂载到页面上 通过v-if指令结合js表达式决定一个DOM元素是否在页面上展示【v-if指令变量值为false时 该元素不存在于DOM之上】

v-show指令:控制一个模板标签是否在页面上显示 【v-show指令对应的js表达式为false时 该标签对应的DOM在页面上依然存在 只不过以style="display: none;"的形式挂载在页面上】

在经常需要隐藏/显示一个DOM元素时:使用v-show指令性能更高 因为不会频繁得将DOM从页面上删除再添加 v-if指令每次隐藏显示都要删除DOM再添加DOM 性能更低一些

v-else指令:v-if指令和v-else指令要紧贴着使用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>VUE中的条件渲染</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <div v-if="show">{{message}}</div>
    <div v-else>bye world</div>
    <div v-show="show">{{message}}</div>
    <div v-if="show2=='a'">this is A</div>
    <div v-else-if="show2=='b'">this is B</div>
    <div v-else>this is others</div>
</div>
<script>
var vm=new Vue({
    el:'#app',
    data:{
        show:false,
        show2:"a",
        message:"hello world"
    },
})
</script>
</body>
</html>

key值:v-if切换的时候 input中的内容并没有清空 这是因为VUE在重新渲染页面的时候会尽量的尝试复用页面上已经存在的DOM元素 【用户名和邮箱名复用了同一个input 复用的同时内容没有清空】所以采用key值的形式 当给某个元素标签添加key值的时候VUE会知道 该元素是页面上唯一的元素 如果两个key不一样 VUE就不会尝试复用该input标签【VUE虚拟DOM diff算法中用到的内容】

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>VUE的key值</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <div v-if="show">
        用户名:<input key="username"/>
    </div>
    <div v-else>
        邮箱名:<input key="password"/>
    </div>
</div>
<script>
var vm=new Vue({
    el:'#app',
    data:{
        show:false,
    },
})
</script>
</body>
</html>

数组循环:v-for="(item,index) of list" :key="item.id"

  • 第一个参数:列表中的每一项的内容
  • 第二个参数:每一项在页面中的索引下标
  • 为了提升循环显示的性能 会给每个循环项添加唯一的key值 不推荐使用index作为key值:因为使用index作为key值 在频繁操作DOM元素相对应的数据时费性能【可能会让VUE 没办法充分复用DOM节点】
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>VUE的列表渲染</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <div v-for="(item,index) of list" :key="item.id">
        {{item.text}}---{{index}}
    </div>
</div>
<script>
var vm=new Vue({
    el:'#app',
    data:{
        list:[{
            id:"0101",
            text:"hello"
        },{
            id:"0102",
            text:"dell"
        },{
            id:"0103",
            text:"nice"
        },{
            id:"0104",
            text:"to"
        },{
            id:"0105",
            text:"meet"
        },{
            id:"0106",
            text:"you"
        },]
    },
})
</script>
</body>
</html>

tips:当尝试修改数组中的内容时 不能直接通过下标的形式改变数组 只能通过几个VUE提供的数组变异方法操作数组 才能实现数据发生变化页面也发生变化这种效果

  • 数组变异方法:pop push shift unshift splice sort reverse

 

实现数据发生变化页面也发生变化方案二:改变引用地址【数组在js中是引用类型 】让其指向另外一个地址空间

template占位符:模板占位符 可以用于包裹一些元素 但在循环的过程中不会被真的渲染在页面上

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>VUE的列表渲染</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <template v-for="(item,index) of list" :key="item.id">
        <div>
            {{item.text}}---{{index}}
        </div>
        <span> span:{{item.text}}</span>
    </template>
</div>
<script>
var vm=new Vue({
    el:'#app',
    data:{
        list:[{
            id:"0101",
            text:"hello"
        },{
            id:"0102",
            text:"dell"
        },{
            id:"0103",
            text:"nice"
        },{
            id:"0104",
            text:"to"
        },{
            id:"0105",
            text:"meet"
        },{
            id:"0106",
            text:"you"
        },]
    },
})
</script>
</body>
</html>

 

对象循环:v-for="(item,key,index) of userInfo"

  • 第一个参数:对象中的每一项的内容
  • 第二个参数:对象的键名
  • 第三个参数:每一项在页面中的索引下标
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>VUE的列表渲染</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <!-- 循环userInfo 将对应的内容渲染在页面上 -->
    <div v-for="(item,key,index) of userInfo">
        {{item}}---{{key}}--{{index}}
    </div>
</div>
<script>
var vm=new Vue({
    el:'#app',
    data:{
        userInfo:{
            name:"Dell",
            age:25,
            gender:"male",
            salary:"secret",
        }
    },
})
</script>
</body>
</html>

遍历对象得时候直接向对象中动态加值:无效

通过改变引用地址实现数据发生变化页面也发生变化:

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值