侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Vue.js-计算属性和class与style绑定

前端  /  管理员 发布于 6年前   313

计算属性

所有的计算属性都以函数的形式写在vue实例中的computed选项内,最终返回计算后的结果。


计算属性的用法

在一个计算属性中可以完成各种复杂的逻辑,包括运算、函数调用等,只要最终返回一个结果即可。

计算属性还可以依赖多个vue实例的数据,只要其中任一数据变化,计算属性就会重新执行,视图也会更新。

每一个计算属性都包含一个getter和一个setter。

绝大多数情况下,只会用默认的getter方法读取一个计算属性,在业务中很少用到setter,所以在声明一个计算属性时,可以直接使用默认的写法,不必将getter和setter都声明。

计算属性除了简单的文本插值外,还经常用于动态地设置元素的样式名称class和内联样式style。当使用组件时,计算属性也经常用来动态传递props。

计算属性还有两个很实用的小技巧容易被忽略:

一是计算属性可以依赖其他计算属性;二是计算属性不仅可以依赖当前Vue实例的数据,还可以依赖其他实例的数据。
<div id="app1"></div>    <div id="app2">    {{reverseText}}</div>var app1 = new Vue({    el: "#app1",    data: {        text: '123,456'    },});var app2 = new Vue({    el: "#app2",    computed: {        reverseText: function () {            //这里依赖的是实例app1的数据text            return app1.text.split(',').reverse().join(',');        }    }});


计算属性缓存

没有使用计算属性,在methods中定义了一个方法实现了相同的效果,甚至该方法还可以接受参数,使用起来更灵活。

使用计算属性的原因在于它的依赖缓存。一个计算属性所依赖的数据发生变化时,它才会重新取值,在上例中只要text值不改变,计算属性也就不更新。但是methods则不同,只要重新渲染,它就会被调用,因此函数也会被执行。

使用计算属性还是methods取决于你是否需要缓存,当遍历大数组和做大量计算时,应当使用计算属性,除非你不希望得到缓存。


v-bind及class与style绑定

v-bind的主要用法是动态更新html元素上的属性。

在数据绑定中,v-bind最常见的两个应用就是元素的样式名称class和内联样式style的动态绑定。


绑定class的几种方式对象语法

给v-bind:class设置一个对象,可以动态地切换class:

<div id="app">    <div :class="{'active':'isActive'}">测试文字</div></div>new Vue({    el: "#app",    data: {        isActive: true    },});

对象中也可以传入多个属性,动态切换class。另外,:class可以与普通class共存。

<div class="static" :class="{'active':'isActive','error':isError}">测试文字</div>data: {    isActive: true,    isError: false}

当:class的表达式过长或逻辑复杂时,还可以绑定一个计算属性。当条件多于两个时,都可以使用data或computed。

除了计算属性,也可以直接绑定一个Object类型的数据,或者使用类似计算属性的methods。


数组语法

当需要应用多个class时,可以使用数组语法,给:class绑定一个数组,应用一个class列表:

<div id="app">    <div :class="[activeCls,errorCls]">测试文字</div></div>new Vue({    el: "#app",    data: {        activeCls: 'active',        errorCls: 'error'    }});// 结果<div class="active error">测试文字</div>

也可以使用三元表达式来根据条件切换class:

<div :class="[isActive ? activeCls : '',errorCls]">测试文字</div>new Vue({    el: "#app",    data: {        isActive: true,        activeCls: 'active',        errorCls: 'error'    }});

当class有多个条件时,可以在数组语法中使用对象语法:

<div id="app">    <div :class="[{'active':isActive},errorCls]">测试文字</div></div>

使用计算属性给元素动态设置类名,在业务中经常用到,尤其是在写复用的组件时,所以在开发过程中,如果表达式较长或逻辑复杂,应该尽可能地优先使用计算属性。


在组件中使用

如果直接在自定义组件上使用class或:class,样式规则会直接应用到这个组件的根元素上。

Vue.component('my-component', {    template: `<p class="article">一些文本</p>`});

然后在调用这个组件时,应用对象语法或数组语法给组件绑定class:

<div id="app">    <my-component :class="{'active':isActive}"></my-component></div>

这种用法仅适用于自定义组件的最外层是一个根元素,否则会无效。当不满足这种条件或需要给具体的子元素设置类名时,应当使用组件的props来传递。


绑定内联样式

使用:style可以给元素绑定内联样式,方法与:class类似,也有对象语法和数组语法,很像直接在元素上写css。

<div id="app">    <div :style="{'color':color, 'fontSize':fontSize+'px'}">文本</div></div>new Vue({    el: "#app",    data: {        color: 'red',        fontSize: 14    }});

一般把样式写在data或computed中:

<div id="app">    <div :style="styles">文本</div></div>new Vue({    el: "#app",    data: {        styles: {            color: 'red',            fontSize: 16 + 'px'        }    }});

在实际业务中,:style的数组语法并不常用,可以写在一个对象里面,而较为常用的是计算属性。

另外,使用:style时,Vue.js会自动给特殊的css属性名称增加前缀,比如transform。


来自:https://whjin.github.io/frontend-dev-doc/posts/Vue/%E8%AE%A1%E7%AE%97%E5%B1%9E%E6%80%A7.html



  • 上一条:
    浅出Vue 错误处理机制errorCaptured、errorHandler
    下一条:
    vue.js阻止事件冒泡和默认事件
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 使用 Alpine.js 排序插件对元素进行排序(0个评论)
    • 在js中使用jszip + file-saver实现批量下载OSS文件功能示例(0个评论)
    • 在vue中实现父页面按钮显示子组件中的el-dialog效果(0个评论)
    • 使用mock-server实现模拟接口对接流程步骤(0个评论)
    • vue项目打包程序实现把项目打包成一个exe可执行程序(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-03
    • 2018-04
    • 2018-05
    • 2018-06
    • 2018-09
    • 2018-11
    • 2018-12
    • 2019-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-04
    • 2021-05
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客