vue-day02计算属性,v-bind,v-if,v-for

简介: 文章介绍了Vue.js中的计算属性、class与style的绑定、条件渲染和列表渲染的使用。通过示例代码展示了如何使用计算属性简化模板逻辑、如何通过v-bind动态绑定class和style、如何使用v-if进行条件渲染以及如何使用v-for进行列表渲染。这些特性使得Vue.js在构建动态用户界面时更加灵活和强大。

计算属性

计算属性,将模板中复杂的逻辑,提取出去,使模板变得简洁。
比如,一个字符串反转的实现:

<div id="app1">
    {
  {msg.split('').reverse().join('')}}
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    let app1 = new Vue({
    
        el:'#app1',
        data:{
    
            msg:'简单字符反转'
        }
    });
</script>

在这里插入图片描述
这样看起来似乎也挺简单,但是如果改变需求了呢,要求前7个字符要求正常输出,而从第7个字符开始逆序输出。这样的逻辑是不是就复杂起来了。
这个时候,使用computed来声明一个计算属性,然后在其内部定义函数来对字符串进行处理

<div id="app2">
    {
  {msg}}<br>
    {
  {reverseMsg}}
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    let app2 = new Vue({
    
        el:'#app2',
        data: {
    
            msg:'abcdefg反转?'
        },
        computed:{
    
            reverseMsg:function () {
    
                let strFirst =this.msg.substring(0,7).split('').reverse().join('');
                let strLast =this.msg.substring(7).split('').reverse().join('');
                return ""+strFirst+strLast;
            }
        }

    });
</script>

在这里插入图片描述
为啥要使用computed属性呢?而不是直接使用一个方法来处理,这样使用计算属性,会不会兜圈子?
上述的同款,改用methods实现:

<div id="app2">
    {
  {msg}}<br>
    {
  {reverseMessage()}}
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    let app2 = new Vue({
    
        el:'#app2',
        data: {
    
            msg:'abcdefg反转?'
        },

        methods:{
    
            reverseMessage:function () {
    
                let strFirst =this.msg.substring(0,7).split('').reverse().join('');
                let strLast =this.msg.substring(7).split('').reverse().join('');
                return ""+strFirst+strLast;
            }
        }

    });
</script>

两种方式的最终结果确实是完全相同的。然而,不同的是计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要 msg还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。

class与style的绑定

上篇文章,略微的说过一些v-bind指令的用法,v-bind指令可以动态的为html元素添加属性。
我们可以传给 v-bind:class 一个对象,动态的切换class

<div id="app3" v-bind:class="classObject">app3</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    let app3 = new Vue({
    
        el:'#app3',
        data:{
    
            classObject:{
    
                active:true,
                'text-danger':true
            }
        }
    });
</script>

通过classObject对象中的属性值,来动态的决定app3的样式,由下图可见,classObject已经被绑定到了app3中
在这里插入图片描述
在传入对象的基础上,绑定一个计算属性(常用且强大的模式)–可以设定多个属性值来决定当前的类属性是否附加,如app4。

<div id="app4" v-bind:class="classLt">app4</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    let app4 =new Vue({
    
        el:'#app4',
        data:{
    
            isActive:true,
            error:null
        },
        computed:{
    
            classLt:function () {
    
                return{
    
                    active: this.isActive && !this.error,
                    //根据isActive和error的值,来决定active是否展露
                    'text-danger':this.error && this.error.type === 'fatal'
                }
            }
        }
    });
</script>

在这里插入图片描述

传入一个数组作为类属性:

<div id="app5" v-bind:class="[activeClass,errorClass]">app5</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    let app5 = new Vue({
    
        el:'#app5',
        data:{
    
            activeClass:'active',
            errorClass:'text-danger'
        }
    });
</script>

在这里插入图片描述

同样,也可以绑定内联样式,让我们的感受更明显一点(上面绑定对象也可以很明显,自己把对应的css类属性写好就ok啦)

<div id="app6" v-bind:style="{
      color:activeColor,fontSize:fontSize+'px'}">内联样式app6</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    let app6 = new Vue({
    
        el:'#app6',
        data:{
    
            activeColor:'red',
            fontsize:30
        }
    });
</script>

在这里插入图片描述
多重值

从 2.3.0 起你可以为 style 绑定中的 property 提供一个包含多个值的数组,常用于提供多个带前缀的值

<div :style="{
       display: ['-webkit-box', '-ms-flexbox', 'flex'] }" id="app8">app8</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    let app8 =new Vue({
    
        el:'#app8',
        data:{
    
            display:{
    
                ' -webkit-box':true,
                '-ms-flexbox':true,
                flex:true
            }
        }
    });
</script>

这样写只会渲染数组中最后一个被浏览器支持的值。
在这里插入图片描述

条件渲染and列表渲染

v-if指令,其实就是if…else。v-if 指令用于条件性地渲染一块内容。这块内容只会在指令的表达式为true的时候被渲染。
不过多赘述,直接将v-if ,v-else-if,v-else结合在一块儿的一个例子

