详解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 相关文章推荐
让您的菜单不离网站
Oct 03 Javascript
javascript中Object使用详解
Jan 26 Javascript
Ionic实现页面下拉刷新(ion-refresher)功能代码
Jun 03 Javascript
浅谈JavaScript对象的创建方式
Jun 13 Javascript
浅谈js数组和splice的用法
Dec 04 Javascript
JS求解三元一次方程组值的方法
Jan 03 Javascript
原生JavaScript来实现对dom元素class的操作方法(推荐)
Aug 16 Javascript
JS中的Replace()传入函数时的用法详解
Sep 11 Javascript
JavaScript类的继承方法小结【组合继承分析】
Jul 11 Javascript
Angular Material Icon使用详解
Nov 07 Javascript
jQuery+ThinkPHP实现图片上传
Jul 23 jQuery
React Hook用法示例详解(6个常见hook)
Apr 28 Javascript
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
基于PHP实现的事件机制实例分析
2015/06/18 PHP
php结合正则获取字符串中数字
2015/06/19 PHP
PHP自动生成缩略图函数的源码示例
2019/03/18 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
2019/12/04 PHP
PHP7 标准库修改
2021/03/09 PHP
setTimeout 不断吐食CPU的问题分析
2009/04/01 Javascript
Node.js中使用计时器定时执行函数详解
2014/08/15 Javascript
JavaScript中常用的六种互动方法示例
2015/03/13 Javascript
jQuery的remove()方法使用详解
2015/08/11 Javascript
实例讲解JS中setTimeout()的用法
2016/01/28 Javascript
jQuery回到顶部的代码
2016/07/09 Javascript
Angular开发者指南之入门介绍
2017/03/05 Javascript
JS倒计时实例_天时分秒
2017/08/22 Javascript
浅谈mint-ui 填坑之路
2017/11/06 Javascript
一个Vue视频媒体多段裁剪组件的实现示例
2018/08/09 Javascript
深入理解Vue.js轻量高效的前端组件化方案
2018/12/10 Javascript
JavaScript组合模式---引入案例分析
2020/05/23 Javascript
js实现前端界面导航栏下拉列表
2020/08/27 Javascript
Vue使用CDN引用项目组件,减少项目体积的步骤
2020/10/30 Javascript
python实现根据用户输入从电影网站获取影片信息的方法
2015/04/07 Python
python输出指定月份日历的方法
2015/04/23 Python
Python实现的选择排序算法原理与用法实例分析
2017/11/22 Python
OpenCV+python手势识别框架和实例讲解
2018/08/03 Python
Python中判断子串存在的性能比较及分析总结
2019/06/23 Python
如何解决安装python3.6.1失败
2020/07/01 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
浅析Python 条件控制语句
2020/07/15 Python
python中函数返回多个结果的实例方法
2020/12/16 Python
CSS3中新增的对文本和字体的设置
2020/02/03 HTML / CSS
有趣、实用和鼓舞人心的产品:Inspire Uplift
2019/11/05 全球购物
在weblogic中发布ejb需涉及到哪些配置文件
2012/01/17 面试题
校园联欢晚会主持词
2014/03/17 职场文书
2015年学校总务处工作总结
2015/05/19 职场文书
致三级跳运动员加油稿
2015/07/21 职场文书
给校长的建议书作文400字
2015/09/14 职场文书
2016读书月活动心得体会
2016/01/14 职场文书