在Svelte中调用javascript函数并渲染元素

时间:2019-08-06 23:15:17

标签: svelte svelte-component

如何在标准代码中添加自定义函数调用?例如。在DataTableTest.svelte中,我想添加cellFormatter函数并使其自动调用,并在中渲染div。以下是代码:

ABC.svelte     

import DataTableTest from "./DataTableTest.svelte";

let columns = [
    {
      label: "ABC",
      property: "abc"
    },
    {
      label: "Items",
      property: "items"
    },
    {
      label: "cellFormatter",
      formatter: function(rowIndex, rowData) {
          return "<div>" + rowData[rowIndex] + "</div>";
      }
    }
  ];


let data = [
  {
    "abc": "dsaaads",
    "items": "dsadsads",
  }

</script>


<DataTableTest title="Test" {data} {columns} />

DataTableTest.svelte

<script>
  export let title;
  export let data;
  export let columns = [];
</script>

{title}
<table>
  {#if columns}
    <tr>
      {#each columns as c}
        <td>{c.label}</td>
      {/each}
    </tr>
  {/if}
  {#if data}
    <tbody>
      {#each data as d, i}
        <tr>
          {#each columns as c}
            {#if c.formatter}
              <td on:load=c.formatter(i, d)></td>
            {:else}
              <td>
              {@html d[c.property] ? d[c.property] : ''}
              </td>
            {/if}
          {/each}
        </tr>
      {/each}
    </tbody>
  {/if}
</table>

我尝试了

<td on:load=c.formatter(i, d)></td>

但这行不通吗?有人可以告诉我该怎么做吗?

2 个答案:

答案 0 :(得分:2)

您可以使用@html template syntax来实现:

{#if c.formatter}
    <td>
    {@html c.formatter(i, d)}
    </td>
{:else}
    <td>
    {@html d[c.property] ? d[c.property] : ''}
    </td>
{/if}

答案 1 :(得分:0)

如@morphyish所述,您可以使用@html模板语法将任意html插入DOM。

例如,如果您的表项的html是在运行时从API动态获取的,则非常有用-例如,当您的网络应用无法控制该html的生成时。

如果不是这种情况,并且您的网络应用可以控制生成html,那么我建议您使用<svelte:component> {{3}来创建单独的组件并引用它们,而不是构造html字符串。渲染组件。这样,表中的所有内容实际上都是一个苗条的组件,而不是一些任意的html,您将获得苗条的所有优点。

以下是与此类似的示例:special element