详解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 相关文章推荐
PJBlog插件 防刷新的在线播放器
Oct 25 Javascript
ECMAScript 基础知识
Jun 29 Javascript
12个非常有创意的JavaScript小游戏
Mar 18 Javascript
用js实现计算加载页面所用的时间
Apr 02 Javascript
JavaScript字符串对象toUpperCase方法入门实例(用于把字母转换为大写)
Oct 17 Javascript
node.js中的buffer.Buffer.byteLength方法使用说明
Dec 10 Javascript
JavaScript的Number对象的toString()方法
Dec 18 Javascript
JS中dom0级事件和dom2级事件的区别介绍
May 05 Javascript
AJAX和jQuery动态加载数据的实现方法
Dec 05 Javascript
JS请求servlet功能示例
Jun 01 Javascript
element form 校验数组每一项实例代码
Oct 10 Javascript
Node.js API详解之 net模块实例分析
May 18 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配置文件中最常用四个ini函数
2007/03/19 PHP
ThinkPHP框架安全实现分析
2016/03/14 PHP
Javascript的常规数组和关联数组对比小结
2012/05/24 Javascript
在jQuery中 关于json空对象筛选替换
2013/04/15 Javascript
js判断当前浏览器类型,判断IE浏览器方法
2014/06/02 Javascript
jQuery的ready方法详解
2014/11/27 Javascript
js实现鼠标滑过文字链接色彩变化的效果
2015/05/06 Javascript
简单几步实现返回顶部效果
2016/12/05 Javascript
js中this对象用法分析
2018/01/05 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
2018/03/02 Javascript
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
2018/08/24 Javascript
详解关于Vuex的action传入多个参数的问题
2019/02/22 Javascript
p5.js临摹旋转爱心
2019/10/23 Javascript
jQuery中event.target和this的区别详解
2020/08/13 jQuery
python 提取文件的小程序
2009/07/29 Python
python正则分组的应用
2013/11/10 Python
深入解析Python编程中JSON模块的使用
2015/10/15 Python
解决tensorflow模型参数保存和加载的问题
2018/07/26 Python
Python批量删除mysql中千万级大量数据的脚本分享
2020/12/03 Python
10张动图学会python循环与递归问题
2021/02/06 Python
css3教程之倾斜页面
2014/01/27 HTML / CSS
HTML5 canvas基本绘图之绘制线段
2016/06/27 HTML / CSS
Html5 FileReader实现即时上传图片功能实例代码
2014/09/01 HTML / CSS
sort命令的作用和用法
2012/11/04 面试题
房地产管理毕业生自荐信
2013/11/04 职场文书
教师辞职报告范文
2014/01/20 职场文书
行政助理的岗位职责
2014/02/18 职场文书
节水倡议书范文
2014/04/15 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
体育教育毕业生自荐信
2014/06/29 职场文书
经理助理岗位职责
2015/02/02 职场文书
同事打架检讨书
2015/05/06 职场文书
《富饶的西沙群岛》教学反思
2016/02/16 职场文书
Html5大屏数据可视化开发的实现
2021/06/11 HTML / CSS
如何通过cmd 连接阿里云服务器
2022/04/18 Servers
JavaScript架构搭建前端监控如何采集异常数据
2022/06/25 Javascript