[Vue 警告]:无效的道具:道具“值”的类型检查失败。预期的数组,得到值为 1 的数字

Posted

技术标签:

【中文标题】[Vue 警告]:无效的道具:道具“值”的类型检查失败。预期的数组,得到值为 1 的数字【英文标题】:[Vue warn]: Invalid prop: type check failed for prop "value". Expected Array, got Number with value 1 【发布时间】:2021-11-15 08:44:17 【问题描述】:

我有一个类型号的输入,我想让它在输入中不能打印大于 10 的数字,一切对我来说都很好,直到我用数组替换了这个值(之前 value: 1 之后值:[1, 1])

更改为数组后,我尝试手动获取数组的第一个数字作为输入的值,但出现错误,不明白如何解决

App.vue

  <div>
    <customInput v-model="value[0]" :max-value="10" />
  </div>


<script>
import customInput from "./components/HelloWorld";

export default 
  name: "App",
  data() 
    return 
      value: [1, 1],
    ;
  ,
  components: 
    customInput,
  ,
;
</script>

HelloWorld.vue

  <div>
    <input :value="value[0]" type="number" @input="onInput" max="10" />
  </div>


<script>
export default 
  props: 
    value: Array,
    maxValue: Number,
  ,
  methods: 
    onInput(event) 
      const newValue = parseInt(event.target.value);
      const clampedValue = Math.min(newValue, this.maxValue);
      this.$emit("input", clampedValue);
      this.$forceUpdate();
    ,
  ,

;
</script>

在我用数组替换“value”之前,一切都对我有用,您也可以查看my code in codesandbox

【问题讨论】:

【参考方案1】:

使用时

<div>
     <customInput v-model="value[0]" :max-value="10" />
</div

在 App.vue 中,您将单个值而不是数组传递给 HelloWorld.vue

因此,要么将组件中的值类型从 Array 更改为 Number,要么更改为:

<div>
     <customInput v-model="value" :max-value="10" />
</div

此外,在 HelloWorld.vue 中,输入类型为 "number",因此即使您将数组传递给组件,您也会收到警告。

那么,您需要将数组传递给子组件吗?

附:在代码框中,您有这一行缺少基础:const newValue = parseInt(event.target.value); 它应该是:const newValue = parseInt(event.target.value, 10);

【讨论】:

【参考方案2】:

您可以将数组中的第一个元素发送到子组件,但您在 props 中以 Number 形式接收它:

Vue.component('custom-input', 
  template: `
    <div>
      <input :value="value" type="number" @input="onInput" :max="maxValue" />
    </div>
  `,
  props: 
    value: Number,
    maxValue: Number,
  ,
  methods: 
    onInput(event) 
      const newValue = parseInt(event.target.value);
      const clampedValue = Math.min(newValue, this.maxValue);
      this.$emit("input", clampedValue);
      this.$forceUpdate();
    ,
  ,
)

new Vue(
  el: '#demo',
  data() 
    return 
      value: [1, 1],
    
  ,
)

Vue.config.productionTip = false
Vue.config.devtools = false
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="demo">
    <custom-input v-model="value[0]" :max-value="10" />
  </div>

【讨论】:

以上是关于[Vue 警告]:无效的道具:道具“值”的类型检查失败。预期的数组,得到值为 1 的数字的主要内容,如果未能解决你的问题,请参考以下文章

如何将 ref 作为道具传递:[Vue 警告]:无效的道具:道具“containerRef”的类型检查失败。预期对象,得到 HTMLDivElement?

Vue Utils 无效的道具

Vue Prop Decorator - 无效的道具类型检查

Vue:无效的道具:类型

Vue.js - 无效的道具:道具“src”的类型检查失败。预期的字符串,对象,得到了 Promise

Vuejs 错误,无效的道具:道具的类型检查失败。预期日期,得到数值