位置: IT常识 - 正文

【VUE前进之路】使用数据代理,计算属性与监视属性的妙用(vue前进后退)

编辑:rootadmin
【VUE前进之路】使用数据代理,计算属性与监视属性的妙用 1.数据代理1.1什么是数据代理

推荐整理分享【VUE前进之路】使用数据代理,计算属性与监视属性的妙用(vue前进后退),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue前端项目实例,vue进阶,vue前进后退,vue前段,vue前进后退,vue前端开发教程,vue前端开发教程,vue前段,内容如对您有帮助,希望把文章链接给更多的朋友!

通过一个对象代理对另一个对象中属性的操作(读/写) 1.Vue中的数据代理:通过vm对象来代理data对象中属性的操作(读/写) 2.Vue中数据代理的好处:更加方便的操作data中的数据 3.基本原理:通过0bject . defineProperty( )把data对象中所有属性添加到vm上。为每一一个 添加到vm上的属性,都指定个getter/setter。在getter/setter内部去操作(读/写) data中对应的属性。简单来说就是把data的属性全部都复制给了_data了一份,可以让vm进行使用

1.2了解使用数据代理

Object.defineProperty方法(给对象添加属性方法的一个方法)这个方法会传入三个参数分别是 对象名,属性名,配置项 在这里我们可以看到,这个颜色稍微的优点变化(这里就是使用Object.defineProperty方法进行添加的,这里的age是不可以进行枚举的,即不参与遍历)

<script> let person = { name:'大熊' sex:'男', } Object.defineProperty(person,'address',{ value:18 }) console.log(person); </script>

这里可以使用Object.keys()进行验证一下(并没有age这个属性)(可以看到依然没有age) 当然也可以使用for… in进行遍历一下这个对象 如和才能让他可以被枚举呢?(这里就使用 enumerable 只要将它的值改为true即可)enumerable: true (是否可以被枚举)writable:true(是否可以修改属性)configurable: true(是否可以删除改属性)这四个基本配置项的内容(包括value)他们的默认值为false

<script> let person = { name:'大熊', sex:'女', } Object.defineProperty(person,'address',{ value:18 }) for(k in person){ console.log(k); } console.log(Object.keys(person)); console.log(person); </script>

那问题来了,如何进行对数据的读取和修改呢?这里用到了两个方法,get和set 当有人读取person的age属性时,get函 数(getter)就会被调用,且返回值就是age值 当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的具值

<script> let number = 19; let person = { name: '大熊', sex: '女', } Object.defineProperty(person, 'address', { get() { console.log('age属性已被读取'); return number; }, set(value) { console.log('age属性已被修改'); number = value } }) </script>2. 事件处理

1.使用v-on:xxx或@xxx绑定事件,其中xxx是事件名 2.事件的回调需要配置在methods对象中,最终会在vm上 3.methods中配置的函数,不可以使用箭头函数,否则this就不是vm了而是window 4.methods中配置的函数,都是被Vue所管理的函数,this的指向是vm或组件实例对象5.@click="demo"和@click="demo"效果一致,但后者可以传参 注:不要把事件回调方法data里,虽然可以实现相同的功能,但是这样会给增加一个数据代理,给一个方法添加数据代理是没有意义的

