【问题标题】:Sapper is not reloading data when hitting linkSapper 在点击链接时没有重新加载数据
【发布时间】:2021-03-30 18:56:10
【问题描述】:

我正在使用 sapper 构建一个网站并从 API 请求数据。到目前为止,它一直运行良好。

当我从 site.com/title/id1 转到 site.com/title/id2 时,在我手动刷新之前不会加载新信息。有什么想法吗?

import { stores, goto } from "@sapper/app";
import Card from "../_titlecard.svelte";

const { page } = stores();
const { slug } = $page.params;

import { onMount } from "svelte";
let looper = [];
let artistName = "";
let titleName = "";
let dvdCover = "";
let titleCover = "";
let genre = "";
let tracks = [];
onMount(async () => {
  const res = await fetch(`https://.com/api/title/${slug}`);

  const data = await res.json();

  artistName = data.artistName;
  titleName = data.name;
  dvdCover = data.graphics.dvd;
  titleCover = data.graphics.landscape;
  genre = data.genre;
  tracks = data.tracks.length;

  const res2 = await fetch(`https://.com/api/artists/all`);
  const data2 = await res2.json();

  let moreTitles = [];
  const more = data2.map((x) => {
    if (x.titles.length > 0 && x.genre === genre) {
      looper.push(x.titles[0]);

      looper = moreTitles;
    }
  });
});

然后我在 html 中有这个

{#each looper.slice(0, 4) as item, i} 
  <Card imgurl={item.graphics.dvd} concert={item.name} id={item.id} />
{/each}

【问题讨论】:

    标签: javascript node.js svelte sapper


    【解决方案1】:

    如果导航导致使用相同的页面组件,则不会卸载并再次安装页面组件,因此您的 onMount 只会与第一个 id 一起运行一次。

    您可以使用reactive statement 来确保每次$page.params.slug 更改时都运行所需的代码。

    示例

    import { stores, goto } from "@sapper/app";
    import Card from "../_titlecard.svelte";
    const { page } = stores();
    
    let looper = [];
    let artistName = "";
    let titleName = "";
    let dvdCover = "";
    let titleCover = "";
    let genre = "";
    let tracks = [];
    
    $: (async () => {
      const { slug } = $page.params;
    
      const res = await fetch(`https://.com/api/title/${slug}`);
      const data = await res.json();
    
      artistName = data.artistName;
      titleName = data.name;
      dvdCover = data.graphics.dvd;
      titleCover = data.graphics.landscape;
      genre = data.genre;
      tracks = data.tracks.length;
    
      const res2 = await fetch(`https://.com/api/artists/all`);
      const data2 = await res2.json();
    
      let moreTitles = [];
      data2.forEach((x) => {
        if (x.titles.length > 0 && x.genre === genre) {
          moreTitles.push(x.titles[0]);
        }
      });
    
      looper = moreTitles;
    })();
    

    【讨论】:

    • 现在它正在重新加载数据,这很棒,但会收到如下警告:UnhandledPromiseRejectionWarning: Unhandled Promise RejectionWarning: Unhandled Promise Rejection。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。 (拒绝编号:3)
    • @blytung 这令人沮丧。这可能由于多种不同的原因而发生。您可以将整个反应式语句体包装在 try/catch 中并记录错误以查看发生了什么。 try { /* reactive statement body */ } catch (error) { console.log(error); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 2015-09-15
    • 1970-01-01
    • 2014-02-11
    • 2020-10-01
    • 2013-09-12
    相关资源
    最近更新 更多