如何在Sapper中将精简组件的状态绑定到查询字符串

时间:2019-06-23 14:41:53

标签: javascript svelte sapper svelte-store

我的sapper应用程序围绕着表组件。该表组件具有要在URL的查询字符串中表示的状态(偏移量,限制,排序,过滤器等)。

该表当前可以通过直接更新其状态来正常工作

<button on:click="{() => offset += limit}" disabled="{offset + rows.length >= count}">»</button>

我看到有一个页面只读存储,它可以使我访问查询字符串的当前值。我想我可以使用类似URLSearchParams之类的东西来生成具有相关值更新的链接。

是否有更好的方法来处理此问题(将变量直接绑定到查询字符串的某种方法)?如果没有,用更新的查询字符串生成链接的最佳方法是什么?

编辑:

我当前的解决方案是以下功能:

const getLink = queryStringDiff =>  {
  const query = $page.query;
  const path = $page.path;
  const str = Object.entries({...query, ...queryStringDiff}).reduce(
    (acc, cur) => `${acc}&${cur[0]}=${cur[1]}`, ''
  ).replace('&', '?');
  return `${path}${str}`;
}

我在一个a标记中引用了以下按钮:

href="{getLink({'offset': (offset - limit)})}"

它有效,但是我觉得应该有更好的方法

1 个答案:

答案 0 :(得分:1)

您可以从page存储访问查询字符串状态:

<script>
  import { stores } from '@sapper/app';
  const { page } = stores();

  $: start = $page.query.p * $page.query.itemsPerPage;
  $: end = start + $page.query.itemsPerPage;

  $: slice = myData.slice(start, end); // plus filtering, sorting etc
</script>

<table>
  <thead>...</thead>
  <tbody>
    {#each slice as row}
      <tr>...</tr>
    {/each}
  </tbody>
</table>

<a href="my-table?p={$page.query.p + 1}">next</a>

如果需要以编程方式导航,则可以使用goto

<script>
  import { stores, goto } from '@sapper/app';

  // ...

  const next = () => {
    goto(`my-table?p=${$page.query.p + 1}`);
  };
</script>