详解VUE里子组件如何获取父组件动态变化的值


Posted in Javascript onDecember 26, 2018

在VUE里父组件给子组件间使用props方式传递数据,但是希望父组件的一个状态值改变然后子组件也能监听到这个数据的改变来更新子组件的状态。

场景:子组件通过props获取父组件传过来的数据,子组件存在操作传过来的数据并且传递给父组件。

比如想实现一个switch开关按钮的公用组件:

详解VUE里子组件如何获取父组件动态变化的值

1.父组件可以向按钮组件传递默认值。

2.子组件的操作可以改变父组件的数据。

3.父组件修改传递给子组件的值,子组件能动态监听到改变。

比如父组件点击重置,开关组件的状态恢复为关闭状态:

详解VUE里子组件如何获取父组件动态变化的值

方法1:

1、因为存在子组件要更改父组件传递过来的数据,但是直接操作props里定义的数据vue会报错,所以需要在data里重新定义属性名并将props里的数据接收。

2、首先想到的肯定是在computed计算属性里监听数据的变化,那就直接在computed里监听父组件传递过来的props数据的变化,如果有变动就进行操作,如:

export default {
 name: 'SwitchButton',
 props: {
  status: {
   type: Boolean,
   default () {
    return false
   }
  }
 },
 data () {
  return {
   switchStatusData: this.status // 重新定义数据
  }
 },
 computed: {
  switchStatus: function () {
   return this.status // 直接监听props里的status状态
  }
 }
 }
}

这样就可以在使用switchStatus的地方动态的监听到父组件status的变化。似乎只针对简单的数据类型有效。

方法2:

使用watch和computed组合实现:如

export default {
 name: 'SwitchButton',
 props: {
  status: {
   type: Boolean,
   default () {
    return false
   }
  }
 },
 data () {
  return {
   switchStatusData: this.status
  }
 },
 computed: {
  switchStatus: function () {
   return this.switchStatusData // 监听switchStatusData 的变化
  }
 },
 watch: {
  status (newV, oldV) { // watch监听props里status的变化,然后执行操作
   console.log(newV, oldV)
   this.switchStatusData = newV
  }
 },
 methods: {
  switchHandleClick () {
   this.switchStatusData = !this.switchStatusData
   this.$emit('switchHandleClick', this.switchStatusData)
  }
 }
}

下面是实现该组件的代码:

<template>
 <span class="switch-bar" :class="{'active': switchStatus}" @click="switchHandleClick"><span class="switch-btn"></span></span>
</template>
<script>
export default {
 name: 'SwitchButton',
 props: {
  status: {
   type: Boolean,
   default () {
    return false
   }
  }
 },
 data () {
  return {
   switchStatusData: this.status
  }
 },
 computed: {
  switchStatus: function () {
   return this.status
  }
 },
 // watch: {
 //  status (newV, oldV) {
 //   console.log(newV, oldV)
 //   this.switchStatusData = newV
 //  }
 // },
 methods: {
  switchHandleClick () {
   this.switchStatusData = !this.switchStatusData
   this.$emit('switchHandleClick', this.switchStatusData)
  }
 }
}
</script>
<style lang="stylus" scoped>
 @import "~styles/varibles.styl"
 .area-wrapper
  line-height: .8rem;
  padding: 0 .4rem;
  .switch
   float: right;
   font-size: 0;
  .switch-bar
   position: relative;
   display: inline-block;
   width: .8rem;
   height: .4rem;
   border-radius: .4rem;
   background: #ddd;
   border: 2px solid #ddd;
   vertical-align: middle;
   transition: background .3s, border .3s;
   &.active
    background: $bgColor;
    border: 2px solid $bgColor;
    .switch-btn
     left: .4rem;
     background: #fff;
  .switch-btn
   position: absolute;
   left: 0px;
   display: inline-block;
   width: .4rem;
   height: .4rem;
   border-radius: .2rem;
   background: #fff;
   transition: background .3s, left .3s;
