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

目录
  • vue父组件监听子组件数据更新
    • this.$on(‘hook : 生命周期钩子’, () => {})
    • @hook:生命周期钩子=“触发的函数”
  • 监听子组件内数据变化,父组件绑定change事件
    • 子组件
    • 父组件
    • 大功告成

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的值改变之后,父组件都会执行分页查询请求,就可以实时更新了!

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

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

(0)

相关推荐

  • Vue父组件监听子组件生命周期

    比如有父组件 Parent 和子组件 Child,如果父组件监听到子组件挂载 mounted 就做一些逻辑处理,可以通过以下写法实现: // Parent.vue <Child @mounted="doSomething"/> // Child.vue mounted() { this.$emit("mounted"); } 以上需要手动通过 $emit 触发父组件的事件,更简单的方式可以在父组件引用子组件时通过 @hook 来监听即可,如下所示: //

  • vue父组件数据更新子组件相关内容未改变问题(用watch解决)

    父组件数据更新子组件相关内容未改变 父组件 在父组件中,根据后台给的数据(数组),v-for生成子组件    <div class="exist">                     <existProject :itemprop="item" v-for="(item, index) in getData" :key="index" :index="index" @click=&q

  • Vue子组件监听父组件值的变化

    目录 子组件监听父组件值变化 子组件监听父组件的值同步更新数据 子组件监听父组件值变化 子组件中利用watch监听父组件值的变化 // 子组件 props: ["a"],     watch: {         a(oldValue, newValue) {             // oldValue  a旧值             // newValue a新值         }     } 子组件监听父组件的值同步更新数据 子组件 props : ["data&

  • vue2.x 父组件监听子组件事件并传回信息的方法

    本文介绍了vue2.x 父组件监听子组件事件并传回信息,分享给大家,希望此文章对各位有所帮助 利用vm.$emit 1.在父组件中引用子组件 <child @from-child-msg="listenChildMsg"></child > 2.子组件中使用$emit发送事件 this.$emit('from-child-msg', '这是子组件传递的消息'); demo <!DOCTYPE html> <html lang="en&

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

    目录 vue父组件监听子组件数据更新 this.$on(‘hook : 生命周期钩子’, () => {}) @hook:生命周期钩子=“触发的函数” 监听子组件内数据变化,父组件绑定change事件 子组件 父组件 大功告成 vue父组件监听子组件数据更新 this.$on(‘hook : 生命周期钩子’, () => {}) 可以监听执行生命周期钩子,适用场合如: data(){     return {         itemID:'',     } } mounted(){     

  • 解决Vue.js父组件$on无法监听子组件$emit触发事件的问题

    最近学习vuejs看例子中用$on无法监听子组件$emit触发事件: 使用版本 vue.js 2.2.5 参考文献 1.vuejs API 2.解决实例 问题分析 1.之前写的自定义组件事件触发为this.$emit("myclick",this.todo.text);,这样this指的是todo-item的每一项,而最后vm.$on监听的是app组件,也就出说监听的是父节点,而触发的是子节点,故监听不到这个事件的. 解决思路 1.将触发事件放在父节点上触发,就可以监听到触发的事件了,

  • vue使用$emit时,父组件无法监听到子组件的事件实例

    vue使用$emit时,父组件无法监听到子组件的事件的原因是$emit传入的事件名称只能使用小写,不能使用大写的驼峰规则命名 <div id="counter-event-example"> <p>{{ total }}</p> <button-counter v-on:ee="incrementTotal"></button-counter> <button-counter v-on:eEvent=

  • angular5 子组件监听父组件传入值的变化方法

    项目中遇到一个问题,就是在ngInit()中调用方法,只调用一次的问题,当父组件传值变化时,并不会再次执行. import { Component, Input, OnChanges, SimpleChanges } from '@angular/core'; import { NavController } from 'ionic-angular'; @Component({ selector: 'cs-img-lazy', templateUrl: 'cs-img-lazy.html' })

  • vue父组件中获取子组件中的数据(实例讲解)

    如下所示: <FormItem label="上传头像" prop="image"> <uploadImg :width="150" :height="150" :name="'avatar'" size="150px*150px" ref="avatar"></uploadImg> </FormItem> <Fo

  • 使用vue.js在页面内组件监听scroll事件的方法

    思路:scroll在哪儿个组件内,就在获取那个dom元素.网上好多思路是 window.addEventListener("scroll", function(){ console.log('scrolling'); }); 这是监听不到的!如果你整个网页可以滑动,或许还可以试试! 对于像我这样,只在页面的内的一个div内要监听的. 实现代码如下: 第一步:滑动的组件外层的div加 ref="viewBox" 为了通过$refs获取dom元素 <!--设备列表

  • vue 父组件中调用子组件函数的方法

    在父组件中调用子组件的方法: 1.给子组件定义一个ref属性.eg:ref="childItem" 2.在子组件的methods中声明一个函数.eg: useInPar:function (str) {console.log(str)} 2. 在父组件的中声明一个函数,并通过this.$refs.childItem.userInPar来使用子组件中声明的函数. 父组件: <template> <child-item ref='child' /> <butt

随机推荐