问题:

parent.vue
<template>
<div>
父组件
<child :childObject="asyncObject"></child>
</div>
</template> <script>
import child from './child'
export default {
data: () => ({
asyncObject: ''
}),
components: {
child
},
created () {
},
mounted () {
// setTimeout模拟异步数据
setTimeout(() => {
this.asyncObject = {'items': [1, 2, 3]}
console.log('parent finish')
}, 2000)
}
}
</script> child.vue <template>
<div>
子组件<!--这里很常见的一个问题,就是{{childObject}}可以获取且没有报错,但是{{childObject.items[0]}}不行,往往有个疑问为什么前面获取到值,后面获取不到呢?-->
<p>{{childObject.items[0]}}</p>
</div>
</template> <script>
export default {
props: ['childObject'],
data: () => ({
}),
created () {
console.log(this.childObject) // 空值
},
methods: {
}
}
</script>
通常用v-if 解决 报错问题,以及create 的时候,childObject 值为空的问题

方式一 用 v-if 解决

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': [1, 2, 3]}
this.flag = true
console.log('parent finish')
}, 2000)
}
}
</script> child.vue
<template>
<div>
子组件
<!--不报错-->
<p>{{childObject.items[0]}}</p>
</div>
</template> <script>
export default {
props: ['childObject'],
data: () => ({
}),
created () {
console.log(this.childObject)// Object {items: [1,2,3]}
},
methods: {
}
}
</script>

方式二 用emit,on,bus组合使用

parent.vue

<template>
<div>
父组件
<child></child>
</div>
</template> <script>
import child from './child'
export default {
data: () => ({
}),
components: {
child
},
mounted () {
// setTimeout模拟异步数据
setTimeout(() => {
// 触发子组件,并且传递数据过去
this.$bus.emit('triggerChild', {'items': [1, 2, 3]})
console.log('parent finish')
}, 2000)
}
}
</script> child.vue
<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] // 1
this.updata()
})
},
methods: {
updata () {
console.log(this.test) // 1
}
}
}
</script>
这里使用了bus这个库,parent.vue和child.vue必须公用一个事件总线(也就是要引入同一个js,这个js定义了一个类似let bus = new Vue()的东西供这两个组件连接),才能相互触发 (ps:代码如下,需要安装依赖)
import VueBus from 'vue-bus'
Vue.use(VueBus)

最新文章

  1. Web前端开发css基础样式总结
  2. OC NSFileHandle(文件内容操作)
  3. Python 2.7下载地址
  4. typedef使用大全(转)
  5. 语义化的html结构的好处
  6. EditText图文混排
  7. Bootstrap强调内容
  8. 微软发布屏蔽Win10升级的官方办法
  9. Codeblocks快捷键
  10. eclipse复制到IDEA中文不匹配,编译失败
  11. python&amp;JSONP(Jquery篇)
  12. 深入理解CADisplayLink和NSTimer
  13. Spring模块介绍
  14. 安装SDL遇到的问题
  15. Android UiAutomator
  16. selenium_webdriver(python)控制浏览器滚动条
  17. 01-jQuery的介绍
  18. pandas merge
  19. python subprocess 模块
  20. Example of assigning attributes directly to an object name

热门文章

  1. Emacs中编辑保存makefile文件时会错误地将TAB转成空格的解决方法
  2. 枚举Enum转换为List,获取枚举的描述
  3. [mysql]设置Ubuntu上的MySQL可以远程访问
  4. nignx reload的时候报错invalid PID number
  5. USB相关注册表
  6. android Service 的简单使用(转)
  7. BUILDING ANGULAR APPS USING FLUX ARCHITECTURE
  8. 百度地图 Javascript API 笔记
  9. SCI EI期刊
  10. ubuntu 安装 zend studio