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 相关文章推荐
jquery怎样实现ajax联动框(二)
Mar 08 Javascript
js为鼠标添加右击事件防止默认的右击菜单弹出
Jul 29 Javascript
js、jquery图片动画、动态切换示例代码
Jun 03 Javascript
在React框架中实现一些AngularJS中ng指令的例子
Mar 06 Javascript
JavaScript数组去重的两种方法推荐
Apr 05 Javascript
详解Angular的内置过滤器和自定义过滤器【推荐】
Dec 26 Javascript
Angular.JS实现无限级的联动菜单(使用demo)
Feb 08 Javascript
Vue2.x中的父组件传递数据至子组件的方法
May 01 Javascript
vue.js框架实现表单排序和分页效果
Aug 09 Javascript
vue-router动态设置页面title的实例讲解
Aug 30 Javascript
Electron中实现大文件上传和断点续传功能
Oct 28 Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
Apr 11 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使用header()输出图片缓存实例
2014/12/09 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
PHP CURL使用详解
2019/03/21 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
2019/08/03 PHP
关于B/S判断浏览器断开的问题讨论
2008/10/29 Javascript
jQuery 操作option的实现代码
2011/03/03 Javascript
详解Node.js中的事件机制
2016/09/22 Javascript
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
详解vue填坑之解决部分浏览器不支持pushState方法
2018/07/12 Javascript
elementUI select组件value值注意事项详解
2019/05/29 Javascript
Vue中img的src是动态渲染时不显示的解决
2019/11/14 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
2020/04/22 Javascript
jQuery实现带进度条的轮播图
2020/09/13 jQuery
[01:54]TI珍贵瞬间系列(五):压力
2020/08/29 DOTA
跟老齐学Python之通过Python连接数据库
2014/10/28 Python
Python函数式编程指南(三):迭代器详解
2015/06/24 Python
Django框架中render_to_response()函数的使用方法
2015/07/16 Python
Python迭代和迭代器详解
2016/11/10 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
Python中交换两个元素的实现方法
2018/06/29 Python
Numpy 改变数组维度的几种方法小结
2018/08/02 Python
Python判断对象是否为文件对象(file object)的三种方法示例
2019/04/26 Python
pyqt5 实现多窗口跳转的方法
2019/06/19 Python
django-allauth入门学习和使用详解
2019/07/03 Python
使用python分析统计自己微信朋友的信息
2019/07/19 Python
Python多线程爬取豆瓣影评API接口
2019/10/22 Python
Pytorch 实现权重初始化
2019/12/31 Python
Python pip配置国内源的方法
2020/02/14 Python
Python使用grequests并发发送请求的示例
2020/11/05 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
2021/01/21 Python
德国游戏机商店:Konsolenkost
2019/12/08 全球购物
简述安装Slackware Linux系统的过程
2012/05/08 面试题
市场营销专业推荐信
2013/11/03 职场文书
学子宴答谢词
2014/01/25 职场文书
大学生个人实习的自我评价
2014/02/15 职场文书
幼儿园大班教师个人工作总结
2015/02/05 职场文书