在 Svelte 中调用 javascript 函数并渲染元素
Call the javascript function and render element in Svelte
如何在 svelte 代码中添加自定义函数调用?例如。在 DataTableTest.svelte 中,我想添加 cellFormatter 函数并使其自动调用并在 .以下是代码:
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>
但这行不通?谁能告诉我如何在这里做到这一点?
您可以使用 @html
template syntax 来实现:
{#if c.formatter}
<td>
{@html c.formatter(i, d)}
</td>
{:else}
<td>
{@html d[c.property] ? d[c.property] : ''}
</td>
{/if}
如@morphyish 所述,您可以使用 @html
模板语法将任意 html 插入 DOM.
如果您的 table 项的 html 在运行时从 API 中动态获取,这将很有用 – 例如,当您的网络应用程序无法控制html.
如果情况并非如此,并且您的网络应用程序控制着生成 html,那么我建议不要构建 html 字符串,而是创建单独的组件并引用它们,利用<svelte:component>
special element 渲染组件。这样,您 table 中的所有内容实际上都是一个 svelte 组件,而不是一些任意的 html,并且您可以获得 svelte 提供的所有好东西。
这里有一个类似的例子:https://svelte.dev/repl/e38138607bc445ea95754de83e5e0b8d?version=3.8.0
如何在 svelte 代码中添加自定义函数调用?例如。在 DataTableTest.svelte 中,我想添加 cellFormatter 函数并使其自动调用并在 .以下是代码:
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>
但这行不通?谁能告诉我如何在这里做到这一点?
您可以使用 @html
template syntax 来实现:
{#if c.formatter}
<td>
{@html c.formatter(i, d)}
</td>
{:else}
<td>
{@html d[c.property] ? d[c.property] : ''}
</td>
{/if}
如@morphyish 所述,您可以使用 @html
模板语法将任意 html 插入 DOM.
如果您的 table 项的 html 在运行时从 API 中动态获取,这将很有用 – 例如,当您的网络应用程序无法控制html.
如果情况并非如此,并且您的网络应用程序控制着生成 html,那么我建议不要构建 html 字符串,而是创建单独的组件并引用它们,利用<svelte:component>
special element 渲染组件。这样,您 table 中的所有内容实际上都是一个 svelte 组件,而不是一些任意的 html,并且您可以获得 svelte 提供的所有好东西。
这里有一个类似的例子:https://svelte.dev/repl/e38138607bc445ea95754de83e5e0b8d?version=3.8.0