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 异步调用框架 (Part 6 - 实例 &amp; 模式)
Aug 04 Javascript
客户端 使用XML DOM加载json数据的方法
Sep 28 Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
Aug 24 Javascript
jQuery插件开发全解析
Oct 10 Javascript
jQuery实现为图片添加镜头放大效果的方法
Jun 25 Javascript
JS实现双击屏幕滚动效果代码
Oct 28 Javascript
javascript正则表达式之分组概念与用法实例
Jun 16 Javascript
jQuery弹出窗口打开链接的实现代码
Dec 24 Javascript
Angular5集成eventbus的示例代码
Jul 19 Javascript
vue实现新闻展示页的步骤详解
Apr 11 Javascript
js实现中文实时时钟
Jan 15 Javascript
微信小程序中data-key属性之数据传输(经验总结)
Aug 22 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
完善CodeIgniter在IDE中代码提示功能的方法
2014/07/19 PHP
ThinkPHP自动完成中使用函数与回调方法实例
2014/11/29 PHP
PHP日期函数date格式化UNIX时间的方法
2015/03/19 PHP
php实现文件预览功能
2017/05/23 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
2017/05/24 PHP
ASP中用Join和Array,可以加快字符连接速度的代码
2007/08/22 Javascript
用最通俗易懂的代码帮助新手理解javascript闭包 推荐
2012/03/01 Javascript
jquery中邮箱地址 URL网站地址正则验证实例代码
2013/09/15 Javascript
2则自己编写的jQuery特效分享
2015/02/26 Javascript
jQuery在页面加载时动态修改图片尺寸的方法
2015/03/20 Javascript
全系IE支持Bootstrap的解决方法
2015/10/19 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记8)
2015/12/24 Javascript
Bootstrap图片轮播效果详解
2017/10/17 Javascript
浅谈vue中.vue文件解析流程
2018/04/24 Javascript
JS控制下拉列表左右选择实例代码
2020/05/08 Javascript
小程序自动化测试的示例代码
2020/08/11 Javascript
[02:42]DOTA2英雄基础教程 杰奇洛
2013/12/23 DOTA
[18:32]DOTA2 HEROS教学视频教你分分钟做大人-谜团
2014/06/12 DOTA
在Python中使用全局日志时需要注意的问题
2015/05/06 Python
python转换字符串为摩尔斯电码的方法
2015/07/06 Python
python搭建微信公众平台
2016/02/09 Python
Django 迁移、操作数据库的方法
2019/08/02 Python
设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
2014/12/30 面试题
初中音乐教学反思
2014/01/12 职场文书
优秀本科生求职推荐信
2014/02/24 职场文书
服装采购员岗位职责
2014/03/15 职场文书
我的小天地教学反思
2014/04/30 职场文书
党员教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
琅琊山导游词
2015/02/05 职场文书
2015年节能减排工作总结
2015/05/14 职场文书
六一晚会主持词开场白
2015/05/28 职场文书
关于应聘教师的自荐信
2016/01/28 职场文书
高中信息技术教学反思
2016/02/16 职场文书
2016基督教会圣诞节开幕词
2016/03/04 职场文书
2016年学校“3.12”植树节活动总结
2016/03/16 职场文书
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/07 其他游戏