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

Vue3 $route监听报Cannot read properties of undefined修复

Vue3 路由监听触发空值读取报错解决方案

问题背景

学习VueJS课程时,即使直接复制课程提供的源码,依然会出现课程演示中不存在的异常:

  • 初始状态下应用运行正常:点击导航栏的teams选项,可正常展示所有可用团队的基础信息,以及查看每个团队成员的入口
  • 点击Team2本应跳转至Team2的详情页面,添加$route监听器后导航功能失效,控制台抛出Cannot read properties of undefined错误,运行环境为Vue3

异常代码

添加路由监听器后触发报错的组件完整代码如下:

<template>
<section>
    <h2>{{ teamName }}</h2>
    <ul>
        <user-item
                v-for="member in members"
                :key="member.id"
                :name="member.fullName"
                :role="member.role"
        ></user-item>
    </ul>
</section>
<router-link to="/teams/t2">Team 2</router-link>
</template>

<script>
import UserItem from '../users/UserItem.vue';

export default {
    components: {
        UserItem
    },
    inject: ['users', 'teams'],
    data() {
        return {
            teamName: '',
            members: []
        };
    },
    methods: {
        loadMembersData(route) {
            const teamId = route.params.teamId;
            const selectedTeam = this.teams.find((team) => team.id === teamId);
            const foundMembers = selectedTeam.members;
            const selectedMembers = [];

            for (const member of foundMembers) {
                const selectedUser = this.users.find((user) => user.id === member);
                selectedMembers.push(selectedUser);
            }

            this.members = selectedMembers;
            this.teamName = selectedTeam.name;
        }
    },
    created() {
        this.loadMembersData(this.$route);
    },
    watch: {
        $route(newRoute) {
            this.loadMembersData(newRoute);
        }
    }
};
</script>

<style scoped>
section {
    margin: 2rem auto;
    max-width: 40rem;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26);
    padding: 1rem;
    border-radius: 12px;
}

h2 {
    margin: 0.5rem 0;
}

ul {
    list-style: none;
    margin: 0;
    padding: 0;
}
</style>

问题根因

添加$route监听器后,所有路由变化都会触发loadMembersData方法执行,当路由参数中不存在匹配的teamId时,this.teams.find()会返回undefined,此时直接读取selectedTeam.members属性就会触发空值读取错误。

修复方法

在loadMembersData方法中增加selectedTeam非空判断,只有成功匹配到对应团队数据时,才执行后续成员信息加载逻辑,修复后的方法代码如下:

methods: {
    loadMembersData(route) {
        const teamId = route.params.teamId;
        const selectedTeam = this.teams.find((team) => team.id === teamId);
        if (selectedTeam) {
            const foundMembers = selectedTeam.members;
            const selectedMembers = [];

            for (const member of foundMembers) {
                const selectedUser = this.users.find((user) => user.id === member);
                selectedMembers.push(selectedUser);
            }

            this.members = selectedMembers;
            this.teamName = selectedTeam.name;
        }
    }
},

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:18:15