详解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 相关文章推荐
Javascript 面向对象特性
Dec 28 Javascript
window.onbeforeunload方法在IE下无法正常工作的解决办法
Jan 23 Javascript
JQuery AJAX提交中文乱码的解决方案
Jul 02 Javascript
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
Dec 06 Javascript
javascript 事件绑定问题
Jan 01 Javascript
JS写的贪吃蛇游戏(个人练习)
Jul 08 Javascript
Javascript表格翻页效果的具体实现
Oct 05 Javascript
jQuery获取剪贴板内容的方法
Jun 16 Javascript
图文详解JavaScript的原型对象及原型链
Aug 02 Javascript
玩转vue的slot内容分发
Sep 22 Javascript
vue学习笔记之过滤器的基本使用方法实例分析
Feb 01 Javascript
vue使用Sass时报错问题的解决方法
Oct 14 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 IN_ARRAY 函数使用注意事项
2010/07/24 PHP
PHP解析html类库simple_html_dom的转码bug
2014/05/22 PHP
destoon实现调用图文新闻的方法
2014/08/21 PHP
详解PHP归并排序的实现
2016/10/18 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
2018/10/16 PHP
JQuery文本框高亮显示插件代码
2011/04/02 Javascript
javascript 基础篇1 什么是js 建立第一个js程序
2012/03/14 Javascript
推荐30个新鲜出炉的精美 jQuery 效果
2012/03/26 Javascript
jQuery 中国省市两级联动选择附图
2014/05/14 Javascript
js 判断图片是否加载完以及实现图片的预下载
2014/08/14 Javascript
JavaScript检测实例属性, 原型属性
2015/02/04 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
2016/09/06 Javascript
Vue.js 表单控件操作小结
2018/03/29 Javascript
JavaScript作用域链实例详解
2019/01/21 Javascript
解决vue单页面修改样式无法覆盖问题
2019/08/05 Javascript
基于postman获取动态数据过程详解
2020/09/08 Javascript
Python 错误和异常小结
2013/10/09 Python
python+ffmpeg批量去视频开头的方法
2019/01/09 Python
对pyqt5中QTabWidget的相关操作详解
2019/06/21 Python
在win64上使用bypy进行百度网盘文件上传功能
2020/01/02 Python
python如何从键盘获取输入实例
2020/06/18 Python
纯css3制作的火影忍者写轮眼开眼至轮回眼及进化过程实例
2014/11/11 HTML / CSS
日本PLST在线商店:日本时尚杂志刊载的人气服装
2016/12/10 全球购物
好药师网上药店:安全合法的网上药品零售药房
2017/02/15 全球购物
Unix/Linux开发面试题
2016/08/16 面试题
综合办公室个人的自我评价
2013/12/22 职场文书
《燕子专列》教学反思
2014/02/21 职场文书
作文评语集锦大全
2014/04/23 职场文书
小学生环保演讲稿
2014/04/25 职场文书
班级出游活动计划书
2014/08/15 职场文书
会员活动策划方案
2014/08/19 职场文书
群众路线党员自我评议范文2014
2014/09/24 职场文书
2015年南京大屠杀纪念日活动总结
2015/03/24 职场文书
送给教师们,到底该如何写好教学反思?
2019/07/02 职场文书
如何利用JavaScript实现二叉搜索树
2021/04/02 Javascript
mapstruct的用法之qualifiedByName示例详解
2022/04/06 Java/Android