<div id="user"> <h1>{{name}}吃饭了吗?</h1> <button v-on:click="showPage($event,18)">点击提示</button> <!-- 第一个参数是event,所以下面的参数顺序要和这里一致 --> </div> <script> let vm = new Vue({ el: '#user', data: { name: '山鱼', }, methods: { // 在这里配置各种事件回调 showPage(event, number) { alert('山鱼吃饭了!') console.log(number); } } }) </script>2.1事件修饰符【VUE前进之路】使用数据代理,计算属性与监视属性的妙用(vue前进后退)

1.prevent:阻止默认事件(常用) 2.stop: 阻止事件冒泡(常用) 3.once:事件只触发一次(常用) 4.capture: 使用事件的捕获模式 5.self: 只有event.target是当前操作的元素是才触发事件; 6.passive: 事件的默认行为立即执行,无需等待事件回调执行完毕;

<div id="user"> <h1>欢迎来到{{name}}的小屋</h1> <!-- 1,阻止默认事件 --> <a href="http://baidu.com" @click.prevent = "showInfo">点我不跳转</a> <!-- 2,阻止事件冒泡 --> <div class="one" @click = 'showInfo'> <button @click.stop = 'showInfo'>点我</button> </div> <!-- 3,事件只触发一次 --> <button @click.once = 'showInfo'>只能点一次</button> </div> <script> const vm = new Vue({ el:'#user', data:{ name:'大熊', }, methods:{ showInfo(e){ alert('同学,慢走!') } } }) </script>2.2键盘事件

常用的按键别名 回车=> enter,删除=>delete(捕获“删除”和“退格”键),退出=> esc,空格=> space,上=>up,下=> down,左=> left,右=> right

特殊的按键别名 1.换行=> tab (特殊,必须配合keydown使用) 2.系统修饰键 ctrl,alt,shift,meta(meta就是win键也就是windows徽标) 注: (1).配合keyup使用:按下修饰键的同时,再按下其他键,随后释放其他键,事件才被触发。 (2).配合keydown使用:正常触发事件。

<div class="user"> <h1>欢迎加入{{uname}}</h1> <!--.enter 就是按下回车触发事件,也成为按键别名--> <input type="text" placeholder="按下回车提示输入" @keyup.enter = 'showInfo'> <!--删除 del --> <input type="text" placeholder="按下del提示输入" @keyup.delete = 'showInfo'> <!-- 退出esc --> <input type="text" placeholder="按下ESC提示输入" @keyup.esc = 'showInfo'> <!-- 特殊按键别名 --> <input type="text" placeholder="一同按下ctrl+‘其他按键’并释放提示输入" @keyup.ctrl = 'showInfo'> <!-- 自定义别名 --> <input type="text" placeholder="按下回车提示输入" @keyup.huiche = 'showInfo'> </div> <script> // 也可以自定义按键别名 Vue.config.keyCodes.huiche = 13; const vm = new Vue({ el:'.user', data:{ uname:'山鱼社区' }, methods:{ showInfo(e){ console.log(e.target.value); } } }) </script>3.计算属性

1.定义: 要用的属性不存在,要通过已有属性计算得来。 2.原理:底层借助了objcet . defineproperty方法提供的getter和Isetter. 3. get函数什么时候执行? (1).初次读取时会执行一次。 (2).当依赖的数据发生改变时会被再次调用。 4.优势:与jmethods 实现相比,内部有缓存机制(复用),效率更高,调试方便。 5.注: 1.计算属性最终会出现在:vm上,直接读取使用即可。 2.如果i计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发发生变化 3.计算属性内不能够开启异步任务(如:定时器)

<body> <!-- 容器 --> <div class="user"> 姓:<input type="text" v-model="firstName"><br> 名:<input type="text" v-model="lastName"><br> 姓名:<span>{{fullName}}</span> </div> <script> const vm = new Vue({ el: '.user', data: { firstName: '李', lastName: '四' }, // 计算属性 computed: { fullName: { // 当ful1Name被读取时,get就会被调用,且返回值就作为fullName的值,而且get有个缓存效果 // 这里的get在初次读取fullName时会被调用,在所依赖的数据进行改变时也会调用 // 这里所依赖的数据有俩分别是firstName和lastName get() { return this.firstName +"-" +this.lastName }, // 当fullName被修改时调用 set(value){ console.log('set被hi行'); const arr = value. split('-'); this.firstName = arr[0]; this.lastName = arr[1]; } } } }) </script></body>

简写计算属性(前提是只用到get的时候可以简写)

4.侦听属性

监视属性watch: 1.当被监视的属性变化时,回调函数自动调用,进行相关操作 2.监视的属性必须存在,I才能进行监视! ! 3.监视的两种写法: (1) . new Vue时传入watch配置 (2) .通过vm. $watch监视

<body> <div class="user"> <h1>今天我很{{info}}</h1> <button @click='changeMood'>点击切换心情</button> </div> <script> new Vue({ el: '.user', data: { mood: true }, computed: { info() { return this.mood ? '开心' : '不开心' }, }, methods: { changeMood() { this.mood = !this.mood } }, watch: { // 被监视的是谁 mood: { immediate: true,// 初始化时 让handler调用一次 // handler有俩参数分别是修改前的值和修改后的值 handler(newValue, oldValue) { console.log('mood被修改了', newValue, oldValue); } }, // 这个监视属性也可以监视计算属性 info: { immediate: true,// 初识化时 让handler调用一次 // handler有俩参数分别是修改前的值和修改后的值 handler(newValue, oldValue) { console.log('info被修改了', newValue, oldValue); } }, } }) // 也可以用vm.$watch进行监视 =》vm.$watch(监视对象,如何监视) vm.$watch('mood', { immediate: true,// 初识化时 让handler调用一次 // handler有俩参数分别是修改前的值和修改后的值 handler(newValue, oldValue) { console.log('info被修改了', newValue, oldValue); } }) </script></body>4.1深度监视

深度监视 ①Vue中的watch默认不监测对象内部值的改变 ②配置deep:true可以监测对象内部值改变 备注: ①Vue自身可以监测对象内部值的改变,但Vue提供的watch默认不可以 ②使用watch时根据数据的具体结构,决定是否采用深度监视

4.2监视属性简写

简写(但是不能配置immediate:true,deep:true)

watch: { // 完整写法 // mood: { // deep:true // handler(newValue, oldValue) { // console.log("mood被修改", newValue, oldValue); // } // } // 简写 mood(newValue, oldValue) { console.log('mood被修改', newValue, oldValue); } } }) // 正常写法 vm.$watch('mood',{ immediate:true, deep:true, handler(newValue, oldValue) { console.log('mood被修改', newValue, oldValue); } }) // 简写 vm.$watch('mood',function(newValue, oldValue){ console.log('mood被修改', newValue, oldValue); })4.3computed & watch之间的区别

1.computed能完成的功能,watch 都可以完成。 2.watch能完成的功能,computed不一定能完成,例如: watch可以进行异步操作。 3.两个重要的小原则: ①所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm或组件实例对象。 ②所有不被Vue所管理的函数(定时器的回调函数、ajax的回调函数等),最好写成箭头函数,这样this的指向才是vm或组件实例对象。

5.写在最后

大家好我是大熊🐻 一个学前端的旅行者也是一个前进的创作者,奋进再这篇土地,希望能和您相遇 ✍善于利用零星时间的人,才会做出更大的成绩来。——华罗庚

本文链接地址:https://www.jiuchutong.com/zhishi/299277.html 转载请保留说明!

上一篇:Vue 3 介绍

下一篇:Vue实现登录功能全套详解(含封装axios)(vue实现登陆)

  • 华为体验店和专卖店有什么区别(华为体验店和专卖店有什么区别,专卖店手机真吗)

    华为体验店和专卖店有什么区别(华为体验店和专卖店有什么区别,专卖店手机真吗)

  • 斗鱼有mac版吗(斗鱼有mac版本吗)

    斗鱼有mac版吗(斗鱼有mac版本吗)

  • 华为p40微信指纹支付怎么设置(华为p40微信指纹支付在哪里设置)

    华为p40微信指纹支付怎么设置(华为p40微信指纹支付在哪里设置)

  • 关机键变成siri怎么取消(关机键变成音量键)

    关机键变成siri怎么取消(关机键变成音量键)

  • 内存或磁盘不足,word无法显示请求字体(内存或磁盘不足,excel无法再次打开或保存任何文档)

    内存或磁盘不足,word无法显示请求字体(内存或磁盘不足,excel无法再次打开或保存任何文档)

  • 微信过期了没下载过能恢复吗(微信过期没下载的图片怎么恢复)

    微信过期了没下载过能恢复吗(微信过期没下载的图片怎么恢复)

  • 微博快转什么意思(微博的快转是什么意思)

    微博快转什么意思(微博的快转是什么意思)

  • 密码的特殊字符指什么(密码的特殊字符有哪些)

    密码的特殊字符指什么(密码的特殊字符有哪些)

  • 收款二维码怎么弄(收款二维码怎么打印)

    收款二维码怎么弄(收款二维码怎么打印)

  • 资源管理器中不能对文件进行什么操作(资源管理器中不能按什么方式排列图标)

    资源管理器中不能对文件进行什么操作(资源管理器中不能按什么方式排列图标)

  • 光猫灯怎么闪才是正常的(光猫灯闪烁怎么回事)

    光猫灯怎么闪才是正常的(光猫灯闪烁怎么回事)

  • 蜂窝网络漫游是什么意思(蜂窝网络数据漫游应该打开嘛)

    蜂窝网络漫游是什么意思(蜂窝网络数据漫游应该打开嘛)

  • 蓝牙耳机能和充电盒一起充电吗(蓝牙耳机能充电一晚上吗)

    蓝牙耳机能和充电盒一起充电吗(蓝牙耳机能充电一晚上吗)

  • 戴尔g3键盘灯怎么打开(戴尔G3键盘灯怎么设置常亮)

    戴尔g3键盘灯怎么打开(戴尔G3键盘灯怎么设置常亮)

  • 苹果官网保修是什么意思(iphone官网保修期)

    苹果官网保修是什么意思(iphone官网保修期)

  • 双十一从几号开始(双十一是几号)

    双十一从几号开始(双十一是几号)

  • 转转怎么解绑实名认证(转转怎么解绑实名认证信息)

    转转怎么解绑实名认证(转转怎么解绑实名认证信息)

  • 微信刷脸支付怎么开通(微信刷脸支付怎么没有了)

    微信刷脸支付怎么开通(微信刷脸支付怎么没有了)

  • 2016089是哪款机子(型号2016051是什么手机)

    2016089是哪款机子(型号2016051是什么手机)

  • 腾讯大王卡能玩快手吗(腾讯大王卡能玩什么)

    腾讯大王卡能玩快手吗(腾讯大王卡能玩什么)

  • 华为手机自带日历在哪(华为手机自带日历怎么恢复)

    华为手机自带日历在哪(华为手机自带日历怎么恢复)

  • newtv怎么看同步电视台(newtv怎么搜台)

    newtv怎么看同步电视台(newtv怎么搜台)

  • 天天p图抠图怎么用(天天p图抠图怎么调整透明度)

    天天p图抠图怎么用(天天p图抠图怎么调整透明度)

  • paty模式是什么意思(pal模式)

    paty模式是什么意思(pal模式)

  • 小米手机在哪看步数(小米手机在哪看激活日期)

    小米手机在哪看步数(小米手机在哪看激活日期)

  • Windows11 ISO镜像提前泄露:微软彻底发飙 追查镜像下载网站(windows11iso镜像多久更新一次)

    Windows11 ISO镜像提前泄露:微软彻底发飙 追查镜像下载网站(windows11iso镜像多久更新一次)

  • 个人转让著作权免税吗
  • 丢失增值税发票已报税证明单怎么开
  • 固定资产累计折旧是什么科目
  • 会计能开收据吗?
  • 收到进项发票是什么凭证
  • 债券投资收益怎样计算
  • 审核通过的红字发票信息表可以撤销吗
  • 本月进项留抵会计分录
  • 增值税普票没有税率怎么回事
  • 企业承担的法律责任有哪些保险
  • 房产税按原值计算公式
  • 卖二手车
  • 法人存入现金的会计分录
  • 员工入股怎么分成
  • 其他应收款对方科目是啥
  • 处理报废的固定资产
  • 所有者权益科目编码
  • 利息算增值税吗
  • 收到原未计入应收项目的交易性金融资产的利息
  • 小规模企业如何
  • 过了认证期的发票怎么办
  • 国税网不能打印,怎么设置
  • 通用机打发票没写税额
  • 建筑装饰行业税负
  • 个体户没有进项票怎么开销项发票
  • 进口报关单保费
  • 带息商业汇票的利息分录?
  • 电脑中毒了怎么弄
  • 最新制作视频的软件
  • 存出投资款现金流量表选什么
  • 教育培训费能抵扣吗
  • 支付代账公司费用 怎么写凭证
  • mcappins.exe - mcappins进程是什么文件 什么意思.
  • 交暖气费可以开单位发票吗
  • 会计政策变更追溯调整为什么不影响所得税
  • 格林湖人
  • vue前端后端
  • 定期定额个体户超定额怎样申报
  • 携程首页
  • 2手房价格
  • 微信小程序游戏手游排行榜
  • php字符串比较函数怎么写
  • php字符串型数据的定义方式
  • 视同销售实物出资是否开专票吗
  • 如何扣除企业接单费用
  • python中如何创建文件
  • 向分支机构支付融资利息可以扣除吗?
  • 蔬菜和肉类是不是免税
  • 增值税电子普通发票和专票的区别
  • 个税跨月更正申报怎么做
  • 企业自产自用的产品需要缴纳增值税吗
  • sql server更新数据
  • 企业无力支付票据
  • 小微企业预缴所得税怎么填报
  • 会计中的明细科目是什么
  • 存货跌价准备如何影响利润
  • 净值怎么算?
  • 劳务收入是什么科目
  • 什么是利润表?其作用有哪些?
  • 上年未结转金额是什么意思
  • 自制半成品销售方案
  • 建筑升降机厂家
  • 工业企业发生的各项费用都应计入产品成本对不对
  • sql server删除重复数据保留一条
  • 老生常谈啥意思
  • vidaa 破解
  • windows8.1使用教程
  • centos安装软件教程
  • 电脑系统不重装怎么恢复原状
  • 电脑硬盘磁盘是什么材料
  • win8怎么关闭管理员用户
  • dos批处理命令大全
  • adobe骨骼动画
  • 页面模板排序
  • linux bash shell
  • material design app
  • 那些so 叼的android studio 插件
  • 纳税申报表如何看销售额
  • 社保和税局关联后还要申报吗
  • 进项发票勾选认证如何导出明细
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设