详解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 相关文章推荐
jquery创建div 实现代码
Apr 27 Javascript
javascript 禁用IE工具栏,导航栏等等实现代码
Apr 01 Javascript
jquery 倒计时效果实现秒杀思路
Sep 11 Javascript
JavaScript异步编程Promise模式的6个特性
Apr 03 Javascript
javascript下拉框选项单击事件的例子分享
Mar 04 Javascript
分享两款带遮罩的jQuery弹出框
Dec 30 Javascript
原生JS封装animate运动框架的实例
Oct 12 Javascript
JavaScript实现全选取消效果
Dec 14 Javascript
webpack打包react项目的实现方法
Jun 21 Javascript
关于在LayUI中使用AJAX提交巨坑记录
Oct 25 Javascript
Vue+tracking.js 实现前端人脸检测功能
Apr 16 Javascript
使用vue实现通过变量动态拼接url
Jul 22 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 setcookie设置Cookie用法(及设置无效的问题)
2011/07/13 PHP
php+MySql实现登录系统与输出浏览者信息功能
2016/07/01 PHP
php post json参数的传递和接收处理方法
2018/05/31 PHP
元素的内联事件处理函数的特殊作用域在各浏览器中存在差异
2011/01/12 Javascript
JQuery中操作Css样式的方法
2014/02/12 Javascript
JavaScript判断前缀、后缀是否是空格的方法
2015/04/15 Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
2017/02/08 Javascript
vue2.0全局组件之pdf详解
2017/06/26 Javascript
详解使用angularjs的ng-options时如何设置默认值(初始值)
2017/07/18 Javascript
Node.JS更改Windows注册表Regedit的方法小结
2017/08/18 Javascript
浅析java线程中断的办法
2018/07/29 Javascript
JavaScript this绑定过程深入详解
2018/12/07 Javascript
Jquery的autocomplete插件用法及参数讲解
2019/03/12 jQuery
详解Vue-cli3 项目在安卓低版本系统和IE上白屏问题解决
2019/04/14 Javascript
JS实现指定区域的全屏显示功能示例
2019/04/25 Javascript
vue实现的请求服务器端API接口示例
2019/05/25 Javascript
使用layui实现树形结构的方法
2019/09/20 Javascript
vue接口请求加密实例
2020/08/11 Javascript
[02:02]2018DOTA2亚洲邀请赛Mineski赛前采访
2018/04/04 DOTA
Python实现从订阅源下载图片的方法
2015/03/11 Python
python常用知识梳理(必看篇)
2017/03/23 Python
关于Python数据结构中字典的心得
2017/12/04 Python
opencv python 图像去噪的实现方法
2018/08/31 Python
python八皇后问题的解决方法
2018/09/27 Python
深入浅析CSS3中的Flex布局整理
2020/04/27 HTML / CSS
css3 transform 3d 使用css3创建动态3d立方体(html5实践)
2013/01/06 HTML / CSS
Europcar德国:全球汽车租赁领域的领导者
2018/08/15 全球购物
新加坡最佳婴儿用品店:Mamahood.com.sg
2018/08/26 全球购物
高等教育学自荐书范文
2014/02/10 职场文书
《湘夫人》教学反思
2014/02/21 职场文书
法人委托书
2014/07/31 职场文书
2015驻村干部工作总结
2015/04/07 职场文书
中秋晚会致辞
2015/07/31 职场文书
学法用法心得体会(2016推荐篇)
2016/01/21 职场文书
导游词之峨眉山
2019/12/16 职场文书
分析SQL窗口函数之排名窗口函数
2022/04/21 Oracle