1

我正在开发一个小型 Svelte 应用程序,用于学习目的(我是 Svelte 新手)。该应用程序使用在视图中显示的对象数组作为 HTML 表格:

let countries = [
    { code: "AF", name: "Afghanistan" },
    { code: "AL", name: "Albania" },
    { code: "IL", name: "Israel" }
]; 

<table class="table table-bordered">
  <thead>
    <tr>
      <th>#</th>
      <th>Code</th>
      <th>Name</th>
      <th class="text-right">Actions</th>
    </tr>
  </thead>
  <tbody>
    {#if countries.length}
     {#each countries as c, index}  
      <tr>
       <td>{index+1}</td>
       <td>{c.code}</td>
       <td>{c.name}</td>
       <td class="text-right">
        <button data-code="{c.code}" on:click="{deleteCountry}" class="btn btn-sm btn-danger">Delete</button>
       </td>
      </tr>
     {/each}
    {:else}
    <tr>
      <td colspan="4">There are no countries</td>
    </tr>
    {/if}
  </tbody>
</table>

我正在以这种方式进行删除操作:

function deleteCountry(){
    let ccode = this.getAttribute('data-code');
    let itemIdx = countries.findIndex(x => x.code == ccode);
    countries.splice(itemIdx,1);
    console.log(countries);
}

这里有一个 REPL 。

问题

countries在更新数组(从中删除一个元素)后,我无法再次呈现表(视图)。

我怎么做?

4

2 回答 2

4

添加

countries = countries;

在这条线之后

countries.splice(itemIdx,1);

因为反应性/重新渲染/UI 更新仅在分配后标记。

于 2020-06-29T11:13:16.267 回答
3

为了使 svelte 能够对您的国家/地区数组进行更改,您需要创建数组的新引用。为此,您可以使用该Array.filter方法。

<script>
    let countries = [
     { code: "AF", name: "Afghanistan" },
     { code: "AL", name: "Albania" },
     { code: "IL", name: "Israel" }
    ];
    
    function deleteCountry(code) {
        countries = countries.filter(c => c.code !== code)
    }
</script>

<table class="table table-bordered"> 
  <thead>
    <tr>
      <th>#</th>
      <th>Code</th>
      <th>Name</th>
      <th class="text-right">Actions</th>
    </tr>
  </thead>
  <tbody>
    {#if countries.length}
    {#each countries as c, index}   
    <tr>
      <td>{index+1}</td>
      <td>{c.code}</td>
      <td>{c.name}</td>
      <td class="text-right">
        <button on:click="{() => deleteCountry(c.code)}" class="btn btn-sm btn-danger">Delete</button>
      </td>
    </tr>
    {/each}
    {:else}
    <tr>
      <td colspan="4">There are no countries</td>
    </tr>
    {/if}
  </tbody>
</table>

您也可以直接使用国家代码作为该deleteCountry方法的参数。

于 2020-06-29T11:07:03.317 回答