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 用原型继承来实现对象系统
Mar 22 Javascript
封装的原生javascript弹出层代码
Sep 24 Javascript
js中将具有数字属性名的对象转换为数组
Mar 06 Javascript
js验证模型自我实现的具体方法
Jun 21 Javascript
node.js中的events.emitter.listeners方法使用说明
Dec 10 Javascript
Java File类的常用方法总结
Mar 18 Javascript
非常酷炫的Bootstrap图片轮播动画
May 27 Javascript
jQuery解决$符号命名冲突
Jun 18 Javascript
基于JavaScript实现本地图片预览
Feb 08 Javascript
原生JS+CSS实现炫酷重力模拟弹跳系统的登录页面
Nov 01 Javascript
Vue iview-admin框架二级菜单改为三级菜单的方法
Jul 03 Javascript
Javascript中Math.max和Math.max.apply的区别和用法详解
Aug 24 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文件下载类
2006/12/06 PHP
php文字水印和php图片水印实现代码(二种加水印方法)
2013/12/25 PHP
php+memcache实现的网站在线人数统计代码
2014/07/04 PHP
php构造函数与析构函数
2016/04/23 PHP
PHP页面间传递值和保持值的方法
2016/08/24 PHP
tp5 实现列表数据根据状态排序
2019/10/18 PHP
location对象的属性和方法应用(解析URL)
2013/04/12 Javascript
js取值中form.all和不加all的区别介绍
2014/01/20 Javascript
JS控制表单提交的方法
2015/07/09 Javascript
深入理解AngularJS中的ng-bind-html指令和$sce服务
2016/09/08 Javascript
原生js实现倒计时--2018
2017/02/21 Javascript
基于jquery trigger函数无法触发a标签的两种解决方法
2018/01/06 jQuery
Javascript获取某个月的天数
2018/05/30 Javascript
用Node写一条配置环境的指令
2019/11/14 Javascript
taro小程序添加骨架屏的实现代码
2019/11/15 Javascript
Javascript实现html转pdf高清版(提高分辨率)
2020/02/19 Javascript
[50:29]2014 DOTA2华西杯精英邀请赛 5 24 DK VS iG
2014/05/26 DOTA
[01:12:53]完美世界DOTA2联赛PWL S2 Forest vs SZ 第一场 11.25
2020/11/26 DOTA
python单线程实现多个定时器示例
2014/03/30 Python
在Python的Django框架中用流响应生成CSV文件的教程
2015/05/02 Python
python实现自动解数独小程序
2019/01/21 Python
python多线程调用exit无法退出的解决方法
2019/02/18 Python
Django Form 实时从数据库中获取数据的操作方法
2019/07/25 Python
利用python-docx模块写批量生日邀请函
2019/08/26 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
2019/12/02 Python
Lenox官网:精美的瓷器&独特的礼品
2017/02/12 全球购物
捷克汽车配件和工具销售网站:TorriaCars
2018/02/26 全球购物
Elemis美国官网:英国的第一豪华护肤品牌
2018/03/15 全球购物
应聘美工求职信
2013/11/07 职场文书
致800米运动员广播稿(10篇)
2014/10/17 职场文书
2014年学习委员工作总结
2014/11/14 职场文书
义诊活动总结
2015/02/04 职场文书
php引用传递
2021/04/01 PHP
Pytest之测试命名规则的使用
2021/04/16 Python
用Python创建简易网站图文教程
2021/06/11 Python
鲲鹏 CentOS 7 安装Python3.7
2022/05/11 Servers