使用Vue的props进行组件传递校验时出现 Extraneous non-props attributes的解决方案

作者:CSDN-PleaSure乐事

欢迎大家阅读我的博客 希望大家喜欢

使用环境:WebStorm

目录

出现错误的情况

报错:

代码:

报错截图

原因分析

解决方案

方法一

方法二


出现错误的情况

以下是我遇到该错误时遇到的报错和代码:

报错:

Debug vite connecting... (client, line 495) Debug vite connected. (client, line 614) Warning Vue warn: Extraneous non-props attributes (title) were passed to component but could not be automatically inherited because component renders fragment or text or teleport root nodes. (9) (vue.js, line 2116) " " " at <ComponentB" "title=30" ">" " " " at <ComponentA" ">" " " " at <App>" Warning Vue warn: Extraneous non-props attributes (title) were passed to component but could not be automatically inherited because component renders fragment or text or teleport root nodes. (9) (vue.js, line 2116) " " " at <ComponentB" "title=\"Hello World\"" ">" " " " at <ComponentA" ">" " " " at <App>"的错误

代码:

App.vue

javascript 复制代码
<template>
  <componentA />
</template>
<script>
import componentA from "@/components/componentA.vue";
  export default {
    data() {
      return {

      }
    },
    components:{
      componentA
    }
  }
</script>

componentA.vue

javascript 复制代码
<template>
  <h3>{{ componentName }}</h3>
  <ComponentB :title="titleOne" />
  <ComponentB :title="titleTwo" />
</template>

<script>
import ComponentB from "@/components/componentB.vue";

export default {
  data() {
    return {
      componentName: 'this is componentA',
      titleOne: 30,
      titleTwo: "Hello World"
    };
  },
  components: {
    ComponentB
  }
};
</script>

componentB.vue

javascript 复制代码
<template>
  <h3>{{componentName}}</h3>
  <p>{{titleOne}}</p>
  <p>{{titleTwo}}</p>
</template>
<script>
export default {
  data(){
    return {
      componentName: 'this is componentB'
    }
  },
  props:{
    titleOne:{
      type:[String,Array,Number]
    },
    titleTwo:{
      type:String
    }
  }
}
</script>

报错截图

原因分析

问题的主要原因在于 componentB.vue 中定义的 props (titleOne, titleTwo) 与 componentA.vue 中传递的属性 (title) 不匹配。具体来说:

在 componentA.vue 中,您通过 :title="titleOne" 和 :title="titleTwo" 向 ComponentB 传递了 title 属性。

然而,在 componentB.vue 中,您定义的是 titleOne 和 titleTwo 作为 props,而不是 title。

因此,当 componentA.vue 尝试将 title 属性传递给 ComponentB 时,ComponentB 并没有定义接收这个属性的 prop,导致 Vue 抛出警告,表示这些非 prop 属性无法自动继承。

解决方案

方法一

要解决这个问题,需要确保 componentA.vue 传递的属性名称与 componentB.vue 定义的 props 名称相匹配。以下是两种解决方案。

如果希望保留 componentB.vue 的当前 props 结构(即 titleOne 和 titleTwo),那么需要相应地调整 componentA.vue,以传递正确的属性名,即修改componentA.vue中template的结构

javascript 复制代码
<template>
  <h3>{{ componentName }}</h3>
  //把原来的title分别变成了title-one和title-two
  <ComponentB :title-one="titleOne" />
  <ComponentB :title-two="titleTwo" />
</template>
//下面的内容不变
<script>
import ComponentB from "@/components/componentB.vue"; // 使用 PascalCase

export default {
  data() {
    return {
      componentName: 'this is componentA',
      titleOne: 30,
      titleTwo: "Hello World"
    };
  },
  components: {
    ComponentB
  }
};
</script>

需要注意的是,当在模板中使用 kebab-case(如 :title-one)时,Vue 会自动将其转换为 camelCase(如 titleOne)来匹配 JavaScript 中的对象键名。

方法二

可以只定义一个 title的prop,并且在 componentA.vue 中两次传递 title 属性,即修改compnentB.vue的内容,删去titleOne和titleB当中的一个,保留另一个并改为title即可

javascript 复制代码
<template>
  <h3>{{componentName}}</h3>
  <p>{{title}}</p>
</template>
<script>
export default {
  data(){
    return {
      componentName: 'this is componentB'
    }
  },
  props:{
    title:{
      type:[String,Array,Number]
    }
  }
}
</script>

这样问题就解决了,希望对大家有帮助。

作者:CSDN-PleaSure乐事

希望我的博客对您有帮助,也希望在对您有帮助时您可以为我留下点赞收藏与关注,这对我真的很重要,谢谢!

相关推荐
大纽耶耶1 小时前
我把 YOLO 训练做成了网页版:需求设计与技术选型
vue.js
大纽耶耶1 小时前
开发 YOLO 训练管理平台的 23 个实践教训
vue.js
Maynor在掘金1 小时前
1.9 万 Star 的 Hypit:让 AI Agent 帮你“一键复刻”爆款视频,保姆级上手教程
vue.js·github
ym hyd 1111 小时前
门诊挂号系统源码 Java+SpringBoot+Vue3 前后分离
java·vue.js·spring boot·毕设
斯内普吖2 小时前
(开源)宠物饲养系统实战指南 基于 Java + SSM + Vue + MySQL
java·vue.js·mysql·开源·宠物
可乐鸡翅yeah_3 小时前
新手梳理:HLS 线上问题,哪些该提给 CDN,哪些该找后端切片服务
开发语言·前端·javascript·vue.js·网络协议·http·m3u8在线
Q26433650233 小时前
【有源码】基于SpringBoot+Vue的博物馆展览与服务一体化平台-java博物馆数字化展品展示与交互平台设计
java·vue.js·spring boot·spring·毕业设计·javaweb·课程设计
ym hyd 1114 小时前
汽车零部件缺陷管理系统源码 Java+SpringBoot+Vue3 前后分离
java·vue.js·spring boot·汽车·毕设
vx_Biye_Design5 小时前
springboot小区管理系统68491-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·课程设计·express
薛一半5 小时前
React-Redux三重优化实战揭秘
javascript·vue.js·react.js