仅当字符串数组中的元素长度大于零时,如何才能显示此应用程序中的元素?

2023-12-07

我正在使用 Vue 3、TypeScript 和电影数据库 (TMDB) 开发 SPA。

该应用程序显示列表电影卡.

In the 电影列表成分 (src\components\MoviesList.vue), 我有:

<template>
    <div class="row list">
       <div v-for="movie in movies" :key="movie.id" class="col-xs-12 col-sm-6 col-lg-4 col-xl-3">
        <MovieCard :movie="movie" :genres="genres" />
    </div> 
  </div>
</template>

<script lang="ts">
    import { defineComponent, ref } from 'vue';
    import axios from 'axios';
    import env from '../env';
    import MovieCard from './MovieCard.vue';

    export default defineComponent({
        name: 'MoviesList',
        components: {MovieCard},
        props: {
            listType: String
        },

    data() {
      return {
        pageTitle: "Now Playing",
        movies: [],
        genres: [],
      }
    },

    mounted() {
      this.getMovies();
      this.getGenres();
    },

     methods: {
      getMovies() {
        axios.get(`${env.api_url}/movie/${this.$props.listType}?api_key=${env.api_key}`).then(response => {
          this.movies = response.data.results;
        })
        .catch(err => console.log(err));
      },

      getGenres() {
        axios.get(`${env.api_url}/genre/movie/list?api_key=${env.api_key}`).then(response => {
          this.genres = response.data.genres;
          console.log(this.genres);
        })
        .catch(err => console.log(err));
      }
    }
  });
</script>

In the 电影卡成分 (src\components\MovieCard.vue), 我有:

<template>
    <div class="movie card">
        <div class="thumbnail">
            <img :src="`https://image.tmdb.org/t/p/w500/${movie.backdrop_path}`" :alt="movie.title" class="img-fluid" />
        </div>

        <div class="card-content">
            <h2 class="card-title">{{ movie.title }}</h2>
            <p class="card-desc">{{ movie.overview }}</p>
            <span :title="`Score: ${movie.vote_average}`" class="score d-flex">{{ movie.vote_average }}</span>
        </div>

        <div class="card-footer">
            <p class="m-0 release">Release date: {{ dateTime(movie.release_date) }}</p>
            <p class="m-0 pt-1">
                <a class="genre" v-for="genre in movie.genre_ids" :key="genre.id">
                    {{ getGenreName(genre) }}
                </a>
            </p>
        </div>
    </div>
</template>

<script lang="ts">
  import { defineComponent } from 'vue';
  import moment from 'moment';

  export default defineComponent({
    name: 'MovieCard',

    props: {
        movie: {
            type: Object,
            required: true
        },

        genres: {
            type: Object,
            required: true
        }
    },
    
  methods: {
    dateTime(value: any) {
            return moment(value).format('MMMM DD, YYYY');
        },

        getGenreName(gid: number) {
            if (this.genres[gid]) {
                if (this.genres[gid].name.length) {
                    return this.genres[gid].name;
                }
            }
        }
    },
  });
</script>

问题

我使用以下条件来确保不显示空的流派限制:

if (this.genres[gid].name.length) {
    return this.genres[gid].name;
}

由于我无法理解的原因,这失败了,如下所示。

enter image description here

问题

  1. 我的错误是什么?
  2. 获得所需结果的最可靠方法是什么?

问题之一是您使用:key="genre.id"作为关键。然而v-for="genre in movie.genre_ids"告诉我们genre可能是一个 ID(号码)。所以genre.id可能会导致undefined,这意味着每次迭代都有相同的key。这可能会导致渲染问题。


接下来,空标签还告诉我们没有返回值{{ getGenreName(genre) }}.

您已包含大量 if 语句来尝试解决此问题,但如果流派 ID 不存在于this.genres函数返回undefined。如果流派名称为空,也会发生同样的情况。您将返回而不是返回空字符串undefined,这会产生几乎相同的结果。

为了解决这个问题,我们首先问以下问题。如果电影类型 ID 不存在于this.genres。您加载了所有类型吗? API 可能会对响应进行分页,这意味着您必须执行多次调用才能获取完整的流派列表。

如果您确定已加载所有流派,并且确实存在与流派不匹配的流派 ID,或名称为空的流派。我们可以使用计算属性来解决这个问题。

computed: {
  movieGenres() {
    return this.movie.genre_ids
      .filter(genre_id => genre_id in this.genres)
      .map(genre_id => this.genres[genre_id])
      .filter(genre => genre.name.length > 0);
  }
}

现在而不是循环遍历movie.genre_ids你可以循环遍历movieGenres反而。

<a class="genre" v-for="genre in movieGenres" :key="genre.id">
  {{ genre.name }}
</a>

注意genre上面是实际的流派对象,而不仅仅是一个 ID。这是由于.map(genre_id => this.genres[genre_id])我们在计算属性中执行此操作。


