You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue3+TypeScript组件Props异常:无内容显示且报错求助

你遇到的两个错误都是因为Props的定义和使用方式不符合Vue3语法规范,具体问题和修正方案如下:

错误1:defineProps使用方式错误

你在defineComponent的setup函数里调用defineProps是错误的。defineProps是仅在<script setup>语法中使用的编译器宏,不能在选项式API的setup函数内部调用。在选项式API里,应该通过组件选项的props字段来定义属性。

错误2:TypeError: Cannot read properties of null (reading 'character')

这个错误是因为你允许character为null,但模板中直接引用props.character,如果父组件未传入值或传入了null,就会触发空值读取错误(哪怕只是显示对象本身,初始渲染时也可能因为值为null导致问题),需要添加空值防护逻辑。


修正方案1:保持选项式API写法

<template>
<q-card class="my-card" flat bordered>
    <q-card-section horizontal>
      <q-img class="col-5" src="https://cdn.quasar.dev/img/parallax2.jpg" />
      <!-- 添加v-if做空值防护,避免null渲染报错 -->
      <q-card-section v-if="character"> 
        {{ character }}
        <!-- 若需访问具体属性,用可选链语法:{{ character?.name }} -->
      </q-card-section>
      <!-- 可选:添加空状态提示 -->
      <q-card-section v-else>暂无数据</q-card-section>
    </q-card-section>
  </q-card>
</template>
<script lang="ts">
import { defineComponent, PropType } from 'vue';
import { Character } from './models';

export default defineComponent({
  name: 'CardComponent',
  // 选项式API中,Props定义在组件选项的props字段中
  props: {
    character: {
      type: Object as PropType<Character>,
      default: null, // 允许传入null时设置默认值
      // required: true // 若必须传入该属性,可打开此注释
    }
  },
  setup(props) {
    // setup函数的第一个参数就是Props对象,直接使用即可
    return {
      ...props, // 解构Props,模板中可直接用character而非props.character
      lorem: 'Lorem ipsum dolor sit amet, blah blah blah',
    };
  },
});
</script>
<style lang="sass" scoped>
.my-card
  width: 100%
  max-width: 350px
</style>

修正方案2:改用Vue3推荐的<script setup>语法(更简洁)

这种写法可以直接合法使用defineProps,代码结构更简洁:

<template>
<q-card class="my-card" flat bordered>
    <q-card-section horizontal>
      <q-img class="col-5" src="https://cdn.quasar.dev/img/parallax2.jpg" />
      <q-card-section v-if="character"> 
        {{ character }}
        <!-- 访问属性用可选链:{{ character?.name }} -->
      </q-card-section>
      <q-card-section v-else>暂无数据</q-card-section>
    </q-card-section>
  </q-card>
</template>
<script setup lang="ts">
import { PropType } from 'vue';
import { Character } from './models';

// 在<script setup>中直接使用defineProps定义Props
const props = defineProps({
  character: {
    type: Object as PropType<Character>,
    default: null
  }
});

// 解构Props,模板中直接使用character
const { character } = props;

const lorem = 'Lorem ipsum dolor sit amet, blah blah blah';
</script>
<style lang="sass" scoped>
.my-card
  width: 100%
  max-width: 350px
</style>

内容的提问来源于stack exchange,提问作者Otorrinolaringologista -man

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 22:22:27