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 MVC 样式框架
Mar 24 Javascript
JavaScript动态修改背景颜色的方法
Apr 16 Javascript
javascript中利用柯里化函数实现bind方法
Apr 29 Javascript
如何防止INPUT按回车自动提交表单FORM
Dec 06 Javascript
javascript数组去重方法分析
Dec 15 Javascript
Bootstrap源码解读表单(2)
Dec 22 Javascript
完美解决input[type=number]无法显示非数字字符的问题
Feb 28 Javascript
jquery引入外部CDN 加载失败则引入本地jq库
May 23 jQuery
js中Array对象的常用遍历方法详解
Jan 17 Javascript
vuex actions异步修改状态的实例详解
Nov 06 Javascript
JavaScript数值类型知识汇总
Nov 17 Javascript
vue相同路由跳转强制刷新该路由组件操作
Aug 05 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在WinXP下IIS和Apache2服务器上的安装实例
2006/10/09 PHP
php下使用strpos需要注意 === 运算符
2010/07/17 PHP
wamp下修改mysql访问密码的解决方法
2013/05/07 PHP
thinkPHP模板中函数的使用方法示例
2016/11/30 PHP
PHP实现的数独求解问题示例
2017/04/18 PHP
phpStudy2016 配置多个域名期间遇到的问题小结
2017/10/19 PHP
判断用户的在线状态 onbeforeunload事件
2011/03/05 Javascript
根据邮箱的域名跳转到相应的登录页面的代码
2012/02/27 Javascript
通过Javascript创建一个选择文件的对话框代码
2012/06/16 Javascript
深入理解javascript学习笔记(一) 编写高质量代码
2012/08/09 Javascript
href下载文件根据id取url并下载
2014/05/28 Javascript
浅谈Javascript中的Function与Object
2015/01/26 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
2015/10/10 Javascript
JavaScript获取客户端IP的方法(新方法)
2016/03/11 Javascript
jQuery实现的简单百分比进度条效果示例
2016/08/01 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
2016/08/31 Javascript
微信小程序实现给循环列表添加点击样式实例
2017/04/26 Javascript
10个最优秀的Node.js MVC框架
2017/08/24 Javascript
vscode vue 文件模板的配置方法
2019/07/23 Javascript
在vue中使用防抖函数组件操作
2020/07/26 Javascript
解决vue下载后台传过来的乱码流的问题
2020/12/05 Vue.js
python实现对指定输入的字符串逆序输出的6种方法
2018/04/26 Python
有关Python的22个编程技巧
2018/08/29 Python
windows上安装python3教程以及环境变量配置详解
2019/07/18 Python
python做接口测试的必要性
2019/11/20 Python
Pytorch中Tensor与各种图像格式的相互转化详解
2019/12/26 Python
python:目标检测模型预测准确度计算方式(基于IoU)
2020/01/18 Python
Python性能分析工具py-spy原理用法解析
2020/07/27 Python
浅析关于Keras的安装(pycharm)和初步理解
2020/10/23 Python
CSS3按钮鼠标悬浮实现光圈效果源码
2016/09/11 HTML / CSS
中专自我鉴定
2014/02/05 职场文书
工伤事故赔偿协议书
2014/04/15 职场文书
和谐家庭演讲稿
2014/05/24 职场文书
canvas绘制折线路径动画实现
2021/05/12 Javascript
Python实现学生管理系统(面向对象版)
2021/06/24 Python
Linux安装apache服务器的配置过程
2021/11/27 Servers