</style>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
解析arp病毒背后利用的Javascript技术附解密方法
Aug 06 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
Dec 11 Javascript
用canvas 实现个图片三角化(LOW POLY)效果
Feb 18 Javascript
JS表格组件神器bootstrap table详解(强化版)
May 26 Javascript
JS在onclientclick里如何控制onclick的执行
May 30 Javascript
原生js编写2048小游戏
Mar 17 Javascript
Angularjs2不同组件间的通信实例代码
May 06 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
Aug 17 Javascript
Vue脚手架的简单使用实例
Jul 10 Javascript
Vue.js中 v-model 指令的修饰符详解
Dec 03 Javascript
前端vue+elementUI如何实现记住密码功能
Sep 20 Javascript
vue实现图片裁剪后上传
Dec 16 Vue.js
JavaScript基础之静态方法和实例方法分析
Dec 26 #Javascript
微信小程序实现文字跑马灯
May 26 #Javascript
基于JavaScript canvas绘制贝塞尔曲线
Dec 25 #Javascript
基于js Canvas实现二次贝塞尔曲线
Dec 25 #Javascript
JavaScript实现小球沿正弦曲线运动
Sep 07 #Javascript
微信小程序使用二次贝塞尔曲线画波浪
Dec 25 #Javascript
微信小程序开发问题之wx.previewImage
Dec 25 #Javascript
You might like
配置Nginx+PHP的正确思路与过程
2016/05/10 PHP
JavaScript读取中文cookie时的乱码问题的解决方法
2009/10/14 Javascript
Extjs学习笔记之四 工具栏和菜单
2010/01/07 Javascript
jquery 最简单易用的表单验证插件
2010/02/27 Javascript
Jquery cookie操作代码
2010/03/14 Javascript
让人印象深刻的10个jQuery手风琴效果应用
2012/05/08 Javascript
引入JS文件IE6报语法错误或缺少对象问题的解决方法
2014/01/09 Javascript
jquery操作checkbox实现全选和取消全选
2014/05/02 Javascript
JavaScript控制按钮可用或不可用的方法
2015/04/03 Javascript
javascript实现根据时间段显示问候语的方法
2015/06/18 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
实例讲解JavaScript中的this指向错误解决方法
2016/06/13 Javascript
如何学JavaScript?前辈的经验之谈
2016/12/28 Javascript
jquery实现提示语淡入效果
2017/05/05 jQuery
vue-quill-editor实现图片上传功能
2017/08/08 Javascript
vue ajax 拦截原理与实现方法示例
2019/11/29 Javascript
跟老齐学Python之关于类的初步认识
2014/10/11 Python
利用Python自动监控网站并发送邮件告警的方法
2016/08/24 Python
python numpy函数中的linspace创建等差数列详解
2017/10/13 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
2018/01/04 Python
python numpy 一维数组转变为多维数组的实例
2018/07/02 Python
python数据挖掘需要学的内容
2019/06/23 Python
django数据关系一对多、多对多模型、自关联的建立
2019/07/24 Python
详解Python绘图Turtle库
2019/10/12 Python
python自动点赞功能的实现思路
2020/02/26 Python
python中二分查找法的实现方法
2020/12/06 Python
微信浏览器左上角返回按钮拦截功能
2017/11/21 HTML / CSS
html5唤起app的方法
2017/11/30 HTML / CSS
html5中audio支持音频格式的解决方法
2018/08/24 HTML / CSS
本科生职业生涯规划书范文
2014/01/21 职场文书
交通违章检讨书
2014/09/21 职场文书
2014年学校党建工作总结
2014/11/11 职场文书
门市房租房协议书
2014/12/04 职场文书
小学五一劳动节活动总结
2015/02/09 职场文书
2015中学学校工作总结
2015/07/20 职场文书
2019最新版劳务派遣管理制度
2019/08/16 职场文书