为什么在Vue中,当数组初始化并显示输出时,会出现“无法读取未定义的属性”的错误?
P粉642919823
P粉642919823 2023-08-28 23:38:03
[JavaScript讨论组]
<p>我有两个vue文件,App.vue和一个组件UsersPage.vue。</p> <p>UsersPage.vue:</p> <pre class="brush:php;toolbar:false;">&lt;script&gt; export default { data:() =&gt;({ usersList : [] }), methods:{ async createUsersList(){ this.usersList = await fetch(&quot;https://jsonplaceholder.typicode.com/users&quot;).then((response)=&gt; response.json()); } }, created(){ this.createUsersList(); } } &lt;/script&gt; &lt;template&gt; &lt;ul&gt; &lt;li v-for=&quot;user in usersList&quot; :key=&quot;user.id&quot;&gt;&lt;b&gt;姓名:&lt;/b&gt;{{user.name}}, &lt;b&gt;用户名:&lt;/b&gt; {{user.username}},&lt;b&gt;邮编:&lt;/b&gt; {{user.address.street}} &lt;/li&gt; &lt;/ul&gt; &lt;/template&gt;</pre> <p>和App.vue:</p> <pre class="brush:php;toolbar:false;">&lt;script&gt; import UsersPage from &quot;./components/UsersPage.vue&quot; export default { components: { UsersPage, }, data: () =&gt; ({ currentPage: &quot;首页&quot;, }), methods: { showHomePage() { this.currentPage = &quot;首页&quot;; }, showLoginPage() { this.currentPage = &quot;登录&quot;; }, }, }; &lt;/script&gt; &lt;template&gt; &lt;header class=&quot;header&quot;&gt; &lt;span class=&quot;logo&quot;&gt; &lt;img src=&quot;@/assets/vue-heart.png&quot; width=&quot;30&quot; /&gt;C'est La Vue &lt;/span&gt; &lt;nav class=&quot;nav&quot;&gt; &lt;a href=&quot;#&quot; @click.prevent=&quot;showHomePage&quot;&gt;首页&lt;/a&gt; &lt;a href=&quot;#&quot; @click.prevent=&quot;showLoginPage&quot;&gt;登录&lt;/a&gt; &lt;/nav&gt; &lt;/header&gt; &lt;UsersPage/&gt; &lt;/template&gt;</pre> <p>当我运行这个程序时,没有错误,并且输出仍然显示。然而,当我将usersList更改为任何具有任意数量元素的数组(例如<code>usersList:[1,2]</code>),数据仍然以正确的格式显示,但在浏览器的控制台中会出现以下错误:</p> <pre class="brush:php;toolbar:false;">Uncaught TypeError: Cannot read properties of undefined (reading 'street') at UsersPage.vue:19:149 at renderList (runtime-core.esm-bundler.js:2894:22) at Proxy._sfc_render (UsersPage.vue:19:163) at renderComponentRoot (runtime-core.esm-bundler.js:902:44) at ReactiveEffect.componentUpdateFn [as fn] (runtime-core.esm-bundler.js:5615:57) at ReactiveEffect.run (reactivity.esm-bundler.js:187:25) at instance.update (runtime-core.esm-bundler.js:5729:56) at setupRenderEffect (runtime-core.esm-bundler.js:5743:9) at mountComponent (runtime-core.esm-bundler.js:5525:9) at processComponent (runtime-core.esm-bundler.js:5483:17)</pre> <p>为什么会出现这个错误,即使数据正确地呈现并且地址也存在于https://jsonplaceholder.typicode.com/users中?</p>
P粉642919823
P粉642919823

全部回复(1)
P粉087074897

在你的v-for中,你使用了users.address.street

当你将[1, 2]传递给usersList并且Vue通过v-for解析这些项时,它尝试读取每个数字的address.street

因为它们是数字,它们的addressundefined。当你尝试访问undefined的任何属性时,你会得到你正在遇到的错误。

注意:如果你希望你的v-for能够解析没有address的项而不抛出错误,你可以将users.address.street替换为users.address?.street
文档: nullish coalescing operator


另外,你不应该将你的迭代器命名为users,因为这可能会让你或其他需要修改该代码的开发人员对users是什么感到困惑。你应该将其命名为user(例如:v-for="user in usersList" :key="user.id")。
但这并不改变当它是一个数字时,你无法访问它的address.street属性的事实。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号