详解vue父组件传递props异步数据到子组件的问题
案例一
父组件parent.vue
- // asyncData为异步获取的数据,想传递给子组件使用
- <template>
- <div>
- 父组件
- <child :child-data="asyncData"></child>
- </div>
- </template>
- <script>
- import child from './child'
- export default {
- data: () => ({
- asyncData: ''
- }),
- components: {
- child
- },
- created () {
- },
- mounted () {
- // setTimeout模拟异步数据
- setTimeout(() => {
- this.asyncData = 'async data'
- console.log('parent finish')
- }, )
- }
- }
- </script>
子组件child.vue
- <template>
- <div>
- 子组件{{childData}}
- </div>
- </template>
- <script>
- export default {
- props: ['childData'],
- data: () => ({
- }),
- created () {
- console.log(this.childData) // 空值
- },
- methods: {
- }
- }
- </script>
上面按照这里的解析,子组件的html中的{{childData}}的值会随着父组件的值而改变,但是created里面的却不会发生改变(生命周期问题)
案例二
parent.vue
- <template>
- <div>
- 父组件
- <child :child-object="asyncObject"></child>
- </div>
- </template>
- <script>
- import child from './child'
- export default {
- data: () => ({
- asyncObject: ''
- }),
- components: {
- child
- },
- created () {
- },
- mounted () {
- // setTimeout模拟异步数据
- setTimeout(() => {
- this.asyncObject = {'items': [, , ]}
- console.log('parent finish')
- }, )
- }
- }
- </script>
child.vue
- <template>
- <div>
- 子组件<!--这里很常见的一个问题,就是{{childObject}}可以获取且没有报错,但是{{childObject.items[]}}不行,往往有个疑问为什么前面获取到值,后面获取不到呢?-->
- <p>{{childObject.items[]}}</p>
- </div>
- </template>
- <script>
- export default {
- props: ['childObject'],
- data: () => ({
- }),
- created () {
- console.log(this.childObject) // 空值
- },
- methods: {
- }
- }
- </script>
created里面的却不会发生改变, 子组件的html中的{{{childObject.items[0]}}的值虽然会随着父组件的值而改变,但是过程中会报错
- // 首先传过来的是空,然后在异步刷新值,也开始时候childObject.items[0]等同于''.item[0]这样的操作,
所以就会报下面的错- vue.esm.js?: [Vue warn]: Error in render function:
"TypeError: Cannot read property '0' of undefined"
针对二的解决方法:
1、使用v-if可以解决报错问题,和created为空问题
- // parent.vue
- <template>
- <div>
- 父组件
- <child :child-object="asyncObject" v-if="flag"></child>
- </div>
- </template>
- <script>
- import child from './child'
- export default {
- data: () => ({
- asyncObject: '',
- flag: false
- }),
- components: {
- child
- },
- created () {
- },
- mounted () {
- // setTimeout模拟异步数据
- setTimeout(() => {
- this.asyncObject = {'items': [, , ]}
- this.flag = true
- console.log('parent finish')
- }, )
- }
- }
- </script>
- //child.vue
- <template>
- <div>
- 子组件//不报错
- <p>{{childObject.items[]}}</p>
- </div>
- </template>
- <script>
- export default {
- props: ['childObject'],
- data: () => ({
- }),
- created () {
- console.log(this.childObject)// Object {items: [1,2,3]}
- },
- methods: {
- }
- }
- </script>
2、子组件使用watch来监听父组件改变的prop,使用methods来代替created
- <template>
- <div>
- 子组件<!---->
- <p>{{test}}</p>
- </div>
- </template>
- <script>
- export default {
- props: ['childObject'],
- data: () => ({
- test: ''
- }),
- watch: {
- 'childObject.items': function (n, o) {
- this.test = n[]
- this.updata()
- }
- },
- methods: {
- updata () { // 既然created只会执行一次,但是又想监听改变的值做其他事情的话,只能搬到这里咯
- console.log(this.test)//
- }
- }
- }
- </script>
3、子组件watch computed data 相结合,有点麻烦
- <template>
- <div>
- 子组件<!--这里很常见的一个问题,就是{{childObject}}可以获取且没有报错,但是{{childObject.items[0]}}不行,
往往有个疑问为什么前面获取到值,后面获取不到呢?-->- <p>{{test}}</p>
- </div>
- </template>
- <script>
- export default {
- props: ['childObject'],
- data: () => ({
- test: ''
- }),
- watch: {
- 'childObject.items': function (n, o) {
- this._test = n[]
- }
- },
- computed: {
- _test: {
- set (value) {
- this.update()
- this.test = value
- },
- get () {
- return this.test
- }
- }
- },
- methods: {
- update () {
- console.log(this.childObject) // {items: [1,2,3]}
- }
- }
- }
- </script>
4、使用emit,on,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[] //
- this.updata()
- })
- },
- methods: {
- updata () {
- console.log(this.test) //
- }
- }
- }
- </script>
这里使用了bus这个库,parent.vue和child.vue必须公用一个事件总线(也就是要引入同一个js,这个js定义了一个类似let bus = new Vue()的东西供这两个组件连接),才能相互触发
5、使用prop default来解决{{childObject.items[0]}}
- <template>
- <div>
- 父组件
- <child :child-object="asyncObject"></child>
- </div>
- </template>
- <script>
- import child from './child'
- export default {
- data: () => ({
- asyncObject: undefined // 这里使用null反而报0的错
- }),
- components: {
- child
- },
- created () {
- },
- mounted () {
- // setTimeout模拟异步数据
- setTimeout(() => {
- this.asyncObject = {'items': [, , ]}
- console.log('parent finish')
- }, )
- }
- }
- </script>
- <template>
- <div>
- 子组件<!---->
- <p>{{childObject.items[]}}</p>
- </div>
- </template>
- <script>
- export default {
- props: {
- childObject: {
- type: Object,
- default () {
- return {
- items: ''
- }
- }
- }
- },
- data: () => ({
- }),
- created () {
- console.log(this.childObject) // {item: ''}
- }
- }
- </script>
详解vue父组件传递props异步数据到子组件的问题的更多相关文章
- [转]详解vue父组件传递props异步数据到子组件的问题
原文地址:https://www.cnblogs.com/goloving/p/9114389.html 案例一 父组件parent.vue // asyncData为异步获取的数据,想传递给子组件使 ...
- vue中父组件使用props或者$attras向子组件中传值
知识点:vue中使用props或者$attras向子组件中传值 (1) props传值 子组件必须注册好要传的数据() props:['id'] (2)$attrs传值 该数据在props中,没有注册 ...
- vue 父向子组件传递数据,子组件向父组件传递数据方式
父组件向子组件传递数据通过props,子组件引入到父组件中,设置一个值等于父组件的数据,通过:bind将数据传到子组件中,子组件中通过props接收父组件的数据,这样就可以使用父组件的数据了,循环组件 ...
- vue组件详解(二)——使用props传递数据
在 Vue 中,父子组件的关系可以总结为 props向下传递,事件向上传递.父组件通过 props 给子组件下发数据,子组件通过事件给父组件发送消息.看看它们是怎么工作的. 一.基本用法 组件不仅仅 ...
- Vue : props 使用细节(父组件传递数据给子组件)
props使用细节 在Vue.js中我们可以使用 props 实现父组件传递数据给子组件,下面我们总结一下props的使用细节 1.基础类型检查 2.必填数据 3.默认值 4.自定义验证函数 其中每一 ...
- Vue 父组件ajax异步更新数据,子组件props获取不到
转载 https://blog.csdn.net/d295968572/article/details/80810349 当父组件 axjos 获取数据,子组件使用 props 接收数据时,执行 mo ...
- 【Vue】详解Vue组件系统
Vue渲染的两大基础方式 new 一个Vue的实例 这个我们一般会使用在挂载根节点这一初始化操作上: new Vue({ el: '#app' }) 注册组件并使用—— 全局注册 通过Vue.comp ...
- 详解Vue大护法——组件
1.什么是组件化 人面对复杂问题的处理方式: 任何一个人处理信息的逻辑能力都是有限的 所以,当面对一个非常复杂的问题时,我们不太可能一次性搞定一大堆的内容. 但是,我们人有一种天生的能力,就是将问题进 ...
- vue单文件组件形成父子(子父)组件之间通信(vue父组件传递数据给子组件,子组件传递数据给父组件)
看了很多文章,官网文档也有看,对父子组件通信说的不是很明白:决定自己总结一下: vue一般都使用构建工具构建项目:这样每个组件都是单文件组件:而网上很多文章都是script标签方式映入vue,组件通信 ...
随机推荐
- ref:Struts2 命令执行系列回顾
ref:http://www.zerokeeper.com/vul-analysis/struts2-command-execution-series-review.html Struts2 命令执行 ...
- Linux修复文件系统
注意:修复有风险,操作需谨慎.风险一定要说明啊! 由于还没遇到过,我就当网上找了一张图. 如果在启动时,出现了如上图红色框内的RUN fsck MANUALLY,那么一般是文件系统有问题. 最下面提示 ...
- poj2485(Kruskal)
这道题显然是一道最小生成树的问题,参考算法导论中的Kruskal方法,先对路径长度进行排序,然后使用并查集(Disjoint Set Union)来判断节点是否连通,记录连接所有节点的最后一条路径的长 ...
- MAC OS 10.10.5虚拟机免费下载(可安装Xcode7)
MAC OS 10.10.5虚拟机免费下载(可安装Xcode7) MAC OS 10.10.5虚拟机免费(可安装Xcode7)下载地址:链接: http://pan.baidu.com/s/1dD ...
- HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]
题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点 ...
- 【BZOJ 3997】 3997: [TJOI2015]组合数学 (DP| 最小链覆盖=最大点独立集)
3997: [TJOI2015]组合数学 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 919 Solved: 664 Description 给出 ...
- luogu P1919 【模板】A*B Problem升级版(FFT快速傅里叶)
模板 嗯 做多项式乘法,进位 没了 #include<cmath> #include<cstdio> #include<cstring> #include<a ...
- [POJ1625]Censored!(AC自动机+DP+高精度)
Censored! Time Limit: 5000MS Memory Limit: 10000K Total Submissions: 10824 Accepted: 2966 Descri ...
- hdu 3046 最小割
每个栅栏其实就是一条边,修一些栅栏,使得狼不能抓到羊,其实就是求一个割,使得羊全在S中,狼全在T中. #include <cstdio> #include <cstring> ...
- 实用在线小工具 -- JS代码压缩工具
实用在线小工具 -- JS代码压缩工具 将JS代码进行压缩可以减少内存占用,下面链接是一个在线JS代码压缩工具,它将多余的空格和换行符压缩了. JS代码压缩工具链接:http://jspack ...