当前位置: 首页 > news >正文

Vue2 入门到实战(day2):计算属性、监视属性、样式绑定与条件渲染(附代码案例)

        在 Vue 开发中,计算属性、监视属性、样式绑定和条件渲染是高频使用的核心语法。它们能让数据处理更高效、页面样式更灵活、DOM 渲染更智能。本文结合实战案例,详细拆解每个语法的用法、原理和最佳实践,适合 Vue 初学者系统学习。

一、计算属性(computed):依赖数据的 “智能属性”

计算属性是基于已有数据计算得出的新属性,核心优势在于缓存机制,能提升页面渲染效率。

核心特性

  • 本质:底层借助Object.definePropertygettersetter实现。
  • 触发时机:get函数在初次读取属性或依赖数据变化时执行;set函数在属性被修改时执行。
  • 优势:与 methods 相比,内部缓存可复用结果,避免重复计算,效率更高。
  • 注意:计算属性最终会挂载到 vm 实例上,可直接读取;若需修改,必须编写set函数并更新依赖数据。

实战案例:姓名拼接

完整版(可读可改)
<div id="root">姓:<input type="text" v-model="firstName"> <br>名:<input type="text" v-model="lastName"> <br>全名:<span>{{fullName}}</span> <!-- 直接使用计算属性 -->
</div>
<script>
const vm = new Vue({el: '#root',data: { firstName: '张', lastName: '三' },computed: {fullName: {// 读取fullName时触发get() {console.log('get被调用');return this.firstName + '-' + this.lastName;},// 修改fullName时触发set(value) {const arr = value.split('-');this.firstName = arr[0];this.lastName = arr[1];}}}
});
</script>
简写版(只读不改)

若计算属性无需修改,可省略getset,直接简写为函数形式:

computed: {fullName() {return this.firstName + '-' + this.lastName;}
}

二、监视属性(watch):数据变化的 “监听器”

监视属性用于监听已有数据的变化,当数据改变时触发回调函数,可执行自定义逻辑(如异步操作)。

核心特性

  • 监视目标:必须是已存在的数据(如 data、computed 中的属性)。
  • 两种写法:Vue 实例配置项watch或实例方法vm.$watch
  • 深度监视:默认仅监视数据表层变化,配置deep: true可监视对象内部嵌套数据。
  • 即时执行:配置immediate: true,初始化时立即触发一次回调。

实战案例:天气切换

写法 1:配置项形式
<div id="root"><h2>今天天气{{info}}</h2><button @click="changeWeather">切换天气</button>
</div>
<script>
const vm = new Vue({el: '#root',data: { isHot: true },computed: {info() { return this.isHot ? '炎热' : '凉爽'; }},methods: {changeWeather() { this.isHot = !this.isHot; }},watch: {isHot: {immediate: true, // 初始化触发deep: true, // 深度监视(若isHot是对象时需开启)handler(newVal, oldVal) {console.log('天气变化:', newVal, oldVal);}}}
});
</script>
写法 2:实例方法形式
// 适用于动态确定监视目标的场景
vm.$watch('isHot', {immediate: true,handler(newVal, oldVal) {console.log('天气变化:', newVal, oldVal);}
});
简写版

无需额外配置(如immediatedeep)时,可直接简写:

// 配置项简写
watch: {isHot(newVal, oldVal) {console.log('天气变化:', newVal, oldVal);}
}// 实例方法简写
vm.$watch('isHot', function(newVal, oldVal) {console.log('天气变化:', newVal, oldVal);
});

深度监视实战

监视嵌套对象内部值的变化:

data: {numbers: { c: { d: { e: 100 } } }
},
watch: {numbers: {deep: true,handler() {console.log('嵌套数据发生改变');}}
}

三、computed 与 watch 的核心区别

特性computedwatch
功能范围仅支持同步计算支持同步、异步操作(如定时器、ajax)
依赖关系基于依赖数据自动更新需明确指定监视的属性
缓存机制有缓存,重复读取不重复计算无缓存,数据变化即触发
使用场景数据联动计算(如拼接、筛选)数据变化后的副作用操作(如日志、请求)

关键原则

  1. 被 Vue 管理的函数(如gethandler),需写成普通函数,确保this指向 vm 实例。
  2. 不被 Vue 管理的函数(如定时器、ajax 回调),需写成箭头函数,避免this指向全局。

四、样式绑定:动态控制页面样式

Vue 支持通过v-bind:class(简写:class)和v-bind:style(简写:style)动态绑定样式,灵活适配不同场景。

1. 绑定 class 样式

字符串写法(类名动态变化)

适用于类名不确定,需动态获取的场景:

<style>
.normal { background: skyblue; }
.happy { background: pink; }
</style>
<div id="root"><div class="basic" :class="mood" @click="changeMood">点击切换样式</div>
</div>
<script>
const vm = new Vue({el: '#root',data: { mood: 'normal' },methods: {changeMood() {const arr = ['happy', 'sad', 'normal'];this.mood = arr[Math.floor(Math.random() * 3)];}}
});
</script>
数组写法(多类名动态组合)

适用于类名、个数均不确定的场景:

<style>
.style1 { font-size: 30px; }
.style2 { color: red; }
.style3 { border-radius: 8px; }
</style>
<div class="basic" :class="classArr">数组绑定样式</div>
<script>
data: {classArr: ['style1', 'style2', 'style3'] // 可动态修改数组元素
}
</script>
对象写法(类名是否启用动态控制)

适用于类名、个数确定,但需动态决定是否使用的场景:

<div class="basic" :class="classObj">对象绑定样式</div>
<script>
data: {classObj: {style1: true, // 启用style1style2: false, // 禁用style2style3: true // 启用style3}
}
</script>

2. 绑定 style 样式

对象写法(直接绑定样式键值对)
<div :style="styleObj">style对象绑定</div>
<script>
data: {styleObj: {fontSize: '24px',color: 'blue',backgroundColor: '#f5f5f5'}
}
</script>
数组写法(多样式对象组合)
<div :style="styleArr">style数组绑定</div>
<script>
data: {styleArr: [{ fontSize: '24px', color: 'blue' },{ backgroundColor: '#f5f5f5', borderRadius: '8px' }]
}
</script>

五、条件渲染:按需展示 DOM 元素

Vue 提供v-ifv-show两种条件渲染指令,根据表达式结果控制 DOM 的显示与隐藏。

1. v-if 指令(直接操作 DOM)

  • 特点:不满足条件时,DOM 元素会被直接移除(而非隐藏)。
  • 语法:支持v-ifv-else-ifv-else组合使用,结构不可被打断。
  • 适用场景:切换频率低的场景(如页面初始化时的条件展示)。
实战案例
<div id="root"><div v-if="n === 1">Vue</div><div v-else-if="n === 2">React</div><div v-else-if="n === 3">Angular</div><div v-else>请选择框架</div><!-- 配合template批量控制多个元素 --><template v-if="n === 1"><h3>Vue优势</h3><p>轻量、易用、生态完善</p></template>
</div>
<script>
const vm = new Vue({el: '#root',data: { n: 1 }
});
</script>

2. v-show 指令(通过样式隐藏 DOM)

  • 特点:不满足条件时,DOM 元素保留,仅通过display: none隐藏。
  • 语法:v-show="表达式",不支持v-else组合。
  • 适用场景:切换频率高的场景(如按钮控制的显示隐藏)。
实战案例
<div id="root"><h2 v-show="isShow">v-show条件渲染</h2><button @click="isShow = !isShow">切换显示</button>
</div>
<script>
const vm = new Vue({el: '#root',data: { isShow: true }
});
</script>

v-if 与 v-show 的核心区别

特性v-ifv-show
DOM 操作方式移除 / 创建 DOM 元素隐藏 / 显示 DOM(display 属性)
初始渲染开销较高(需操作 DOM)较低(仅设置样式)
切换开销较低(直接移除 / 创建)较高(频繁切换样式)
元素获取隐藏时无法获取 DOM隐藏时仍可获取 DOM

总结

        本文涵盖 Vue 中 4 个核心语法模块:计算属性侧重数据联动计算,监视属性侧重数据变化后的副作用操作,样式绑定实现动态样式控制,条件渲染按需展示 DOM。掌握这些语法的使用场景和核心区别,能大幅提升 Vue 项目的开发效率和代码质量。

http://www.dtcms.com/a/596413.html

相关文章:

  • C语言位运算深度应用:嵌入式硬件寄存器控制与低功耗优化实践
  • 深圳建立网站营销用动易建设网站教程
  • 京东后端架构技术,Pipline 设计 解决复杂查询逻辑
  • 《STM32 江湖 SPI 双绝:硬件外设与软件模拟的深度解析》
  • Docker学习笔记---day002
  • F280049C学习笔记之X-BAR
  • Python基础教学:Python的openpyxl和python-docx模块结合Excel和Word模板进行数据写入-由Deepseek产生
  • WebSocket原理及实现详解
  • 网站建设与管理吴振峰pptapp的制作需要多少钱
  • 优雅与极简:将你的屏幕变成复古翻页钟——Fliqlo for Mac 完全指南
  • wsl ubuntu24.04 cuda13 cudnn9 pytorch 显卡加速
  • macos安装mysql
  • 解决 iPhone 和 Mac 之间备忘录无法同步的9种方法
  • 【Ubuntu系统开机后出现:GNU GRUB ,Advanced options for Ubuntu】
  • 江西省建设监督网站电子网特色的企业网站建设
  • Mac上DevEco-Studio功能/使用介绍
  • Redis 配置详解
  • Mac 下载 VMware 11.1.0-1.dmg 后如何安装?超简单教程
  • mac怎么卸载office Powerpoint
  • dz论坛做分类网站wordpress git 7.5
  • Java 大文件上传实战:从底层原理到分布式落地(含分片 / 断点续传 / 秒传)
  • 有趣的网站网址之家wordpress网站中英文切换
  • 「腾讯云NoSQL」技术之Redis篇:精准围剿rehash时延毛刺实践方案揭秘
  • 中控播控系统:一键掌控多媒体空间
  • 遗传算法与粒子群算法优化BP提高分类效果
  • c++ -- 循环依赖解决方案
  • 免费vip网站推广做疏通什么网站推广好
  • 金融智能体具体能做什么?应用场景有哪些?
  • 云手机的核心用途都有哪些?
  • 需求洞察助力战略规划实现潜在市场机会