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 相关文章推荐
一个无限级XML绑定跨框架菜单(For IE)
Jan 27 Javascript
javascript 实现父窗口引用弹出窗口的值的脚本
Aug 07 Javascript
基于jQuery的实现简单的分页控件
Oct 10 Javascript
表格单元格交错着色实现思路及代码
Apr 01 Javascript
限制只能输入数字的实现代码
May 16 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
Jul 05 Javascript
微信小程序 网络API发起请求详解
Nov 09 Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
Jul 18 Javascript
详解如何使用微信小程序云函数发送短信验证码
Mar 13 Javascript
使用layui前端框架弹出form表单以及提交的示例
Oct 25 Javascript
利用js实现简易红绿灯
Oct 15 Javascript
vue element-ui中table合计指定列求和实例
Nov 02 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/10/09 PHP
详解关于php的xdebug配置(编辑器vscode)
2019/01/29 PHP
jquery 表格分页等操作实现代码(pagedown,pageup)
2010/04/11 Javascript
简单几行JS Code实现IE邮件转发新浪微博
2013/07/03 Javascript
jQuery Ajax使用实例
2015/04/16 Javascript
JS三级可折叠菜单实现方法
2016/02/29 Javascript
在web中js实现类似excel的表格控件
2016/09/01 Javascript
Vue2.0基于vue-cli+webpack同级组件之间的通信教程(推荐)
2017/09/14 Javascript
Angular 4中如何显示内容的CSS样式示例代码
2017/11/06 Javascript
Vue 2.0学习笔记之使用$refs访问Vue中的DOM
2017/12/19 Javascript
js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
2020/03/02 Javascript
深入探究Python中变量的拷贝和作用域问题
2015/05/05 Python
Python中splitlines()方法的使用简介
2015/05/20 Python
Python图片裁剪实例代码(如头像裁剪)
2017/06/21 Python
详解Python核心编程中的浅拷贝与深拷贝
2018/01/07 Python
python中kmeans聚类实现代码
2018/02/23 Python
详解Python读取yaml文件多层菜单
2019/03/23 Python
使用python os模块复制文件到指定文件夹的方法
2019/08/22 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
2019/12/19 Python
为什么说python适合写爬虫
2020/06/11 Python
python打包多类型文件的操作方法
2020/09/21 Python
详解python百行有效代码实现汉诺塔小游戏(简约版)
2020/10/30 Python
浅谈CSS3动画的回调处理
2016/07/21 HTML / CSS
12个不为大家熟知的HTML5设计小技巧
2016/06/02 HTML / CSS
汇集了世界上最好的天然和有机美容产品:LoveLula
2018/02/05 全球购物
英国天然抗衰老护肤品品牌:Nakin Skin Care
2019/04/16 全球购物
什么是索引指示器
2012/08/20 面试题
高中运动会广播稿
2015/08/19 职场文书
2016新年问候语大全
2015/11/11 职场文书
叶县这家生产军用电台的兵工厂,人称“四机部”,走出一上将
2022/02/18 无线电
关于Nginx中虚拟主机的一些冷门知识小结
2022/03/03 Servers
淡雅古典唯美少女娇媚宁静迷人写真
2022/03/21 杂记
Redis如何实现验证码发送 以及限制每日发送次数
2022/04/18 Redis
开发微信小程序之WXSS样式教程
2022/04/18 HTML / CSS
Python使用DFA算法过滤内容敏感词
2022/04/22 Python
Win11 Dev 预览版25174.1000发布 (附更新修复内容汇总)
2022/08/05 数码科技