前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Vue中通过watch来响应数据的变化

Vue中通过watch来响应数据的变化

作者头像
故久
发布2020-02-13 00:02:59
2.1K0
发布2020-02-13 00:02:59
举报
文章被收录于专栏:故久

Vue中的代码

原本是这样的

代码语言:javascript
复制
<div class="right-tip" >{{info.roomTypeCode}}</div>

但是由于是父组件赋值传给子组件。导致首次次运行页面都需要刷新才能进行数据动态渲染。

于是就有了下面的改造的代码用到了ref

ref 有三种用法:

  1、ref 加在普通的元素上,用this.ref.name 获取到的是dom元素

  2、ref 加在子组件上,用this.ref.name 获取到的是组件实例,可以使用组件的所有方法

  3、如何利用 v-for 和 ref 获取一组数组或者dom 节点

具体可以看下这篇博客

https://www.cnblogs.com/goloving/p/9404099.html

代码语言:javascript
复制
<div class="right-tip" ref="roomTypeCode"></div>

使用watch来响应数据的变化

代码语言:javascript
复制
watch: {
    info: {
        handler(newVal, oldVal) {
            this.$refs.roomTypeCode.innerHTML = newVal.roomTypeCode ? newVal.roomTypeCode : '';
        },
        deep: true,
        immediate: true
    }
}

info是属性

代码语言:javascript
复制
export default {
  name: 'FillInfo',
  props: ['info'],
  components: {
    [CellGroup.name]: CellGroup,
    [Cell.name]: Cell,
    [Field.name]: Field,
    [Stepper.name]: Stepper,
    PhoneInput
  },
  data () {
    return {
      center: true
    }
  },
  methods: {
    plus () {
      this.$emit('plus')
    },
    change (val) {
      this.$emit('change', val)
    },
    minus () {
      this.$emit('minus')
    }
  },
    watch: {
        info: {
            handler(newVal, oldVal) {
                this.$refs.roomTypeCode.innerHTML = newVal.roomTypeCode ? newVal.roomTypeCode : '';
            },
            deep: true,
            immediate: true
        }
    }
}

immediate和handler

这样使用watch时有一个特点,就是当值第一次绑定的时候,不会执行监听函数,只有值发生改变才会执行。如果我们需要在最初绑定值的时候也执行函数,则就需要用到immediate属性。

比如当父组件向子组件动态传值时,子组件props首次获取到父组件传来的默认值时,也需要执行函数,此时就需要将immediate设为true。

监听的数据后面写成对象形式,包含handler方法和immediate,之前我们写的函数其实就是在写这个handler方法;

immediate表示在watch中首次绑定的时候,是否执行handler,值为true则表示在watch中声明的时候,就立即执行handler方法,值为false,则和一般使用watch一样,在数据发生变化的时候才执行handler

deep

当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,只有data中的数据才能够监听到变化,此时就需要deep属性对对象进行深度监听。

this.$refs.roomTypeCode.innerHTML是要赋值

this.$refs的赋值可以查看这篇博客

https://www.cnblogs.com/frost-yen/p/11145791.html

this.$refs.roomTypeCode.innerHTML = newVal.roomTypeCode ? newVal.roomTypeCode : '';

判断是否有值如果有的话则返回newVal.roomTypeCode新的值,没有的话就给个空。

经过这个方法,我去运行代码。一进去页面就直接渲染出动态数据了,不需要再去刷新页面

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • immediate和handler
  • deep
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档