将数据从父组件传递到子组件

时间:2016-06-26 06:21:45

标签: javascript vue.js vue-resource

我有一个父组件如下

<template>
        <div class="row">
            <mappings mapping-list="{{currentMappings}}"></mappings>
        </div>
</template>

<script>
    import Mappings from './content/Mappings.vue';

    export default {
      data () {
       return {
         currentMappings: Array
       }
      },
      created () {
        this.readData();
      },
      methods: {
        readData () {
            this.$http.get('data/Books.xml').then((response)=> {
                var x2js = new X2JS();
                var jsonObj = x2js.xml_str2json( response.body );
                this.getMappings(jsonObj.WAStatus);
            });
        }, 
        getMappings (jsonObj) {
            this.currentMappings = jsonObj.WSSMappings;
        }
      },
      components: { Mappings }
    };
</script>

和子“映射”组件如下

<template>
        <div class="col-lg-4">
            <div class="hpanel stats">
                <div class="panel-body h-200">
                    <div class="stats-title pull-left">
                        <h3>Mappings</h3>
                    </div>
                    <div class="stats-icon pull-right">
                        <img src="images/mappings.png" class="browserLogo">

                    </div>
                    <div class="m-t-xl">
                        <table class="table table-striped table-hover">
                                <tr v-for="mapping in mappingList ">
                                    <td>name - {{$index}}</td>
                                </tr>
                        </table>
                    </div>
                </div>
                <div class="panel-footer">
                    Current WSS - SA Mappings
                </div>
            </div>
        </div>
</template>
<script>
    export default {
        props: {
            mappingList:Array
        },
        created () {
            console.log(this.mappingList);
            // console.log(this.$parent.mappings);
        }
    }
</script>

我无法将数据从父组件传递到子组件。我想在这里使用道具。我得到的错误是

main.js:2756[Vue warn]: Invalid prop: type check failed for prop "mappingList". Expected Array, got String. (found in component: <mappings>)

更新 根据提出的建议,我更新了父组件,如下所示

<template>
        <div class="row">
            <browser-stats></browser-stats>
        </div>
        <div class="row">
            <mappings :mapping-list="currentMappings"></mappings>
        </div>
</template>

<script>

    import Mappings from './content/Mappings.vue';

    export default {
      data () {
       return {
         currentMappings: []
       }
      },
      created () {
        this.readData();
      },
      methods: {
        readData () {
            this.$http.get('data/WA_Status.xml').then((response)=> {
                var x2js = new X2JS();
                var jsonObj = x2js.xml_str2json( response.body );
                this.getMappings(jsonObj.WAStatus);
            });
        }, 
        getMappings (jsonObj) {
            this.currentMappings = jsonObj.WSSMappings;
         console.log(this.currentMappings.length);
        console.log(JSON.stringify(this.currentMappings));
        }
      },
      components: {  Mappings }
    };
</script>

和子“映射”组件如下

<template>
        <div class="col-lg-4">
            <div class="hpanel stats">
                <div class="panel-body h-200">
                    <div class="stats-title pull-left">
                        <h3>Mappings</h3>
                    </div>
                    <div class="stats-icon pull-right">
                        <img src="images/mappings.png" class="browserLogo">

                    </div>
                    <div class="m-t-xl">
                        <table class="table table-striped table-hover">
                                <tr v-for="mapping in mappingList ">
                                    <td>{{mapping._name}}</td>
                                </tr>
                        </table>
                    </div>
                </div>
                <div class="panel-footer">
                    Current WSS - SA Mappings
                </div>
            </div>
        </div>
</template>
<script>
    export default {
        props: {
            mappingList:[]
        }
    }
</script>

但是我得到一个空的mappingList,这意味着每当我做console.log(this.currentMappings.length);时,我都会得到未定义的... 你能告诉我这里我做错了什么吗?

由于

2 个答案:

答案 0 :(得分:1)

您使用字符串插值({{ }})尝试将数据传递给道具 - 但插值会将数组转换为字符串。

您应该使用v-bind

的绑定
<mappings v-bind:mapping-list="currentMappings"></mappings>
...short form:
<mappings :mapping-list="currentMappings"></mappings>

答案 1 :(得分:1)

1)拳头问题

  data () {
   return {
     currentMappings: Array
   }

应该是

  data () {
   return {
     currentMappings: []
   }

2)第二期

<mappings mapping-list="{{currentMappings}}"></mappings>

应该是:

<mappings :mapping-list="currentMappings"></mappings>

3)第三期

    created () {
        console.log(this.mappingList);
        // console.log(this.$parent.mappings);
    }

每次都会返回空数组。因为mappingList通过AJAX进行了更改,并且在created()被调用后它被发现了。尝试使用vue-devtool (chrome plugin)来获得更好的调试体验。

<强>更新: 为了能够观察异步更改(如使用AJAX),请考虑以这种方式使用watch

{
   data(){ 
      //..
   },
   watch:{
      'currentMappings'(val){
          console.log('currentMappings updated', currentMappings);
      }
   }
}

文档为here