无效的道具:VueJS中的类型检查失败错误

时间:2019-06-13 12:02:54

标签: vue.js vue-component

我正在尝试使用名为CardRenderer.vue的组件,该组件使用对象数组来呈现卡。我再次使用相同的组件来呈现数据。我遇到此错误“ [Vue警告]:道具无效:尝试从组件传递道具时,道具“ renderData”的类型检查失败。

我尝试传递不同的值和不同的类型,但这没用。

代码如下:

CardRenderer.vue

<template lang="html">

  <div>       
    <b-container class="bv-example-row">      
       <b-row v-for="(row, i) of rows" v-bind:key="i">       
          <b-col v-for="(item, j) of row" v-bind:key="j" >

                    <!-- you card -->
              <b-card 
                :title="item.title" 
                img-src="item.icon" 
                img-alt="Image" 
                img-top 
                tag="article" 
                style="max-width: 20rem;" 
                class="mb-2"
              >
                <b-card-text>
                  <h1>{{item.name}}</h1>
                  <pre>{{item.description}}</pre>
                </b-card-text>
                  <b-button :href="'/dashboard/'+item.name" variant="primary">More</b-button>
              </b-card>                
          </b-col>
        </b-row>
    </b-container>    
  </div>

</template>

<script lang="js">
  export default  {
    name: 'CardRenderer',
    props: {
      renderData: []
    },
     data() {
      return {
        rows: null
      }
    },
    mounted() {

      const itemsPerRow = 3
      let rowss = []
      let arr = this.renderData
      // eslint-disable-next-line
      // console.log(this.renderData)
      for (let i = 0; i < arr.length; i += itemsPerRow){
          let row = []
          for (let z = 0; z < itemsPerRow; z++) {
            row.push(arr[z])
          }
          rowss.push(row)
      }


      this.rows = rowss

      // eslint-disable-next-line                
      console.log(this.rows) 

    },

    methods: {

    },
    computed: {
      //  rows() {
      //  }

    }
  }
</script>

<style scoped>

</style>

CardGrouper.vue:

<template lang="html">

  <div  class = "full" >

    <div class="h-50" style=" background-color: #C8544F">
      <h1 align="center">{{$store.getters.responseAPI.title}} </h1>

      <CardRenderer :renderData=this.$store.getters.responseAPI.apps />
    </div>

  </div>

</template>

<script>
import CardRenderer from "./CardRenderer.vue"
/* eslint-disable */
  export default  {
    name: 'CardGrouper',
    components: {
      CardRenderer
    },
    props: [],
    mounted() {

    },
    data() {
      return {

      }
    },
    methods: {

    },
    computed: {

    }
}
</script>

<style scoped >
  .full{
    width: 100vw;
    height: 90vh;
    background: linear-gradient(to bottom, Red 30%, white 50%);
}
</style>

Something.vue

<template lang="html">
    <!-- <h1>Something</h1> -->
    <CardRenderer :renderData=valObj />
</template>

<script lang="js">
import CardRenderer from './CardRenderer'

    export default  {
        name: 'something',
        components: {
            CardRenderer
        },
        props: [],

        data() {
            return {
                valObj: []
            }
        },
        mounted() {
            let key = this.findUrl()
            let value = this.$store.getters.responseAPI.apps.filter((elem) => {
                if(elem.name == key) return elem.apps
            })

            if (value.length > 0)
                this.valObj = value[0].apps
            //eslint-disable-next-line
            console.log(this.valObj)
        },
        methods: {
            findUrl() {
                let url  = window.location.pathname.split("/").slice(-1)[0];
                return url
            }       
        },
        computed: {

        }
    }
</script>

<style scoped >
  .something {

  }
</style>

我遇到此错误。 看起来像这样。 enter image description here

这是我从Something.vue作为道具传递的数据 enter image description here

value的样子 enter image description here

Something.vue某处生成了错误。 我正在传递对象数组作为道具。 我如何纠正此错误,使其正常工作。

3 个答案:

答案 0 :(得分:1)

renderData类型设置为Array,默认值设置为[]

props: {
  renderData: {
    type: Array,
    deafult: () => []
  }
}

答案 1 :(得分:0)

似乎您正在将renderData道具定义为数组[],但可能正在向其传递对象或其他东西。

要么简化并做...

props: ['renderData']

或者如果您要向其传递对象。

    props: {
         renderData: {
            type: Object,
          }
     }

如果它是对象数组,那么..

 props: {
     renderData: {
        type: Array,
        default: () => [{}];
      }

答案 2 :(得分:0)

仅用于文档。

    // Object with a default value
propE: {
  type: Object,
  // Object or array defaults must be returned from
  // a factory function
  default: function () {
    return { message: 'hello' }
  }
},

这是在vue prop documentation