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 相关文章推荐
游戏人文件夹程序 ver 4.03
Jul 14 Javascript
使用隐藏的new来创建对象
Mar 29 Javascript
JavaScript NaN和Infinity特殊值 [译]
Sep 20 Javascript
阻止子元素继承父元素事件具体思路及实现
May 02 Javascript
javascript获取鼠标点击元素对象(示例代码)
Dec 20 Javascript
JavaScript实现重置表单(reset)的方法
Apr 02 Javascript
bootstrap flask登录页面编写实例
Nov 01 Javascript
jQuery实现的鼠标响应缓冲动画效果示例
Feb 13 jQuery
vue组件开发之用户无限添加自定义填写表单的方法
Aug 28 Javascript
原生JS实现手动轮播图效果实例代码
Nov 22 Javascript
基于layui的下拉列表的数据回显方法
Sep 24 Javascript
JS使用正则表达式判断输入框失去焦点事件
Oct 16 Javascript
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
常用的php ADODB使用方法集锦
2008/03/25 PHP
php生成局部唯一识别码LUID的代码
2012/10/06 PHP
浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
2013/08/06 PHP
用PHP来计算某个目录大小的方法
2014/04/01 PHP
PHP安全的URL字符串base64编码和解码
2014/06/19 PHP
PHP实现将HTML5中Canvas图像保存到服务器的方法
2014/11/28 PHP
PHP中遍历数组的三种常用方法实例分析
2019/06/24 PHP
Javascript 设计模式(二) 闭包
2010/05/26 Javascript
script标签属性type与language使用选择
2012/12/02 Javascript
Extjs中TabPane如何嵌套在其他网页中实现思路及代码
2013/01/27 Javascript
javascript中[]和{}对象使用介绍
2013/03/20 Javascript
div模拟滚动条效果示例代码
2013/10/16 Javascript
JS之Date对象和获取系统当前时间详解
2014/01/13 Javascript
改变状态栏文字的js代码
2014/06/13 Javascript
node.js实现BigPipe详解
2014/12/05 Javascript
javascript中Date()函数在各浏览器中的显示效果
2015/06/18 Javascript
jQuery实现下拉框选择图片功能实例
2015/08/08 Javascript
jQuery获取file控件中图片的宽高与大小
2016/08/04 Javascript
js继承实现方法详解
2016/12/16 Javascript
jQuery.parseHTML() 函数详解
2017/01/09 Javascript
jquery实现图片放大点击切换
2017/06/06 jQuery
Python实现3行代码解简单的一元一次方程
2014/08/18 Python
Python多进程与服务器并发原理及用法实例分析
2018/08/21 Python
python  Django中的apps.py的目的是什么
2018/10/15 Python
python实现输入任意一个大写字母生成金字塔的示例
2019/10/27 Python
使用keras根据层名称来初始化网络
2020/05/21 Python
Python爬虫requests库多种用法实例
2020/05/28 Python
Python os库常用操作代码汇总
2020/11/03 Python
室内设计实习自我鉴定
2013/09/25 职场文书
学雷锋活动总结范文
2014/04/25 职场文书
单位活动策划方案
2014/08/17 职场文书
群众路线领导干部个人对照检查材料(集锦)
2014/09/23 职场文书
幼儿园大班教师个人总结
2015/02/05 职场文书
Linux安装Nginx步骤详解
2021/03/31 Servers
JS一分钟在github+Jekyll的博客中添加访问量功能的实现
2021/04/03 Javascript
详解vue身份认证管理和租户管理
2021/05/25 Vue.js