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开发包大全整理
Dec 22 Javascript
JavaScript 高级语法介绍
Jun 15 Javascript
Javascript学习笔记二 之 变量
Dec 15 Javascript
JS和jquery获取各种屏幕的宽度和高度的代码
Aug 02 Javascript
jQuery过滤特殊字符及JS字符串转为数字
May 26 Javascript
文件上传插件SWFUpload的使用指南
Nov 29 Javascript
详解基于Node.js的HTTP/2 Server实践
May 31 Javascript
在vue中给列表中的奇数行添加class的实现方法
Sep 05 Javascript
小程序获取周围IBeacon设备的方法
Oct 31 Javascript
如何优雅地取消 JavaScript 异步任务
Mar 22 Javascript
canvas多重阴影发光效果实现
Apr 20 Javascript
JavaScript实现九宫格拖拽效果
Jun 28 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
php4与php5的区别小结(配置异同)
2011/12/20 PHP
php购物车实现方法
2015/01/03 PHP
php+mysql实现无限级分类
2015/11/11 PHP
判断、添加和删除WordPress置顶文章的相关PHP函数小结
2015/12/10 PHP
hover的用法及live的用法介绍(鼠标悬停效果)
2013/03/29 Javascript
利用js动态添加删除table行的示例代码
2013/12/16 Javascript
利用iscroll4实现轮播图效果实例代码
2017/01/11 Javascript
基于HTML5+JS实现本地图片裁剪并上传功能
2017/03/24 Javascript
浅谈JavaScript作用域和闭包
2017/09/18 Javascript
Vue+webpack项目基础配置教程
2018/02/12 Javascript
tween.js缓动补间动画算法示例
2018/02/13 Javascript
简单谈谈javascript高级特性
2019/09/04 Javascript
压缩Vue.js打包后的体积方法总结(Vue.js打包后体积过大问题)
2020/02/03 Javascript
js实现简单图片拖拽效果
2021/02/22 Javascript
Python Tkinter模块实现时钟功能应用示例
2018/07/23 Python
Python 给某个文件名添加时间戳的方法
2018/10/16 Python
详解Django-auth-ldap 配置方法
2018/12/10 Python
Python使用APScheduler实现定时任务过程解析
2019/09/11 Python
python return逻辑判断表达式实现解析
2019/12/02 Python
关联、聚合(Aggregation)以及组合(Composition)的区别
2012/02/29 面试题
在数据文件自动增长时,自动增长是否会阻塞对文件的更新
2014/05/01 面试题
毕业生自荐书
2014/02/03 职场文书
教师节促销方案
2014/03/22 职场文书
社会调查研究计划书
2014/05/01 职场文书
机房搬迁方案
2014/05/01 职场文书
保护环境建议书400字
2014/05/13 职场文书
学习张林森心得体会
2014/09/10 职场文书
党员创先争优心得体会
2014/09/11 职场文书
不遵守课堂纪律的检讨书
2014/09/24 职场文书
考试作弊检讨书1000字(5篇)
2014/10/19 职场文书
党政领导班子群众路线对照检查材料
2014/10/26 职场文书
2014年环保局工作总结
2014/12/11 职场文书
质量保证书格式
2015/02/27 职场文书
2016年基层党支部书记公开承诺书
2016/03/25 职场文书
php中pcntl_fork详解
2021/04/01 PHP
python Tkinter的简单入门教程
2021/04/11 Python