案例一

  父组件parent.vue

  1. // asyncData为异步获取的数据,想传递给子组件使用
  2. <template>
  3. <div>
  4. 父组件
  5. <child :child-data="asyncData"></child>
  6. </div>
  7. </template>
  8.  
  9. <script>
  10. import child from './child'
  11. export default {
  12. data: () => ({
  13. asyncData: ''
  14. }),
  15. components: {
  16. child
  17. },
  18. created () {
  19. },
  20. mounted () {
  21. // setTimeout模拟异步数据
  22. setTimeout(() => {
  23. this.asyncData = 'async data'
  24. console.log('parent finish')
  25. }, )
  26. }
  27. }
  28. </script>

  子组件child.vue

  1. <template>
  2. <div>
  3. 子组件{{childData}}
  4. </div>
  5. </template>
  6.  
  7. <script>
  8. export default {
  9. props: ['childData'],
  10. data: () => ({
  11. }),
  12. created () {
  13. console.log(this.childData) // 空值
  14. },
  15. methods: {
  16. }
  17. }
  18. </script>

  上面按照这里的解析,子组件的html中的{{childData}}的值会随着父组件的值而改变,但是created里面的却不会发生改变(生命周期问题)

案例二

  parent.vue

  1. <template>
  2. <div>
  3. 父组件
  4. <child :child-object="asyncObject"></child>
  5. </div>
  6. </template>
  7.  
  8. <script>
  9. import child from './child'
  10. export default {
  11. data: () => ({
  12. asyncObject: ''
  13. }),
  14. components: {
  15. child
  16. },
  17. created () {
  18. },
  19. mounted () {
  20. // setTimeout模拟异步数据
  21. setTimeout(() => {
  22. this.asyncObject = {'items': [, , ]}
  23. console.log('parent finish')
  24. }, )
  25. }
  26. }
  27. </script>

  child.vue

  1. <template>
  2. <div>
  3. 子组件<!--这里很常见的一个问题,就是{{childObject}}可以获取且没有报错,但是{{childObject.items[]}}不行,往往有个疑问为什么前面获取到值,后面获取不到呢?-->
  4. <p>{{childObject.items[]}}</p>
  5. </div>
  6. </template>
  7.  
  8. <script>
  9. export default {
  10. props: ['childObject'],
  11. data: () => ({
  12. }),
  13. created () {
  14. console.log(this.childObject) // 空值
  15. },
  16. methods: {
  17. }
  18. }
  19. </script>

  created里面的却不会发生改变, 子组件的html中的{{{childObject.items[0]}}的值虽然会随着父组件的值而改变,但是过程中会报错

  1. // 首先传过来的是空,然后在异步刷新值,也开始时候childObject.items[0]等同于''.item[0]这样的操作,
    所以就会报下面的错
  2. vue.esm.js?: [Vue warn]: Error in render function:
    "TypeError: Cannot read property '0' of undefined"

针对二的解决方法:

1、使用v-if可以解决报错问题,和created为空问题

  1. // parent.vue
  2. <template>
  3. <div>
  4. 父组件
  5. <child :child-object="asyncObject" v-if="flag"></child>
  6. </div>
  7. </template>
  8.  
  9. <script>
  10. import child from './child'
  11. export default {
  12. data: () => ({
  13. asyncObject: '',
  14. flag: false
  15. }),
  16. components: {
  17. child
  18. },
  19. created () {
  20. },
  21. mounted () {
  22. // setTimeout模拟异步数据
  23. setTimeout(() => {
  24. this.asyncObject = {'items': [, , ]}
  25. this.flag = true
  26. console.log('parent finish')
  27. }, )
  28. }
  29. }
  30. </script>
  1. //child.vue
  2. <template>
  3. <div>
  4. 子组件//不报错
  5. <p>{{childObject.items[]}}</p>
  6. </div>
  7. </template>
  8.  
  9. <script>
  10. export default {
  11. props: ['childObject'],
  12. data: () => ({
  13. }),
  14. created () {
  15. console.log(this.childObject)// Object {items: [1,2,3]}
  16. },
  17. methods: {
  18. }
  19. }
  20. </script>

2、子组件使用watch来监听父组件改变的prop,使用methods来代替created

  1. <template>
  2. <div>
  3. 子组件<!---->
  4. <p>{{test}}</p>
  5. </div>
  6. </template>
  7.  
  8. <script>
  9. export default {
  10. props: ['childObject'],
  11. data: () => ({
  12. test: ''
  13. }),
  14. watch: {
  15. 'childObject.items': function (n, o) {
  16. this.test = n[]
  17. this.updata()
  18. }
  19. },
  20. methods: {
  21. updata () { // 既然created只会执行一次,但是又想监听改变的值做其他事情的话,只能搬到这里咯
  22. console.log(this.test)//
  23. }
  24. }
  25. }
  26. </script>

3、子组件watch computed data 相结合,有点麻烦

  1. <template>
  2. <div>
  3. 子组件<!--这里很常见的一个问题,就是{{childObject}}可以获取且没有报错,但是{{childObject.items[0]}}不行,
    往往有个疑问为什么前面获取到值,后面获取不到呢?-->
  4. <p>{{test}}</p>
  5. </div>
  6. </template>
  7.  
  8. <script>
  9. export default {
  10. props: ['childObject'],
  11. data: () => ({
  12. test: ''
  13. }),
  14. watch: {
  15. 'childObject.items': function (n, o) {
  16. this._test = n[]
  17. }
  18. },
  19. computed: {
  20. _test: {
  21. set (value) {
  22. this.update()
  23. this.test = value
  24. },
  25. get () {
  26. return this.test
  27. }
  28. }
  29. },
  30. methods: {
  31. update () {
  32. console.log(this.childObject) // {items: [1,2,3]}
  33. }
  34. }
  35. }
  36. </script>

4、使用emit,on,bus相结合

  1. <template>
  2. <div>
  3. 子组件
  4. <p>{{test}}</p>
  5. </div>
  6. </template>
  7.  
  8. <script>
  9. export default {
  10. props: ['childObject'],
  11. data: () => ({
  12. test: ''
  13. }),
  14. created () {
  15. // 绑定
  16. this.$bus.on('triggerChild', (parmas) => {
  17. this.test = parmas.items[] //
  18. this.updata()
  19. })
  20. },
  21. methods: {
  22. updata () {
  23. console.log(this.test) //
  24. }
  25. }
  26. }
  27. </script>

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

5、使用prop default来解决{{childObject.items[0]}}

  1. <template>
  2. <div>
  3. 父组件
  4. <child :child-object="asyncObject"></child>
  5. </div>
  6. </template>
  7.  
  8. <script>
  9. import child from './child'
  10. export default {
  11. data: () => ({
  12. asyncObject: undefined // 这里使用null反而报0的错
  13. }),
  14. components: {
  15. child
  16. },
  17. created () {
  18. },
  19. mounted () {
  20. // setTimeout模拟异步数据
  21. setTimeout(() => {
  22. this.asyncObject = {'items': [, , ]}
  23. console.log('parent finish')
  24. }, )
  25. }
  26. }
  27. </script>
  1. <template>
  2. <div>
  3. 子组件<!---->
  4. <p>{{childObject.items[]}}</p>
  5. </div>
  6. </template>
  7.  
  8. <script>
  9. export default {
  10. props: {
  11. childObject: {
  12. type: Object,
  13. default () {
  14. return {
  15. items: ''
  16. }
  17. }
  18. }
  19. },
  20. data: () => ({
  21. }),
  22. created () {
  23. console.log(this.childObject) // {item: ''}
  24. }
  25. }
  26. </script>

详解vue父组件传递props异步数据到子组件的问题的更多相关文章

  1. [转]详解vue父组件传递props异步数据到子组件的问题

    原文地址:https://www.cnblogs.com/goloving/p/9114389.html 案例一 父组件parent.vue // asyncData为异步获取的数据,想传递给子组件使 ...

  2. vue中父组件使用props或者$attras向子组件中传值

    知识点:vue中使用props或者$attras向子组件中传值 (1) props传值 子组件必须注册好要传的数据() props:['id'] (2)$attrs传值 该数据在props中,没有注册 ...

  3. vue 父向子组件传递数据,子组件向父组件传递数据方式

    父组件向子组件传递数据通过props,子组件引入到父组件中,设置一个值等于父组件的数据,通过:bind将数据传到子组件中,子组件中通过props接收父组件的数据,这样就可以使用父组件的数据了,循环组件 ...

  4. vue组件详解(二)——使用props传递数据

    在 Vue 中,父子组件的关系可以总结为 props向下传递,事件向上传递.父组件通过 props 给子组件下发数据,子组件通过事件给父组件发送消息.看看它们是怎么工作的.  一.基本用法 组件不仅仅 ...

  5. Vue : props 使用细节(父组件传递数据给子组件)

    props使用细节 在Vue.js中我们可以使用 props 实现父组件传递数据给子组件,下面我们总结一下props的使用细节 1.基础类型检查 2.必填数据 3.默认值 4.自定义验证函数 其中每一 ...

  6. Vue 父组件ajax异步更新数据,子组件props获取不到

    转载 https://blog.csdn.net/d295968572/article/details/80810349 当父组件 axjos 获取数据,子组件使用 props 接收数据时,执行 mo ...

  7. 【Vue】详解Vue组件系统

    Vue渲染的两大基础方式 new 一个Vue的实例 这个我们一般会使用在挂载根节点这一初始化操作上: new Vue({ el: '#app' }) 注册组件并使用—— 全局注册 通过Vue.comp ...

  8. 详解Vue大护法——组件

    1.什么是组件化 人面对复杂问题的处理方式: 任何一个人处理信息的逻辑能力都是有限的 所以,当面对一个非常复杂的问题时,我们不太可能一次性搞定一大堆的内容. 但是,我们人有一种天生的能力,就是将问题进 ...

  9. vue单文件组件形成父子(子父)组件之间通信(vue父组件传递数据给子组件,子组件传递数据给父组件)

    看了很多文章,官网文档也有看,对父子组件通信说的不是很明白:决定自己总结一下: vue一般都使用构建工具构建项目:这样每个组件都是单文件组件:而网上很多文章都是script标签方式映入vue,组件通信 ...

随机推荐

  1. ref:Struts2 命令执行系列回顾

    ref:http://www.zerokeeper.com/vul-analysis/struts2-command-execution-series-review.html Struts2 命令执行 ...

  2. Linux修复文件系统

    注意:修复有风险,操作需谨慎.风险一定要说明啊! 由于还没遇到过,我就当网上找了一张图. 如果在启动时,出现了如上图红色框内的RUN fsck MANUALLY,那么一般是文件系统有问题. 最下面提示 ...

  3. poj2485(Kruskal)

    这道题显然是一道最小生成树的问题,参考算法导论中的Kruskal方法,先对路径长度进行排序,然后使用并查集(Disjoint Set Union)来判断节点是否连通,记录连接所有节点的最后一条路径的长 ...

  4. MAC OS 10.10.5虚拟机免费下载(可安装Xcode7)

    MAC OS 10.10.5虚拟机免费下载(可安装Xcode7)   MAC OS 10.10.5虚拟机免费(可安装Xcode7)下载地址:链接: http://pan.baidu.com/s/1dD ...

  5. HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]

    题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点 ...

  6. 【BZOJ 3997】 3997: [TJOI2015]组合数学 (DP| 最小链覆盖=最大点独立集)

    3997: [TJOI2015]组合数学 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 919  Solved: 664 Description 给出 ...

  7. luogu P1919 【模板】A*B Problem升级版(FFT快速傅里叶)

    模板 嗯 做多项式乘法,进位 没了 #include<cmath> #include<cstdio> #include<cstring> #include<a ...

  8. [POJ1625]Censored!(AC自动机+DP+高精度)

    Censored! Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 10824   Accepted: 2966 Descri ...

  9. hdu 3046 最小割

    每个栅栏其实就是一条边,修一些栅栏,使得狼不能抓到羊,其实就是求一个割,使得羊全在S中,狼全在T中. #include <cstdio> #include <cstring> ...

  10. 实用在线小工具 -- JS代码压缩工具

        实用在线小工具 -- JS代码压缩工具 将JS代码进行压缩可以减少内存占用,下面链接是一个在线JS代码压缩工具,它将多余的空格和换行符压缩了. JS代码压缩工具链接:http://jspack ...