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

Vue 3中Props未正确传递给子组件的问题求助

Vue3中对象Props传递异常:子组件接收到数组而非预期对象

问题根源

你遇到的核心问题是响应式丢失+初始类型不匹配:

  • 父组件里currentRoom用普通let声明,Vue无法追踪它的变化——哪怕你在setRoom里把它赋值为目标对象,这个更新也不会通知子组件。
  • 初始时currentRoom被设为空数组[],子组件初始化时会先接收到这个数组;后续即使currentRoom变成对象,因为不是响应式变量,子组件不会同步更新props值。
  • 另外,<script setup>中不需要调用defineComponent注册组件,直接导入即可,这个调用完全多余。

解决方案

  1. 用Vue3的ref定义响应式变量,让Vue能追踪currentRoom的变化;
  2. 修正currentRoom的初始值类型,和预期的对象类型一致(比如设为null);
  3. 移除无用的defineComponent调用;
  4. 确保父组件中导入axios(否则会出现axios is not defined错误)。

修正后的代码示例

container.vue

<template>
    <AppLayout title="Dashboard">
        <template #header>
            <h2 class="font-semibold text-xl text-gray-800 leading-tight">
                Chat
            </h2>
        </template>

        <div class="py-12">
            <div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
                <div class="bg-white overflow-hidden shadow-xl sm:rounded-lg">
                    <message-container :room="currentRoom"/>
                    <input-message :currentRoom="currentRoom" :customText="'blablabla'"/>
                </div>
            </div>
        </div>
    </AppLayout>
</template>

<script setup>
import AppLayout from '../../Layouts/AppLayout.vue';
import MessageContainer from "./messageContainer.vue";
import InputMessage from "./inputMessage.vue";
import { ref } from "vue";
import axios from 'axios'; // 必须导入axios

// 用ref定义响应式变量,初始值设为null(匹配预期的对象类型)
let chatRooms = ref([]);
let currentRoom = ref(null);
let messages = ref([]);

const getRooms = () => {
    axios.get('/chat/rooms')
    .then( response => {
        chatRooms.value = response.data;
        setRoom(response.data[0]);
    })
    .catch(error => {
        console.log(error);
    })
}

const setRoom = (room) => {
    currentRoom.value = room;
    console.log(currentRoom.value)
    getMessages();
}

const getMessages = () => {
    if (!currentRoom.value) return; // 避免初始为null时的报错
    axios.get('/chat/rooms/' + currentRoom.value.id + '/messages')
    .then(response => {
        messages.value = response.data;
    })
    .catch(error => {
        console.log(error);
    });
}

getRooms();
</script>

inputMessage.vue(可选优化)

<template>
    <div class="relative h-10 m-1">
        <div style="border-top: 1px solid #e6e6e6;" class="grid grid-cols-6">
            <input
                type="text"
                v-model="message"
                @keyup.enter="sendMessage"
                placeholder="Say something..."
                class="col-span-5 outline-none p-1"
            />
            <button
                @click="sendMessage"
                class="place-self-end bg-gray-500 hover:bg-blue-700 p-1 mt-1 rounded text-white">
                Send
            </button>
        </div>
    </div>
</template>

<script setup>
import { ref, watch } from 'vue';

const props = defineProps({
    currentRoom: {
        type: Object,
        required: true,
        default: () => ({})
    }
});

// 用watch监听props变化,确保能拿到最新值
watch(() => props.currentRoom, (newRoom) => {
    console.log('最新的currentRoom:', newRoom);
}, { immediate: true });

const message = ref('');
const sendMessage = () => {
    console.log('发送消息到房间:', props.currentRoom);
    message.value = '';
}
</script>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:00:53