<div id="app3">
    <div v-if="type === 'A'">
        A
    </div>
    <div v-else-if="type === 'B'">
        B
    </div>
    <div v-else-if="type === 'C'">
        C
    </div>
    <div v-else>
        Not A/B/C
    </div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    let app3 = new Vue({
    
        el:'#app3',
        data:{
    
            type:'E',
        }
    });
</script>

在这里插入图片描述
v-for指令,循环遍历渲染。可以用 v-for 指令基于一个数组来渲染一个列表。
v-for 指令需要使用 item in items 形式的特殊语法,
其中 items 是源数据数组,而 item 则是被迭代的数组元素的别名。
v-for 遍历数组中的对象时,因为对象都是键值对,然后就需要设定key值来遍历?Map感觉差不多

<ul id="ulList">
    <li v-for="item in items" :key="item.message">
        {
  {item.message}}
    </li>
</ul>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var ulList = new Vue({
        el:'#ulList',
        data:{
            items:[
                {message:'第二天'},
                {message: '基本语法组件过一半'}
            ]
        }
    });

在这里插入图片描述
在 v-for 块中,我们可以访问所有父作用域的 property。v-for 还支持一个可选的第二个参数,即当前项的索引。v-for = "(item,index) in items" .

<ul id="ul2">
    <li v-for="(item, index) in items">
        {
  {parentMessage}}-{
  {index}}-{
  {item.message}}
    </li>
</ul>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var ulList = new Vue({
    
        el:'#ul2',
        data:{
    
            items:[
                {
    message:'第二天'},
                {
    message: '基本语法组件过一半'}
            ]
        }
    });
</script>

在这里插入图片描述
在v-for里使用并且遍历对象
在遍历对象时,会按 Object.keys() 的结果遍历,但是不能保证它的结果在不同的 JavaScript 引擎下都一致。为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key attribute。

<ul id="ul4">
    <li v-for="st in students" v-bind:key="st.sid">
        {
  {st.sid}}+{
  {st.sname}}
    </li>
</ul>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    let ul4 = new Vue({
    
        el:'#ul4',
        data:{
    
            students:[
                {
    sid:"2020040413",sname:"叶问"},
                {
    sid:"2020040416",sname:"黄飞鸿"}
            ]
        }
    });
</script>

在这里插入图片描述
在遍历时,过滤掉自己不喜欢的数据,如下面的例子

<!--做一个过滤奇数-->
<ul id="ul5">
    <li v-for="num in nums" >
        {
  {num}}
    </li>
</ul>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    let ul5 = new Vue({
        el:'#ul5',
        data:{
            numbers:[1,2,3,4,5,8,6,11,12,78,99]
        },
        computed:{
            nums:function () {
                return this.numbers.filter(function (number) {
                    return number %2 === 0
                })
            }
        }
    })

在这里插入图片描述
啦啦啦,结束!
在这里插入图片描述

相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
|
25天前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
1天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
27天前
|
JavaScript 前端开发 开发者
vue 数据驱动视图
总之,Vue 数据驱动视图是一种先进的理念和技术,它为前端开发带来了巨大的便利和优势。通过理解和应用这一特性,开发者能够构建出更加动态、高效、用户体验良好的前端应用。在不断发展的前端领域中,数据驱动视图将继续发挥重要作用,推动着应用界面的不断创新和进化。
|
28天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
32 1
vue学习第一章
|
28天前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
26 1
vue学习第三章
|
28天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
35 1
vue学习第四章
|
28天前
|
JavaScript 前端开发 算法
vue学习第7章(循环)
欢迎来到瑞雨溪的博客,一名热爱JavaScript和Vue的大一学生。本文介绍了Vue中的v-for指令,包括遍历数组和对象、使用key以及数组的响应式方法等内容,并附有综合练习实例。关注我,将持续更新更多优质文章!🎉🎉🎉
24 1
vue学习第7章(循环)
|
28天前
|
JavaScript 前端开发
vue学习第九章(v-model)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生,自学前端2年半,正向全栈进发。此篇介绍v-model在不同表单元素中的应用及修饰符的使用,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
29 1
vue学习第九章(v-model)
|
28天前
|
JavaScript 前端开发 开发者
vue学习第十章(组件开发)
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文深入讲解Vue组件的基本使用、全局与局部组件、父子组件通信及数据传递等内容,适合前端开发者学习参考。持续更新中,期待您的关注!🎉🎉🎉
39 1
vue学习第十章(组件开发)
|
28天前
|
JavaScript 前端开发
vue学习第十一章(组件开发2)
欢迎来到我的博客,我是瑞雨溪,一名自学前端两年半的大一学生,专注于JavaScript与Vue。本文介绍Vue中的插槽(slot)使用方法,包括基本插槽、具名插槽及作用域插槽,帮助你在组件开发中实现内容的灵活定制。如果你觉得有帮助,请关注我,持续更新中!🎉🎉🎉
23 1
vue学习第十一章(组件开发2)