除了使用计算属性之外,还可以选择改进数据传输。您可以在收到 API 响应时对数据进行排序,而不是将“无效”数据作为属性传递。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅当字符串数组中的元素长度大于零时,如何才能显示此应用程序中的元素? 的相关文章

  • 在 contenteditable div 中选择范围

    我有一个contenteditablediv 和其中的一些段落 这是我的代码 div style border solid 1px black width 300px height 300px div Hello world div div
  • 渲染货币和符号并与来自不同单元格的数据相结合

    我正在使用最新的 jQuery DataTables v1 10 7 我正在尝试将数字解析为以下格式 239 90 USD 我可以使用此命令使货币正常工作 columns data Price render fn dataTable ren
  • socket.io 的良好初学者教程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • JavaScript 中的埃拉托斯特尼筛法对大量数据无限运行

    我一直在尝试写埃拉托斯特尼筛法 http en wikipedia org wiki Sieve of EratosthenesJavaScript 中的算法 基本上我只是按照以下步骤操作 创建从 2 到 n 1 的连续整数列表 令第一个素
  • Eslint errorring 导入没有扩展名的 jsx

    我正在尝试在 es6 中导入 jsx 文件而不需要 jsx 扩展名 import LoginErrorDialog from LoginErrorDialogView Not import LoginErrorDialog from Log
  • Javascript Promise“then”始终运行,即使 Promise 未能执行

    我希望当调用第二个 then 时不执行第三个 then 但是 即使 Promise 被拒绝 调用第二个 then 并且代码返回 rejected 然后返回 undefined 它仍然调用第三个 then 如何不运行第三个 then 这样 未
  • 以编程方式填写reactjs表单

    我正在编写一个用户脚本 但无法填写由reactjs制作的表单 我的代码 document querySelector id username value email protected cdn cgi l email protection
  • 如何格式化 Highcharts 的 (x,y) 对数据的日期时间

    我的序列化方法会产生如下所示的日期时间字符串 2014 07 09T12 30 41Z 为什么下面的代码不起作用 function container highcharts xAxis type datetime series data x
  • 如何将内联 JavaScript 与 Express/Node.js 中动态生成的内容分开?

    对于具有几年 Web 开发经验但没有找到答案的人来说 这是一个有点菜鸟的问题程序员堆栈交换 or Google 我决定在这里问一下 我在用Express网络框架Node js 但这个问题并不特定于任何 Web 框架或编程语言 以下是从数据库
  • 在重复内容区域添加

    我有一个菜单组件 简单地说 它接受一个带有一系列选项的道具 并为每个选项在菜单中呈现一个项目 我希望能够根据用例自定义每个菜单项内的标记 因此我在菜单项元素内使用了占位符 你可以在这个中看到一个例子fiddle https jsfiddle
  • 带有淘汰赛js的隐形recaptcha

    我正在完成隐形验证码 但我在实现它时遇到问题 谷歌开发人员页面中的代码显示它应该是这样的
  • 有没有办法使用 Rspec/Capybara/Selenium 将 javascript console.errors 打印到终端?

    当我运行 rspec 时 是否可以让 capybara selenium 向 rspec 报告任何 javascript console errors 和其他异常 我有一大堆测试失败 但当我手动测试它时 我的应用程序正在运行 如果不知道仅在
  • 如何将函数附加到弹出窗口关闭事件(Twitter Bootstrap)

    我做了一些搜索 但我只能认为我可以将事件附加到导致其关闭的按钮 https stackoverflow com questions 13205103 attach event handler to button in twitter boo
  • 调整图像大小并将画布旋转 90 度

    这里有很多关于在 js 上使用画布旋转图像的主题 我阅读了其中的大部分内容 但无法找到解决我的问题的方法 我正在接收任何分辨率的图像 来自上传组件 我将其大小调整为 1024x768 如下所示 var canvas document cre
  • 在移动设备上滚动

    这个问题更多的是一个建议研究 我确实希望它对其他人有帮助 并且它不会关闭 因为我不太确定在哪里寻求有关此事的建议 在过去的 6 个月里 我一直在进行移动开发 我有机会处理各种设备上的各种情况和错误 最麻烦的是滚动问题 当涉及到在网站的多个区
  • Vue 和 Vuex:处理依赖的计算属性

    我的应用程序是一个使用 Vuex 在 Vue 中构建的精简电子表格 关键组件是TableCollection Table and Row The TableCollection有一个包含多个的数组Table对象 每个Table有一个包含多个
  • 在 Shopify 商店中嵌入 Vue 组件

    在产品页面中 我尝试显示自定义 Vue 组件 为简洁起见 该组件根据给定的产品 ID 显示 Firebase 数据库中的一些信息 我最初尝试将其制作为 Shopify 应用程序 以便我可以访问他们的 API 我实现了 OAuth 并且可以检
  • 如何隐藏/禁用 Highcharts.js 中的图例框?

    我想问是否可以使用 HighCharts js 库隐藏图表中的所有图例框 var chart object chart renderTo render to type graph type colors graph colors title
  • 将 CKEditor 5 与 nuxtjs 结合使用

    我正在尝试在我的 Nuxtjs 项目中导入 CKEditor 5 的自定义版本 并且我已经尝试了所有可能的方法来正确导入它 但没有一个对我有用 这是其中之一 let ClassicEditor let CKEditor if process
  • 如何确定所有角度2分量都已渲染?

    当所有 Angular2 组件完成渲染时 是否会触发一个角度事件 For jQuery 我们可以用 function 然而 对于 Angular2 当domready事件被触发 html 只包含角度组件标签 每个组件完成渲染后 domrea

随机推荐