vue父组件监听子组件数据更新方式(hook)

 更新时间:2022年08月01日 08:44:58   作者:Mao_mou  
这篇文章主要介绍了vue父组件监听子组件数据更新方式(hook),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

vue父组件监听子组件数据更新

this.$on(‘hook : 生命周期钩子’, () => {})

可以监听执行生命周期钩子,适用场合如:

data(){
    return {
        itemID:'',
    }
}
mounted(){
    // 设置定时器
    this.itemID = setInterval(()=> { console.log('开计时器') }, 1000);
    // 离开页面时清除定时器
    this.$once('hook:beforeDestroy', ()=> { clearInterval(this.itemID) })
}

将定时器和清除定时器放在一起,功能和写在beforeDestroy生命周期中是一样滴,这样维护起来比较方便 ~

定时器里放需要定时请求的数据,然后离开页面就清除定时器,也就停止请求

@hook:生命周期钩子=“触发的函数”

父组件监听子组件数据更新,也就是监听生命周期 ~

来人! 上代码 !

// 父组件
<template>
    <div class="father">
        <son @hook:update="sonUpdateFun"/>  // 我是子组件
    </div>
</template>
<script>
    import son from './son.vue'
    export default {
        components:{ 'son' },
        methods:{
            sonUpdateFun(){
                console.log("子组件的数据更新啦~~~")
            }
        }
    }
</script>

当子组件的数据更新的时候就会触发函数 sonUpdateFun,就可以进行一些不可描述的操作了 

监听子组件内数据变化,父组件绑定change事件

如题,做了一个分页功能,element里面的分页,已经有了页码改变、每页数量改变的change事件,这样如果当页码改变、每页数量改变的时候,又要在methods里面写change来根据改变的值来获取分页,这样就很麻烦,如果没个页面都有分页,这样就要在methods里面多写change事件。

想到了一个解决方法,就是把element的分页封装成一个组件,具体思路如下:

子组件

1.这个绑定了每页数量改变的事件,

handleSizeChange
handleSizeChange(index) {
      this.query.length = index
    },

2.这个绑定了当前页码改变的事件

handleCurrentChange
handleCurrentChange(index) {
      console.log(index)
      this.query.start = index
    }

3.最重要的数据,这里是当前页码和每页数量,

query: {
        start: 1,
        length: 10
      }

4.页码跟数量改变是在子组件中完成的,写个watch,然后实时把query传递给父组件

watch: {
    query: {
      handler(val, oldVal) {
        this.$emit('changeData', this.query)
      },
      deep: true
    }
  },

5.完整子组件代码

<template>
    <div>
      <el-pagination
        @size-change="handleSizeChange"
        @current-change="handleCurrentChange"
        :current-page.sync="query.start"
        :page-sizes="[10, 20, 30, 50]"
        :page-size="query.length"
        layout="sizes, prev, pager, next"
        :total="total">
      </el-pagination>
    </div>
</template>
<script>
export default {
  name: 'pagination',
  props: {
    size: {
      type: Number,
      default: function() {
        return 10
      }
    },
    total: {
      type: Number,
      default: function() {
        return 10
      }
    },
    start: {
      type: Number,
      default: function() {
        return 1
      }
    }
  },
  created() {
    this.query = {
      start: this.start,
      length: this.size
    }
  },
  data() {
    return {
      query: {
        start: 1,
        length: 10
      }
    }
  },
  watch: {
    query: {
      handler(val, oldVal) {
        this.$emit('changeData', this.query)
      },
      deep: true
    }
  },
  methods: {
    handleSizeChange(index) {
      this.query.length = index
    },
    handleCurrentChange(index) {
      console.log(index)
      this.query.start = index
    }
  }
}
</script>
<style scoped>
</style>

父组件

1.先引入组件,组件位置根据自己的而定

import pagination from '../../components/table-pagination/pagination'

2.然后注册组件

components: { pagination },

3.使用组件

<pagination
          :size="query.length"
          :total="total"
          :start="query.start"
          @changeData="getList($event)"
          />

组件传递的参数:

4.如何获取子组件传递过来的query对象?

1)父组件获取

注意:

这里的changeData跟子组件中$emit发送的地方要相同!

2)子组件部位

注意:this.$emit('changeData',this.query)

changeData就是父组件中子组件部位注册的自定义事件,this.query就是要传递的值

3)我的获取分页的函数就是getList(query),直接在自定义事件中写@changeData="getList($event)"

大功告成

这样每当子组件中query的值改变之后,父组件都会执行分页查询请求,就可以实时更新了!

后记:自定义事件,可以做很多事情,比如,点击子组件按钮,传递参数,然后父组件使用这个参数来做什么事情,当整个页面的数据量、逻辑实在是太庞大的时候,就可以把整个也面分成一个个小组件来,这样就不会显得页面庞大复杂了…

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能

    Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能

    本文通过实例代码给大家介绍了Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能,需要的朋友可以参考下
    2018-08-08
  • vue项目中vue-i18n和element-ui国际化开发实现过程

    vue项目中vue-i18n和element-ui国际化开发实现过程

    这篇文章主要介绍了vue项目中vue-i18n和element-ui国际化开发实现过程,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-04-04
  • Vue3封装全局函数式组件方法总结

    Vue3封装全局函数式组件方法总结

    函数式组件就是没有管理任何状态,也没有监听任何传递给它的状态,也没有生命周期方法,它只是一个接受一些 prop 的函数,下面这篇文章主要给大家介绍了关于Vue3封装全局函数式组件方法的相关资料,需要的朋友可以参考下
    2023-06-06
  • Vue组件中常见的props默认值陷阱问题

    Vue组件中常见的props默认值陷阱问题

    这篇文章主要介绍了避免Vue组件中常见的props默认值陷阱,本文通过问题展示及解决方案给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • 基于Vue实现可以拖拽的树形表格实例详解

    基于Vue实现可以拖拽的树形表格实例详解

    因业务需求,需要一个树形表格,并且支持拖拽排序,任意未知插入,github搜了下,真不到合适的,大部分树形表格都没有拖拽功能,所以决定自己实现一个。这里分享一下实现过程,需要的朋友可以参考下
    2018-10-10
  • 解决新建一个vue项目过程中遇到的问题

    解决新建一个vue项目过程中遇到的问题

    这篇文章主要介绍了解决新建一个vue项目过程中遇到的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • vue日历/日程提醒/html5本地缓存功能

    vue日历/日程提醒/html5本地缓存功能

    这篇文章主要介绍了vue日历/日程提醒/html5本地缓存功能,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • vue实现模态框的通用写法推荐

    vue实现模态框的通用写法推荐

    下面小编就为大家分享一篇vue实现模态框的通用写法推荐,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • Vue.js中的组件系统

    Vue.js中的组件系统

    这篇文章主要介绍了Vue.js之组件系统,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • 在Vue中是如何封装axios

    在Vue中是如何封装axios

    这篇文章主要介绍在Vue中是如何封装axios的相关资料,axios的封装主要是帮助我们简化代码和利于后期的更新维护,感兴趣的小伙伴可以和小编一起来阅读下面文章的具体内容
    2021-10-10

最新评论