Vue进阶(幺零六):子组件处理父组件异步值传递给子组件处理

本文主要是介绍Vue进阶(幺零六):子组件处理父组件异步值传递给子组件处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 一、问题描述
    • 二、原因分析
    • 三、解决措施
      • 3.1 方法一:v-if 判断
      • 3.2 方法二:watch 监听
      • 3.3 方法三:子组件 watch + computed data 相结合
      • 3.4 方法四:使用事件总线 bus
      • 3.5 其他方法
    • 四、其它场景问题
    • 五、拓展阅读


一、问题描述

父组件通过Promise等其他异步方式获取异步数据,并传递给子组件,子组件直接显示没有问题,若对数据进行处理,则拿到的数据都是父组件初始值。

二、原因分析

父组件通过Promise等其他异步方式获取异步数据,在尚未等到数据返回时,子组件 created已经执行完毕,故此时子组件中的数据为父组件上次的数据。

父子组件的生命周期:
在这里插入图片描述
一、加载渲染过程

父beforeCreate–> 父created–>父beforeMount–>子 beforeCreate–> 子 created–>子
beforeMount–>子 mounted–>父mounted

二、子组件更新过程

父beforeUpdate --> 子 beforeUpdate–> 子 updated–> 父updated

三、销毁过程

父beforeDestroy --> 子 beforeDestroy–> 子 destroyed–> 父destroyed

三、解决措施

3.1 方法一:v-if 判断

父组件

  <child :child-data="asyncData" v-if="asyncData"></child>

asyncData有值得时候,再加载子组件。

评价:在asyncData为对象或数组元素,子组件获取对象属性或某一数组元素时,以上方法可行(不会报错),但仍会存在数据加载显示缓慢情形(及子组件首先显示的仍是上次父组件传值,然后才会渲染为当前父组件传值)。

3.2 方法二:watch 监听

子组件

watch:{childData(val){console.log('子组件 数据处理',val)}
}

评价: 以上方法仍会出现方法一中的数据加载缓慢问题。

3.3 方法三:子组件 watch + computed data 相结合

<template><div>子组件<p>{{test}}</p></div>
</template><script>export default {props: ['tableData'],data: () => ({test: ''}),watch: {tableData (val) {this.dataResult = val}},computed: {dataResult : {set (value) {this.update()this.test = value},get () {return this.test}}},methods: {update () {console.log(this.childObject) // {items: [1,2,3]}}}}
</script>

3.4 方法四:使用事件总线 bus

<template><div>子组件<p>{{test}}</p></div>
</template><script>export default {props: ['childObject'],data: () => ({test: ''}),created () {// 绑定this.$bus.on('triggerChild', (parmas) => {this.test = parmas.items[0] // 1this.updata()})},methods: {updata () {console.log(this.test) // 1}}}
</script>

这里使用了bus这个库,parent.vuechild.vue必须公用一个事件总线(也就是要引入同一个js,这个js定义了一个类似let bus = new Vue()的东西供这两个组件连接),才能相互触发。

3.5 其他方法

将数据存到store,子组件监听数据变化(watch/computed)。

四、其它场景问题

异步获取数据导致的报错的情况会在各个场景出现,比如:

  • 根据数据渲染dom,而对domjs操作的时候,会因为还没渲染出来而找不到相应的dom元素报错,这里可以用vue提供的$nextTick()函数,或者手动开个setTimeout定时器,延迟获取;
  • 使用better-scroll的时候因为dom没有渲染出来而无法获取滚动元素的高度,导致无法滚动,同样可以用vue提供的这个函数,等dom渲染完了后再初始化滚动。

五、拓展阅读

  • 《Vue进阶(六十二):理解$nextTick()》

这篇关于Vue进阶(幺零六):子组件处理父组件异步值传递给子组件处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/542649

相关文章

Python字符串处理方法超全攻略

《Python字符串处理方法超全攻略》字符串可以看作多个字符的按照先后顺序组合,相当于就是序列结构,意味着可以对它进行遍历、切片,:本文主要介绍Python字符串处理方法的相关资料,文中通过代码介... 目录一、基础知识:字符串的“不可变”特性与创建方式二、常用操作:80%场景的“万能工具箱”三、格式化方法

Spring Boot 处理带文件表单的方式汇总

《SpringBoot处理带文件表单的方式汇总》本文详细介绍了六种处理文件上传的方式,包括@RequestParam、@RequestPart、@ModelAttribute、@ModelAttr... 目录方式 1:@RequestParam接收文件后端代码前端代码特点方式 2:@RequestPart接

HTML5的input标签的`type`属性值详解和代码示例

《HTML5的input标签的`type`属性值详解和代码示例》HTML5的`input`标签提供了多种`type`属性值,用于创建不同类型的输入控件,满足用户输入的多样化需求,从文本输入、密码输入、... 目录一、引言二、文本类输入类型2.1 text2.2 password2.3 textarea(严格

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

SpringBoot返回文件让前端下载的几种方式

《SpringBoot返回文件让前端下载的几种方式》文章介绍了开发中文件下载的两种常见解决方案,并详细描述了通过后端进行下载的原理和步骤,包括一次性读取到内存和分块写入响应输出流两种方法,此外,还提供... 目录01 背景02 一次性读取到内存,通过响应输出流输出到前端02 将文件流通过循环写入到响应输出流

SpringBoot+Vue3整合SSE实现实时消息推送功能

《SpringBoot+Vue3整合SSE实现实时消息推送功能》在日常开发中,我们经常需要实现实时消息推送的功能,这篇文章将基于SpringBoot和Vue3来简单实现一个入门级的例子,下面小编就和大... 目录前言先大概介绍下SSE后端实现(SpringBoot)前端实现(vue3)1. 数据类型定义2.

JavaWeb 中的 Filter组件详解

《JavaWeb中的Filter组件详解》本文详细介绍了JavaWeb中的Filter组件,包括其基本概念、工作原理、核心接口和类、配置方式以及常见应用示例,Filter可以实现请求预处理、响应后... 目录JavaWeb 中的 Filter 详解1. Filter 基本概念1.1 什么是 Filter1.

SpringSecurity中的跨域问题处理方案

《SpringSecurity中的跨域问题处理方案》本文介绍了跨域资源共享(CORS)技术在JavaEE开发中的应用,详细讲解了CORS的工作原理,包括简单请求和非简单请求的处理方式,本文结合实例代码... 目录1.什么是CORS2.简单请求3.非简单请求4.Spring跨域解决方案4.1.@CrossOr

requests处理token鉴权接口和jsonpath使用方式

《requests处理token鉴权接口和jsonpath使用方式》文章介绍了如何使用requests库进行token鉴权接口的处理,包括登录提取token并保存,还详述了如何使用jsonpath表达... 目录requests处理token鉴权接口和jsonpath使用json数据提取工具总结reques