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中统计Textarea字数并提示还能输入的字符
Jun 10 Javascript
jQuery往textarea中光标所在位置插入文本的方法
Jun 26 Javascript
JavaScript的jQuery库中ready方法的学习教程
Aug 14 Javascript
获取IE浏览器Cookie信息的方法
Jan 23 Javascript
JS图片预加载插件详解
Jun 21 Javascript
javascript简写常用的12个技巧(可以大大减少你的js代码量)
Mar 28 Javascript
js获取html页面代码中图片地址的实现代码
Mar 05 Javascript
浅谈使用mpvue开发小程序需要注意和了解的知识点
May 23 Javascript
js遍历添加栏目类添加css 再点击其它删除css【推荐】
Jun 12 Javascript
vue实现tab栏点击高亮效果
Aug 19 Javascript
design vue 表格开启列排序的操作
Oct 28 Javascript
React实现todolist功能
Dec 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
php解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
php的array数组和使用实例简明教程(容易理解)
2014/03/20 PHP
PHP面向对象程序设计之接口用法
2014/08/20 PHP
php 中奖概率算法实现代码
2017/01/25 PHP
laravel-admin 在列表页添加自定义按钮的例子
2019/09/30 PHP
传智播客学习之JavaScript基础篇
2009/11/13 Javascript
js chrome浏览器判断代码
2010/03/28 Javascript
js新闻滚动 js如何实现新闻滚动效果
2013/01/07 Javascript
优化Jquery,提升网页加载速度
2013/11/14 Javascript
jquery slibings选取同级其他元素的实现代码
2013/11/15 Javascript
JavaScript学习笔记之Function对象
2015/01/22 Javascript
jQuery.extend 函数及用法详细
2015/09/06 Javascript
Bootstrap3学习笔记(三)之表格
2016/05/20 Javascript
Vue.js搭建移动端购物车界面
2020/06/28 Javascript
使用Bootstrap4 + Vue2实现分页查询的示例代码
2017/12/21 Javascript
JS严格模式知识点总结
2018/02/27 Javascript
代码实例ajax实现点击加载更多数据图片
2018/10/12 Javascript
基于Vue el-autocomplete 实现类似百度搜索框功能
2019/10/25 Javascript
原生javascript如何实现共享onload事件
2020/07/03 Javascript
Python操作列表之List.insert()方法的使用
2015/05/20 Python
Python实现好友全头像的拼接实例(推荐)
2017/06/24 Python
Python从函数参数类型引出元组实例分析
2019/05/28 Python
python实现发送form-data数据的方法详解
2019/09/27 Python
Python基于gevent实现文件字符串查找器
2020/08/11 Python
学生处主任岗位职责
2013/12/01 职场文书
解除合同协议书
2014/04/17 职场文书
学校先进集体事迹材料
2014/05/31 职场文书
党员三严三实对照检查材料
2014/10/13 职场文书
场地使用证明模板
2014/10/25 职场文书
2014年办公室文秘工作总结
2014/12/09 职场文书
司机个人年终总结
2015/03/03 职场文书
2015年圣诞节活动总结
2015/03/24 职场文书
二胎满月酒致辞
2015/07/29 职场文书
python中os.path.join()函数实例用法
2021/05/26 Python
如何解决goland,idea全局搜索快捷键失效问题
2022/04/03 Golang
聊聊CSS粘性定位sticky案例解析
2022/06/01 HTML / CSS