经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Vue.js » 查看文章
vue父组件监听子组件数据更新方式(hook)
来源:jb51  时间:2022/8/1 11:08:45  对本文有异议

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

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

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

  1. data(){
  2. ?? ?return {
  3. ?? ??? ?itemID:'',
  4. ?? ?}
  5. }
  6. mounted(){
  7. ?? ?// 设置定时器
  8. ?? ?this.itemID = setInterval(()=> { console.log('开计时器') }, 1000);
  9. ?? ?// 离开页面时清除定时器
  10. ?? ?this.$once('hook:beforeDestroy', ()=> { clearInterval(this.itemID) })
  11. }

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

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

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

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

来人! 上代码 !

  1. // 父组件
  2. <template>
  3. ?? ?<div class="father">
  4. ?? ??? ?<son @hook:update="sonUpdateFun"/> ?// 我是子组件
  5. ?? ?</div>
  6. </template>
  1. <script>
  2. ?? ?import son from './son.vue'
  3. ?? ?export default {
  4. ?? ??? ?components:{ 'son' },
  5. ?? ??? ?methods:{
  6. ?? ??? ??? ?sonUpdateFun(){
  7. ?? ??? ??? ??? ?console.log("子组件的数据更新啦~~~")
  8. ?? ??? ??? ?}
  9. ?? ??? ?}
  10. ?? ?}
  11. </script>

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

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

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

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

子组件

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

  1. handleSizeChange
  2. handleSizeChange(index) {
  3. this.query.length = index
  4. },

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

  1. handleCurrentChange
  2. handleCurrentChange(index) {
  3. console.log(index)
  4. this.query.start = index
  5. }

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

  1. query: {
  2. start: 1,
  3. length: 10
  4. }

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

  1. watch: {
  2. query: {
  3. handler(val, oldVal) {
  4. this.$emit('changeData', this.query)
  5. },
  6. deep: true
  7. }
  8. },

5.完整子组件代码

  1. <template>
  2. <div>
  3. <el-pagination
  4. @size-change="handleSizeChange"
  5. @current-change="handleCurrentChange"
  6. :current-page.sync="query.start"
  7. :page-sizes="[10, 20, 30, 50]"
  8. :page-size="query.length"
  9. layout="sizes, prev, pager, next"
  10. :total="total">
  11. </el-pagination>
  12. </div>
  13. </template>
  1. <script>
  2. export default {
  3. name: 'pagination',
  4. props: {
  5. size: {
  6. type: Number,
  7. default: function() {
  8. return 10
  9. }
  10. },
  11. total: {
  12. type: Number,
  13. default: function() {
  14. return 10
  15. }
  16. },
  17. start: {
  18. type: Number,
  19. default: function() {
  20. return 1
  21. }
  22. }
  23. },
  24. created() {
  25. this.query = {
  26. start: this.start,
  27. length: this.size
  28. }
  29. },
  30. data() {
  31. return {
  32. query: {
  33. start: 1,
  34. length: 10
  35. }
  36. }
  37. },
  38. watch: {
  39. query: {
  40. handler(val, oldVal) {
  41. this.$emit('changeData', this.query)
  42. },
  43. deep: true
  44. }
  45. },
  46. methods: {
  47. handleSizeChange(index) {
  48. this.query.length = index
  49. },
  50. handleCurrentChange(index) {
  51. console.log(index)
  52. this.query.start = index
  53. }
  54. }
  55. }
  56. </script>
  57. <style scoped>
  58. </style>

父组件

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

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

2.然后注册组件

  1. components: { pagination },

3.使用组件

  1. <pagination
  2. :size="query.length"
  3. :total="total"
  4. :start="query.start"
  5. @changeData="getList($event)"
  6. />

组件传递的参数:

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

1)父组件获取

注意:

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

2)子组件部位

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

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

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

大功告成

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

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

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号