vue.js - 为什么我的计算未定义
问题描述
我创建了一个应用程序,它使用 axios (+vue-axios) 从 JSON 文件获取数据到 Vuex 存储。我还将 Vue-Router 用于我的应用程序的不同视图。
- 在我的主要组件(
App.vue
)中,我显示<router-view>
- 我的视图组件是
Slides.vue
2.
created()
我什么时候做created(): { this.$http.get('./static/data/slides.json') .then(({ data }) => { this.$store.state.slides = data; }) .catch((error) => { console.log(error); }); },
在那个组件中 (
Slides.vue
) 有Slide.vue
组件获得:slides="slides"
道具:<Slide :slides="slides" />
在里面
Slide.vue
我有<script>
:props: ['slides'], computed: { slideId() { return this.$store.state.activeSlide; }, slide() { return this.slides[this.slideId]; }, slideTitle() { return this.slide.title; }, },
在
<template>
我{{ slideTitle }}
用来显示标题
当我尝试运行它时,出现以下错误Slide.vue
:
[Vue 警告]:渲染错误:“TypeError:this.slide 未定义”
为什么会这样?
当我更改this.slide.title
为this.slide
它似乎可以工作(但显示来自 JSON 文件的所有数据,这不是我想要的)
解决方案
我认为问题与在解决对商店this.slideId
的调用之前未定义有关 - 或在任何时候 - 。created()
这会导致计算属性slide
为undefined
- 因为它解析为this.slides[undefined]
。最后,计算属性slideTitle
解析为undefined.title
,从而引发错误。
如果我是对的,您可以通过slideTitle()
如下修改计算属性来解决此问题:
slideTitle() { return this.slide && this.slide.title; }
created()
这么说,当你这样做时,你的钩子有问题:
this.$store.state.slides = data;
您正在直接操纵商店状态。这是 vuex 禁止的,会导致各种错误。相反,您应该使用突变来修改存储状态。
推荐阅读
- python - Matplotlib - 如何定义具有不同间隔的 x 轴,如下图所示?我想打开某些间隔
- java - 从代表不同类的多个 YAML 文档中解析单个 POJO
- c# - “无法加载关联的脚本”错误 Unity。C#
- android - 从 XML 文件中查找另一个模块中的资源 - Android
- apache-kafka - 负载测试 kafka 消费者
- css - 如何将项目与离子 css 实用程序对齐?
- c# - 在 BinarySearchTree c# 中存储整个对象
- google-cloud-platform - 如何对具有 Google 容器优化操作系统的计算实例使用操作系统补丁管理?
- html - 在 EJS 模板脚本标签中填充数据
- r - 热图(geom_tile)产生黑条覆盖图