详解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 相关文章推荐
js 遍历对象的属性的代码
Dec 29 Javascript
js Math 对象的方法
Sep 01 Javascript
jQuery动态改变图片显示大小(修改版)的实现思路及代码
Dec 24 Javascript
Jquery获得控件值的三种方法总结
Feb 13 Javascript
浅谈nodeName,nodeValue,nodeType,typeof 的区别
Jan 13 Javascript
JavaScript数组Array对象增加和删除元素方法总结
Jan 20 Javascript
javascript事件委托的方式绑定详解
Jun 10 Javascript
Vue.js自定义指令的用法与实例解析
Jan 18 Javascript
socket在egg中的使用实例代码详解
May 30 Javascript
Vue proxyTable配置多个接口地址,解决跨域的问题
Sep 11 Javascript
Javascript柯里化实现原理及作用解析
Oct 22 Javascript
ant design vue嵌套表格及表格内部编辑的用法说明
Oct 28 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
用文本作数据处理
2006/10/09 PHP
codeigniter框架The URI you submitted has disallowed characters错误解决方法
2014/05/06 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
2015/03/24 PHP
解决PHPstudy Apache无法启动的问题【亲测有效】
2020/10/30 PHP
jQuery学习笔记[1] jQuery中的DOM操作
2010/12/03 Javascript
基于jquery自定义图片热区效果
2012/07/21 Javascript
解析ScrollPic在ie8下只滚动一遍,然后变为空白 ie6,ie7,chrome,firefox正常
2013/06/26 Javascript
JS动态增删表格行的方法
2016/03/03 Javascript
判断数组是否包含某个元素的js函数实现方法
2016/05/19 Javascript
jQuery操作动态生成的内容的方法
2016/05/28 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
jQuery实现select下拉框获取当前选中文本、值、索引
2017/05/08 jQuery
带你了解session和cookie作用原理区别和用法
2017/08/14 Javascript
关于定制FileField中的上传文件名称问题
2017/08/22 Javascript
Node.js Stream ondata触发时机与顺序的探索
2019/03/08 Javascript
React组件对子组件children进行加强的方法
2019/06/23 Javascript
Vue中跨域及打包部署到nginx跨域设置方法
2019/08/26 Javascript
jQuery轮播图功能制作方法详解
2019/12/03 jQuery
Vue基于iview实现登录密码的显示与隐藏功能
2020/03/06 Javascript
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
vue基于better-scroll仿京东分类列表
2020/06/30 Javascript
vc6编写python扩展的方法分享
2014/01/17 Python
Python找出list中最常出现元素的方法
2016/06/14 Python
Python使用logging模块实现打印log到指定文件的方法
2018/09/05 Python
Python实现登陆文件验证方法
2018/10/06 Python
python-numpy-指数分布实例详解
2019/12/07 Python
Python调用C语言程序方法解析
2020/07/07 Python
python爬取微博评论的实例讲解
2021/01/15 Python
关于人生的感言
2014/01/17 职场文书
高中军训感想300字
2014/03/04 职场文书
公司副总经理岗位职责
2014/10/01 职场文书
群众路线教育实践活动学习笔记内容
2014/11/06 职场文书
保管员岗位职责
2015/02/14 职场文书
横空出世观后感
2015/06/09 职场文书
2015中秋节晚会开场白
2015/07/30 职场文书
导游词之河北野三坡
2019/12/11 职场文书