Vue中的Props(不可变状态)


Posted in Javascript onSeptember 29, 2018

组件接受的选项大部分与Vue实例一样,而选项props是组件中非常重要的一个选项。在 Vue 中,父子组件的关系可以总结为 props down, events up。父组件通过 props 向下传递数据给子组件,子组件通过 events 给父组件发送消息。接下来通过本文给大家介绍Vue中Props,一起看看吧!

Vue中的Props(不可变状态)

单向数据流

所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解。

额外的,每次父级组件发生更新时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。

问题

下面简要说一下上面发生的警告现象,或许大多数人都遇到过.

使用场景

父组件

<BackLogModal :isModalOpen="isModalOpen" @closeModal="handleCloseModal">
</BackLogModal>

  • BackLogModal为一个弹窗组件,通过isModalOpen决定弹窗的开闭状态
  • 传入的isModalOpen是父组件的一个变量,类型为boolean
  • closeModal监听子组件派发的自定义事件closeModal

子组件

// 使用了typescript
export default class BackLogModal extends Vue {
  @Prop()
  private isModalOpen: boolean;

  private handleConfirm(): void {
    this.$Message.info('Clicked ok');
    this.$emit('closeModal');
  }

  private handleClose(): void {
    this.$Message.info('Clicked cancal');
    this.$emit('closeModal');
  }
}
  • 通过@Prop()注解获取父组件传递过来的isModalOpen属性
  • 页面 通过v-model与属性isModalOpen进行绑定
  • 由于弹窗组件在关闭时会自动设置isModalOpen的值为false,这里直接修改的就是父组件传入的isModalOpen属性,由于props属性是单向数据流,具有不可变状态,这是页面就会抛出警告

解决问题

export default class BackLogModal extends Vue {
  private isOpen: boolean = false;

  @Prop()
  private isModalOpen: boolean;

  @Watch('isModalOpen')
  private watchModalOpen(newVal: boolean, oldVal: boolean) {
    console.log(newVal, oldVal);
    if (newVal !== oldVal) {
      this.isOpen = newVal;
    }
  }

  private handleConfirm(): void {
    this.$Message.info('Clicked ok');
    this.$emit('closeModal');
  }

  private handleClose(): void {
    this.$Message.info('Clicked cancal');
    this.$emit('closeModal');
  }
}
  • 定义一个子组件私有变量isOpen与页面弹窗就行绑定
  • 使用@Watch('isModalOpen')监听父组件传入的isModalOpen属性,一旦值发生改变,便更新本地变量isOpen,确保弹窗的正常的打开与关闭

以上所述是小编给大家介绍的Vue中的Props(不可变状态),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript基本概念初级讲解论坛贴的学习记录
Feb 22 Javascript
Javascript Jquery 遍历Json的实现代码
Mar 31 Javascript
js保存当前路径(cookies记录)
Dec 14 Javascript
js select option对象小结
Dec 20 Javascript
javascript 自定义回调函数示例代码
Sep 26 Javascript
vue.js在标签属性中插入变量参数的方法
Mar 06 Javascript
jQuery移动端跑马灯抽奖特效升级版(抽奖概率固定)实现方法
Jan 18 jQuery
Vue事件处理原理及过程详解
Mar 11 Javascript
Selenium执行Javascript脚本参数及返回值过程详解
Apr 01 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
Jun 25 Javascript
解决nuxt 自定义全局方法,全局属性,全局变量的问题
Nov 05 Javascript
VUE使用draggable实现组件拖拽
Apr 06 Vue.js
vue动态删除从数据库倒入列表的某一条方法
Sep 29 #Javascript
使用vue根据状态添加列表数据和删除列表数据的实例
Sep 29 #Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
Sep 29 #Javascript
原生JS实现旋转轮播图+文字内容切换效果【附源码】
Sep 29 #Javascript
使用 Node.js 实现图片的动态裁切及算法实例代码详解
Sep 29 #Javascript
使用electron将vue-cli项目打包成exe的方法
Sep 29 #Javascript
脚手架vue-cli工程webpack的作用和特点
Sep 29 #Javascript
You might like
手把手教你使用DedeCms V3的在线采集图文教程
2007/04/03 PHP
关于页面优化和伪静态
2009/10/11 PHP
PHP 获取文件权限函数介绍
2013/07/11 PHP
php实现httpRequest的方法
2015/03/13 PHP
PHP随机数 C扩展随机数
2016/05/04 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
2016/12/14 PHP
php中curl和soap方式请求服务超时问题的解决
2018/06/11 PHP
javascript 面向对象全新理练之数据的封装
2009/12/03 Javascript
jQuery EasyUI API 中文文档 - Spinner微调器使用
2011/10/21 Javascript
js 绑定键盘鼠标事件示例代码
2014/02/12 Javascript
jQuery使用之设置元素样式用法实例
2015/01/19 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
2015/06/05 Javascript
AngularJS+Node.js实现在线聊天室
2015/08/28 Javascript
js仿3366小游戏选字游戏
2016/04/14 Javascript
js中的eval()函数把含有转义字符的字符串转换成Object对象的方法
2016/12/02 Javascript
详解小程序不同页面之间通讯的解决方案
2018/11/23 Javascript
如何配置vue.config.js 处理static文件夹下的静态文件
2020/06/19 Javascript
使用paramiko远程执行命令、下发文件的实例
2017/10/01 Python
Django中针对基于类的视图添加csrf_exempt实例代码
2018/02/11 Python
python实现词法分析器
2019/01/31 Python
python滑块验证码的破解实现
2019/11/10 Python
Python编程快速上手——选择性拷贝操作案例分析
2020/02/28 Python
python实现拼接图片
2020/03/23 Python
python中for in的用法详解
2020/04/17 Python
使用html5 canvas 画时钟代码实例分享
2015/11/11 HTML / CSS
皇家阿尔伯特瓷器美国官网:Royal Albert美国
2020/02/16 全球购物
物业工作计划书
2014/01/10 职场文书
优秀士兵先进事迹
2014/02/06 职场文书
教师节促销方案
2014/03/22 职场文书
网吧消防安全责任书
2014/07/29 职场文书
干部作风建设工作总结
2014/10/29 职场文书
公文写作指导之倡议书!
2019/07/03 职场文书
创业计划书之甜品店
2019/09/18 职场文书
Java 数组内置函数toArray详解
2021/06/28 Java/Android
MySQL query_cache_type 参数与使用详解
2021/07/01 MySQL
关于MySQL临时表为什么可以重名的问题
2022/03/22 MySQL