详解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 textarea光标定位方法(兼容IE和FF)
Mar 12 Javascript
JS中Date日期函数中的参数使用介绍
Jan 02 Javascript
js和jquery使按钮失效为不可用状态的方法
Jan 26 Javascript
JavaScript插件化开发教程 (二)
Jan 27 Javascript
jquery实现像栅栏一样左右滑出式二级菜单效果代码
Aug 24 Javascript
JS与HTML结合使用marquee标签实现无缝滚动效果代码
Jul 05 Javascript
javascript事件的绑定基础实例讲解(34)
Feb 14 Javascript
ES6新特性六:promise对象实例详解
Apr 21 Javascript
node.js + socket.io 实现点对点随机匹配聊天
Jun 30 Javascript
js针对图片加载失败的处理方法分析
Aug 24 Javascript
js实现的订阅发布者模式简单示例
Mar 14 Javascript
Vue3配置axios跨域实现过程解析
Nov 25 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
adodb与adodb_lite之比较
2006/12/31 PHP
PHP笔记之:基于面向对象设计的详解
2013/05/14 PHP
YII2.0之Activeform表单组件用法实例
2016/01/09 PHP
实例介绍PHP删除数组中的重复元素
2019/03/03 PHP
DWR Ext 加载数据
2009/03/22 Javascript
IE下双击checkbox反应延迟问题的解决方法
2014/03/27 Javascript
js动态删除div元素基本思路及实现代码
2014/05/08 Javascript
JavaScript中具名函数的多种调用方式总结
2014/11/08 Javascript
jQuery使用hide方法隐藏页面上指定元素的方法
2015/03/30 Javascript
简介JavaScript中toUpperCase()方法的使用
2015/06/06 Javascript
javascript记住用户名和登录密码(两种方式)
2015/08/04 Javascript
JavaScipt选取文档元素的方法(推荐)
2016/08/05 Javascript
vue.js根据代码运行环境选择baseurl的方法
2018/02/28 Javascript
jQuery实现简单复制json对象和json对象集合操作示例
2018/07/09 jQuery
vue-cli监听组件加载完成的方法
2018/09/07 Javascript
微信小程序实现留言板
2018/10/31 Javascript
一些你可能不熟悉的JS知识点总结
2019/03/15 Javascript
函数式编程入门实践(一)
2019/04/20 Javascript
JavaScript实现京东放大镜效果
2019/12/03 Javascript
[59:30]完美世界DOTA2联赛PWL S3 access vs LBZS 第二场 12.20
2020/12/23 DOTA
举例讲解Python程序与系统shell交互的方式
2015/04/09 Python
使用Python的Django框架实现事务交易管理的教程
2015/04/20 Python
python使用socket创建tcp服务器和客户端
2018/04/12 Python
在NumPy中创建空数组/矩阵的方法
2018/06/15 Python
tensorflow: variable的值与variable.read_value()的值区别详解
2018/07/30 Python
基于Python实现定时自动给微信好友发送天气预报
2018/10/25 Python
Windows 安装 Anaconda3+PyCharm的方法步骤
2019/06/13 Python
荷兰家电购物网站:Expert.nl
2020/01/18 全球购物
汽车专业学生自我评价
2014/01/19 职场文书
小学生家长评语大全
2014/02/10 职场文书
党员党性分析材料
2014/02/17 职场文书
个人汇报材料范文
2014/12/30 职场文书
法定代表人免职证明
2015/06/24 职场文书
创业计划书之川味火锅店
2019/09/02 职场文书
springboot使用Redis作缓存使用入门教程
2021/07/25 Redis
Spring Boot 实现 WebSocket
2022/04/30 Java/Android