Vue学习计划-Vue2--Vue核心(四)watch监听属性、动态绑定class、style,set方法的使用

1. 监听(watch): 监听一个属性的变化

  1. 监事属性watch:

    1. 当监视的属性变化时,回调函数自动调用,进行相关操作
    2. 监视的属性必须存在,才能进入监视
    3. 监视的两种写法:
      1. new Vue时传入watch配置
      2. 通过vm.$watch()监视
    4. immediate初始化时让handler调用一下
  2. 深度监视:

    1. Vue中的watch默认不监视对象内部值的变化(只监视一层)
    2. 配置deep:true可以监视对象内部值变化(多层)
  3. 备注:

    1. Vue自身可以监视对象内部值得变化,但Vue提供的watch默认不可以
    2. 使用watch时,根据数据的具体结构,决定是否采用深度监听
    3. 简写:当确定不使用immediatedeep属性时可以简写
一、监听1. const vm = new Vue({el: "#app",watch:{immediate: true, // 初始化时让handler调用一下deep: true, // 深度监听handler(newValue, oldValue){console.log(newValue, oldValue)}}})2. vm.$watch('isSHow',{immediate: true, // 初始化时让handler调用一下deep: true, // 深度监听handler(newValue, oldValue){console.log(newValue, oldValue)}})
二、简写1. const vm = new Vue({el: "#app",watch:{isShow(newValue, oldValue){console.log(newValue, oldValue)}}})2. vm.$watch('isSHow', function(newValue, oldValue){console.log(newValue, oldValue)})
  1. 计算属性(computed)、方法methods、监听(watch)的区别?
    computed、watch、methods专人干专事

    1. 计算属性computed:
      1. 目的是得到一个计算结果,必须要有return,一个状态值受多个状态值影响。
      2. 有缓存,当依赖状态值变化是,才会重新计算。
      3. 不能异步
      4. 本身不支持传参,可以使用闭包
    2. 事件methods
      1. 绑定的事件处理,非必须return
      2. 没有缓存
    3. 监听watch:
      1. 一个状态的改变 影响多条数据,没有return
      2. 没有缓存
      3. 可以异步
      4. 不传参

2. class和style绑定

  1. class样式 写法: :class = "xxx", xxx可以是字符串、对象、数组
    1. 字符串写法适用于:类名不确定,要动态获取
    2. 对象写法适用于:要绑定多个样式,个数不确定,名字也不确定
    3. 数组写法适用于:要绑定多个样式,个数确定,名字也确定
  2. style样式
:style = "{fontSize: xxx}" 其中xx是动态的
:style = "[a, b]" 其中a, b是样式对象

示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="./vue.js"></script>
<style>/* #region */.red{color: red;}.blue{color: blue;}.green{color: green}.yellow{color: yellow}/* #endregion */.bold{font-weight: bold;}.size{font-size: larger;}
</style>
</head>
<body>
<div id="app"><!-- 1. 绑定字符串 --><!-- 1.1.1 固定切换class名称 --><p :class="name">这是一个动态class</p><button @click="changClass">点击单次切换class名</button><br><!-- 1.1.2 随机切换class名称 --><!-- class 和:class 可以绑定多个class名称 --><p class="bold" :class="name">这是一个动态class</p><button @click="changClass2">点击数组切换class名</button><br><!-- 1.1.3 三元表达式表达式切换class名称 --><p :class="isName ? 'red' : 'blue'">这是一个动态class</p><button @click="isName = !isName">表达式切换class名</button><hr><!-- 2. 绑定对象 --><!-- <p :class="{bold: true, size: false}">这是一个对象绑定的class类名</p> --><p :class="objClass">这是一个对象绑定的class类名</p><button @click="objClassChange">表达式切换class名</button><hr><!-- 3. 绑定数组 --><!-- <p :class="['blue', 'bold', 'size']">这是一个对象绑定的class类名</p> --><p :class="arrClass">这是一个对象绑定的class类名</p><button @click="arrClassChange">表达式切换class名</button></div>
<script>const vm = new Vue({el: '#app',data: {name: 'red',isName: true,arr:['red', 'blue', 'green'],// 对象class名称objClass:{red: true,bold: true},// 数组class名称arrClass:[ 'blue', 'bold', 'size']},methods: {// #region 字符串绑定changClass(){this.name = 'blue'},changClass2(){const a = Math.floor(Math.random() * 3)console.log(this.arr[a]);this.name = this.arr[a]},// #endregionobjClassChange(){// this.objClass.size = true// 解决方法 $set方法// this.$set(this.objClass, 'size', true)Vue.set(this.objClass, 'size', true)},arrClassChange(){// this.arrClass.splice(0, 1, 'yellow')// 存在问题?为何vm中的arrClass值改变了,页面却没有渲染 => Vue内部监视原理// this.arrClass[0] = 'yellow'// 解决方法// this.$set(this.arrClass, 0, 'yellow')this.$set(this.arrClass, 0, 'yellow')}},})
</script></body>
</html>

3. set方法

  1. Vue会监视data中所有层次的数据。
  2. 如何监视对象的数据? 通过setter实现监视,且要在new Vue时就传入要监测的内容
    • 对象中后追加的属性,Vue默认不做响应式处理
    • 如需要给后添加的属性做响应式,使用如下API:
Vue.set(target, propertyName/index, value)
vm.$set(target, propertyName/index, value)
  1. 如何监视数组中的数据? 通过包裹数组更新元素的方法实现,本质就是做两件事
    1. 调用原生对应的方法对数组进行更新
    2. 重新解析模板,进而更新页面
  2. 在Vue修改数组中的某个元素一定要用如下方案:
    1. 使用这些API:push(), pop(), shift(), unshift(), sort(), reverse(), splice()
  3. Vue.set()或者vm.$set()
  4. 特别注意:Vue.set()和vm.$set()不能给vm或者vm的根数据对象添加属性!!

示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="./vue.js"></script>
</head>
<body>
<div id="app">{{ obj }}<button @click="changeObj">点击改变obj值</button><hr>{{ arr }}<button @click="changeArr">点击改变arr值</button><hr>{{ arr2 }}<span v-once>{{ arr2 }}</span><button @click="changeArr2">点击改变arr顺序sort方法</button><hr>{{ arr3 }}<button @click="changeArr3">点击翻转arr</button>
</div>
<script>
const vm = new Vue({el: '#app',data:{obj:{name: '小明'},arr:['小亮', 10],arr2:[ 10, 40, 5, 30],arr3:[ 1, 2, 3, 4]},methods: {changeObj(){// this.obj.banji = 'xx班级'// 解决方法// this.$set(this.obj, 'banji', 'xx班级')Vue.set(this.obj, 'banji', 'xx班级')},changeArr(){// this.arr[0] = '小白'// 解决方法一: set// this.$set(this.arr, 2, 'xx班级')// Vue.set(this.arr, 2, 'xx班级')// this.arr[2] = '小白'// 解决方法二:内置函数// 1. 数组后添加值// this.arr.push('小白')// 2. 数组后删除值// this.arr.pop()// 3. 从头往后删除数组// this.arr.shift()// 4. 数组前面加值// this.arr.unshift('小小')},// 数组排序changeArr2(){// 5. sort()// 正序this.arr2.sort((a,b) =>{console.log('--');console.log(a, b);return a-b})// this.arr2.sort((a,b) =>{//   return b - a// })},// 翻转数组changeArr3(){// this.arr3.reverse()// this.arr3.splice(1, 2, 'a', 'b', 'v')// 注意: 禁止给vm或者vm的跟数据对象添加属性// console.log(vm._data)// this.$set(vm._data, 'name', 'ssss')// this.$set(vm, 'name', 'ssss')}},
})
</script>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/204229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣题:字符的统计-12.6

力扣题-12.6 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;696. 计数二进制子串 解题思想&#xff1a;先统计连续的0和连续的1的个数&#xff0c;然后进行相加即可&#xff08;想不到一点&#xff09; class Solution(object):def countBinaryS…

Vue.component

组件是可复用的 Vue 实例&#xff0c;且带有一个名字 因为组件是可复用的 Vue 实例&#xff0c;所以它们与 new Vue 接收相同的选项&#xff0c;例如 data、computed、watch、methods 以及生命周期钩子等。仅有的例外是像 el 这样根实例特有的选项。 // 定义一个名为 button-co…

数据分析NumPy

数据分析NumPy NumPy简介第一个NumPy应用NumPy APINumPy数组对象NumPy数组的维度和形状NumPy数组的数据类型NumPy创建数组NumPy访问数组元素NumPy数组操作NumPy数组广播&#xff08;Broadcasting&#xff09;NumPy数组方法和函数NumPy数组文件IONumPy数组的组合NumPy分割数组N…

EI级 | Matlab实现TCN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测

EI级 | Matlab实现TCN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测 目录 EI级 | Matlab实现TCN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.【EI级】Matlab实现TCN-LSTM-Multihead-Attent…

egen3 rowwise().maxCoeff()的使用

1、安装eigen3 2、引用头文件 3、代码测试 MatrixXf aaa(2, 4);aaa << 1, 2, 3, 4, 5, 6, 7, 8; Vector2f diff(10, 20);aaa.colwise() diff;std::cout << "new_aaa : " << aaa << endl; 全部代码&#xff1a; int main() {MatrixXf …

Echart运用之柱状图常见问题及案例代码

前言 ECharts 是一个开源的 JavaScript 可视化库,用于生成各种类型的图形和图表。其中,柱状图(Bar chart)是一种常见的图表类型,用于表示不同类别之间的数值比较。 初学者,可参考下我的另外一篇文章,从基础到深入,解读柱状图的运用。 Echarts之柱状图 常见问题及案例…

go基础语法10问(2)

1.recover的执行时机 无&#xff0c;recover 必须在 defer 函数中运行。recover 捕获的是祖父级调用时的异常&#xff0c;直接调用时无效。 func main() {recover()panic(1) }直接 defer 调用也是无效。 func main() {defer recover()panic(1) }defer 调用时多层嵌套依然无效…

Ubuntu18安装(重启黑屏问题)

1. F10 进入bios&#xff0c;选择u盘里的ubuntu镜像 2.进入使用ubuntu&#xff0c;下载 3.重启&#xff0c;esc 4.ubuntu 安e进入 5. nomodeset&#xff08;&#xff09; F10 保存启动 6. 7.没有网 手机usb提供网络 下载有限网卡驱动

【头歌实训】分布式文件系统 HDFS

文章目录 第1关&#xff1a;HDFS的基本操作任务描述相关知识HDFS的设计分布式文件系统NameNode与DataNode HDFS的常用命令 编程要求测试说明答案代码 第2关&#xff1a;HDFS-JAVA接口之读取文件任务描述相关知识FileSystem对象FSDataInputStream对象 编程要求测试说明答案代码 …

2023.12.3 hive-sql日期函数小练习

目录 时间函数练习 时间戳 周,季度等计算 获取日期相关 获取当前时间 时间函数练习 --日期函数练习 ,sub是英文subtraction减法的简写, add是英文addition加法的简写 --获取今天是本周的第几天 select dayofweek(2023-12-3); --周日为一周的第一天 select current_timest…

代码随想录算法训练营 ---第五十七天

今天是两道动态规划的经典题目。 第一题&#xff1a; 简介&#xff1a; 做了今天的题目我有了新的理解&#xff0c;我觉得过去我过于注重对于二维数组的理解&#xff0c;忽略了对dp数组i 和 j 的含义的理解。 动态规划五部曲&#xff1a; 1.确定dp数组的含义 本题我们将i …

git: 修改commit的comment

1. 修改最后一次commit的comment git commit --amend输入i进入编辑模式&#xff0c;修改后&#xff0c;Esc退出编辑模式&#xff0c;输入:wq!保存并退出 2. 修改历史的某个commit的comment 在修改前&#xff0c;先保证没有未提交的更改&#xff0c;如果有&#xff0c;需要co…

什么是https加密协议?

什么是https加密协议 HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是一种用于在计算机网络上安全传输数据的通信协议。它是HTTP的安全版本&#xff0c;通过使用加密和身份验证机制来保护数据传输的安全性和完整性。HTTPS使用SSL&#xff08;Secure Socke…

cuda驱动安装

cuda驱动安装失败 You do not appear to have libc header files installed on your system. Please install your distributions libc development package. ok,我来安装libc sudo apt-get install libc6-dev build-essential 失败 libc6-dev : 依赖: libc6 ( 2…

vue使用vue-router路由控件

vue-router是官方路由控件&#xff0c;但官网竟然没有该路由的使用方法啊&#xff0c;只有单页面的简单示例&#xff0c;引用的是网页js模式&#xff0c;不是vue的引用模式啊。 {"name": "vue01","private": true,"version": "0…

艾泊宇产品战略:低价的战争:阿里、京东、拼多多的终局推演

导读 这个双十一&#xff0c;是一场三大巨头的低价战争。 而如今双十二快到了&#xff0c;他们的低价战争还会继续吗&#xff1f; 阿里要做“全网最低价”&#xff0c;京东要做”真便宜 闭眼买“&#xff0c;拼多多则是“天天11.11&#xff0c;天天真低价” 阿里、京东作为…

面试操作系统八股文五问五答第一期

面试操作系统八股文五问五答第一期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1.死锁产生的条件 1.互斥条件&#xff0c;即当资源被一个线程使用&#xff08;…

流畅的python--小技巧总结

对于百万级以上数据的读写效率优化 在Python中&#xff0c;我们可以通过array模块来方便地创建和操作数组&#xff0c;array模块提供了性能优异的数组操作方法&#xff0c;可以使我们的代码更加高效。同时&#xff0c;Python也提供了读写二进制文件和普通文本文件的方法&#…

Rename--CAM在checkpoint恢复上的流程与优势

参考自&#xff1a;计算机体系结构-寄存器重命名 - 知乎 (zhihu.com) 这里的重点在红色部分描述上&#xff0c;也是容易想不通的地方&#xff1b; 在SRAM方法中要恢复映射表状态&#xff0c;需要事先把分支指令来临时刻的映射表全份拷贝下来&#xff0c;然后在恢复时把备份复制…

Linux 环境下,jdbc连接mysql问题

1. 下载MySQL的JDBC驱动&#xff1a; 从MySQL官网下载最新的MySQL Connector/J&#xff0c;并将其解压到某个目录&#xff0c;比如/usr/local/mysql/。 2. 将JDBC驱动添加到类路径&#xff1a; 将JDBC驱动添加到类路径&#xff0c;可以使用以下命令&#xff1a; export CLA…