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博客。
相关文章
|
3天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
|
3天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
|
17天前
|
数据采集 监控 JavaScript
在 Vue 项目中使用预渲染技术
【10月更文挑战第23天】在 Vue 项目中使用预渲染技术是提升 SEO 效果的有效途径之一。通过选择合适的预渲染工具,正确配置和运行预渲染操作,结合其他 SEO 策略,可以实现更好的搜索引擎优化效果。同时,需要不断地监控和优化预渲染效果,以适应不断变化的搜索引擎环境和用户需求。
|
3天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
4天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
4天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
4天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
|
5天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
5天前
|
存储 JavaScript
Vue 组件间如何通信
Vue组件间通信是指在Vue应用中,不同组件之间传递数据和事件的方法。常用的方式有:props、自定义事件、$emit、$attrs、$refs、provide/inject、Vuex等。掌握这些方法可以实现父子组件、兄弟组件及跨级组件间的高效通信。
|
10天前
|
JavaScript
Vue基础知识总结 4:vue组件化开发
Vue基础知识总结 4:vue组件化开发