详解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 相关文章推荐
让网页根据不同IE版本显示不同的内容
Feb 08 Javascript
理解Javascript_08_函数对象
Oct 15 Javascript
jQuery代码优化 选择符篇
Nov 01 Javascript
使用js+jquery实现无限极联动
May 23 Javascript
限制上传文件大小和格式的jQuery插件实例
Jan 24 Javascript
原生JavaScript制作计算器
Oct 16 Javascript
Javascript实现图片懒加载插件的方法
Oct 20 Javascript
详解Bootstrap各式各样的按钮(推荐)
Dec 13 Javascript
从零开始学习Node.js系列教程五:服务器监听方法示例
Apr 13 Javascript
Vue 去除路径中的#号
Apr 19 Javascript
Vue 全局loading组件实例详解
May 29 Javascript
详解jquery和vue对比
Apr 16 jQuery
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
收集的DedeCMS一些使用经验
2007/03/17 PHP
php UTF8 文件的签名问题
2009/10/30 PHP
PHP把MSSQL数据导入到MYSQL的方法
2014/12/27 PHP
PHP实现获取FLV文件的时间
2015/02/10 PHP
CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患分析
2019/02/28 PHP
php 中的信号处理操作实例详解
2020/03/04 PHP
zShowBox 图片放大展示jquery版 兼容性
2011/09/24 Javascript
javascript 事件处理、鼠标拖动效果实现方法详解
2012/05/11 Javascript
JS中Iframe之间传值及子页面与父页面应用
2013/03/11 Javascript
jquery清空textarea等输入框实现代码
2013/04/22 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
JQUERY 设置SELECT选中项代码
2014/02/07 Javascript
js中直接声明一个对象的方法
2014/08/10 Javascript
纯javascript代码实现计算器功能(三种方法)
2015/09/07 Javascript
JSON 的正确用法探讨:Pyhong、MongoDB、JavaScript与Ajax
2016/05/15 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
使用JavaScript为一张图片设置备选路径的方法
2017/01/04 Javascript
详解微信小程序 wx.uploadFile 的编码坑
2017/01/23 Javascript
webpack 2的react开发配置实例代码
2017/07/28 Javascript
详解Vue文档中几个易忽视部分的剖析
2018/03/24 Javascript
js实现按钮开关单机下拉菜单效果
2018/11/22 Javascript
vue实现下拉加载其实没那么复杂
2019/08/13 Javascript
微信小程序 自定义复选框实现代码实例
2019/09/04 Javascript
vue select 获取value和lable操作
2020/08/28 Javascript
python mysqldb连接数据库
2009/03/16 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
2020/01/02 Python
在django admin中配置搜索域是一个外键时的处理方法
2020/05/20 Python
Pandas把dataframe或series转换成list的方法
2020/06/14 Python
python用Configobj模块读取配置文件
2020/09/26 Python
AmazeUI 平滑滚动效果的示例代码
2020/08/20 HTML / CSS
俄罗斯电子产品、计算机和家用电器购物网站:OLDI
2019/10/27 全球购物
输入N,打印N*N矩阵
2012/02/20 面试题
大专自我鉴定范文
2013/10/23 职场文书
KTV的创业计划书范文
2014/02/02 职场文书
大学生安全教育心得体会
2016/01/15 职场文书
Redis 限流器
2022/05/15 Redis