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

Passing data from parent component to a child component

我有一个父组件如下

<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>

和子 "mappings" 组件如下

<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>

和子 "mappings" 组件如下

<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); 时,我都会得到 undefined.. 你能告诉我我在这里做错了什么吗?

谢谢

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

您应该使用 v-bind

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

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);
    }

这每次都会return清空数组。因为 mappingList 通过 AJAX 改变了,并且在调用 created() 之后发生了变化。尝试使用 vue-devtool (chrome plugin) 以获得更好的调试体验。

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

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

文档是 here.