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

Nuxt3中组件混用<script setup>与普通<script>导致props异常

问题原因与解决思路

问题根源

你遇到的问题核心在于:<script setup> 和普通 <script> 共存时,组件的 props 最终由 <script setup> 里的 defineProps 决定。之前你在普通 <script> 里单独定义 placeholder props,但 <script setup> 中未声明该属性,导致普通 <script> 里的 props 定义不生效——组件实际只识别 <script setup> 中声明的 modelValue,所以 mounted 钩子中打印的 placeholder 为 undefined。

而移除 <script setup> 后,组件的 props 由普通 <script> 定义接管,自然能正常获取父组件传递的值。

正确实现方案

所有 props 统一在 <script setup> 中用 defineProps 声明,普通 <script> 仅用来补充生命周期钩子、组件选项等逻辑,直接通过组件实例访问 props 即可。

子组件 MyInput.vue 示例代码

<script setup>
// 统一声明所有需要的 props
const props = defineProps({
  modelValue: String,
  placeholder: String
})

// 声明 v-model 所需的 emit 事件
const emit = defineEmits(['update:modelValue'])
</script>

<script>
export default {
  mounted() {
    // 通过 this.$props 访问已声明的 props
    console.log('placeholder:', this.$props.placeholder)
  }
}
</script>

<template>
  <input 
    :value="modelValue" 
    @input="emit('update:modelValue', $event.target.value)" 
    :placeholder="placeholder" 
  />
</template>

关键说明

Vue 文档中提到的「两者可共存」,是指普通 <script> 可用来定义 <script setup> 无法覆盖的组件选项(如自定义组件名、全局混入、特定生命周期逻辑),但props 必须统一在 <script setup> 中通过 defineProps 声明——这是因为 defineProps 是编译时宏,会直接整合到组件的最终 props 配置中,普通 <script> 里的重复 props 定义会被忽略或覆盖,尤其在 Nuxt3 的编译环境下表现更明显。

内容的提问来源于stack exchange,提问作者americanknight

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 03:10:01