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 相关文章推荐
学习ExtJS fit布局使用说明
Oct 08 Javascript
JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
Dec 31 Javascript
微信中一些常用的js方法汇总
Mar 12 Javascript
js实现仿京东2级菜单效果(带延时功能)
Aug 27 Javascript
jQuery Collapse1.1.0折叠插件简单使用
Aug 28 jQuery
详解Web使用webpack构建前端项目
Sep 23 Javascript
如何在js代码中消灭for循环实例详解
Jul 29 Javascript
vue 中基于html5 drag drap的拖放效果案例分析
Nov 01 Javascript
微信小程序时间轴实现方法示例
Jan 14 Javascript
Angular8 Http拦截器简单使用教程
Aug 20 Javascript
关于vue项目中搜索节流的实现代码
Sep 17 Javascript
vue搜索页开发实例代码详解(热门搜索,历史搜索,淘宝接口演示)
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
用libTemplate实现静态网页的生成
2006/10/09 PHP
如何提高MYSQL数据库的查询统计速度 select 索引应用
2007/04/11 PHP
php学习之function的用法
2012/07/14 PHP
php中的路径问题与set_include_path使用介绍
2014/02/11 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
2017/03/01 PHP
jquery中$.post()方法的简单实例
2014/02/04 Javascript
JavaScript实现点击文字切换登录窗口的方法
2015/05/11 Javascript
JavaScript模块化开发之SeaJS
2015/12/13 Javascript
利用jQuery中的ajax分页实现代码
2016/02/25 Javascript
快速掌握Node.js中setTimeout和setInterval的使用方法
2016/03/21 Javascript
jquery动态切换背景图片的简单实现方法
2016/05/14 Javascript
Bootstrap零基础入门教程(二)
2016/07/18 Javascript
jquery siblings获取同辈元素用法实例分析
2016/07/25 Javascript
js实现String.Fomat的实例代码
2016/09/02 Javascript
利用JQuery阻止事件冒泡
2016/12/01 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
2017/02/16 Javascript
javaScript实现鼠标在文字上悬浮时弹出悬浮层效果
2020/04/12 Javascript
js中时间格式化的几种方法
2018/07/22 Javascript
基于vue-cli npm run build之后vendor.js文件过大的解决方法
2018/09/27 Javascript
在vue中v-bind使用三目运算符绑定class的实例
2018/09/29 Javascript
js判断复选框是否选中的方法示例【基于jQuery】
2019/10/10 jQuery
JavaScript this在函数中的指向及实例详解
2019/10/14 Javascript
JS+html5实现异步上传图片显示上传文件进度条功能示例
2019/11/09 Javascript
vue 中的 render 函数作用详解
2020/02/28 Javascript
让Vue响应Map或Set的变化操作
2020/11/11 Javascript
python变量不能以数字打头详解
2016/07/06 Python
Python使用sorted排序的方法小结
2017/07/28 Python
python 函数传参之传值还是传引用的分析
2017/09/07 Python
Python通过Django实现用户注册和邮箱验证功能代码
2017/12/11 Python
python读写LMDB文件的方法
2018/07/02 Python
python七夕浪漫表白源码
2019/04/05 Python
浅析Python3 pip换源问题
2020/01/06 Python
python应用Axes3D绘图(批量梯度下降算法)
2020/03/25 Python
完美解决python针对hdfs上传和下载的问题
2020/06/05 Python
学雷锋演讲稿汇总
2014/05/10 职场文书
大学生旷课检讨书1000字
2015/02/19 职场文书