React Components to SvelteKit — Объекты с атрибутом HTML в атрибуте (рендеринг JSX) для тега Script

Поскольку я меняю проект React на SvelteKit, у меня возникла конкретная ситуация, которая меня очень заинтересовала.

Предположим, что у меня есть компонент в React, который получает объект columnsMockExample в качестве реквизита, например, и использует HTML внутри объекта, как:

const columnsMockExample = [{name: 'Column 1', html: '<div>Inner HTML example</div>' }]
<ColumnsComponent columnsProp = {columnsMockExample}/>

Итак, в React мы могли бы отобразить этот объект, чтобы использовать его и показать каждый .html внутри columnsMockExample:

{props.columnsProp.map((columnFromMockExample) => columnFromMockExample.html)};

Итак, вот вопрос: поскольку SvelteKit имеет тег <script/> помимо HTML, как я могу создать свой объект columnsMockExample внутри тега SvelteKit<script/>, поскольку это не JSX?

неправильный пример скрипта SvelteKit написан ниже:

<script> 
  const columnsMockExample = [{name: 'Column 1', html: '<div>Inner HTML example</div>' }] 
</script>

Спасибо.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
28
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если это чистый HTML (без кода, специфичного для Svelte, просто необработанный HTML), вы можете использовать директиву @html:

<script> 
  const columnsMockExample = [{name: 'Column 1', html: '<div>Inner HTML example</div>' }] 
</script>

{#each columnsMockExample as example}
  {@html example.html}
{/each}

Документы: https://svelte.dev/docs#template-syntax-html

Если там есть компоненты Svelte или обработчики кликов и т. д., это не сработает. В этом случае вам нужно переписать код, используя компоненты и слоты (https://svelte.dev/docs#template-syntax-slot) и/или тег svelte:component (https://svelte.dev/docs#template-syntax-svelte-component) — как именно, зависит от вашей цели.

Ответ принят как подходящий

Здесь можно использовать несколько разных подходов, каждый из которых немного отличается.

  1. Используйте слоты, чтобы каждый столбец отображал ячейку и отображал целые строки через слот родительских компонентов. Пример можно увидеть в этом вопросе.

  2. Определите отдельные компоненты, и вместо передачи HTML вы передаете класс компонента. На данный момент это немного неудобно, потому что компоненты не могут быть определены в одном и том же файле. Пример REPL

    Ключевым моментом является динамическая визуализация компонентов с помощью <svelte:component /> и передача текущего значения столбца в качестве общеизвестного свойства, одинакового для всех компонентов ячейки.

  3. Вместо того, чтобы использовать компоненты, визуализируйте HTML напрямую, используя {@html}. Я рекомендую это точно нет, потому что это упрощает создание XSS-уязвимостей. Пример REPL

    Ключевым моментом здесь является предоставление содержимого как функции значения столбца, например:

     const columns = [
         { key: 'name', html: value => `<button>${value}</button>` },
         { key: 'age', html: value => `<em>${value}</em>` },
     ]
    

    Таким образом, это может быть отображено с текущим значением следующим образом:

    <td>{@html column.html(value)}</td>
    

    Если у вас есть только статический контент, вам, конечно, не нужна функция.

  4. Используйте слоты и ключи для визуализации различных ячеек. Это очень гибкий подход, который используется, например. по DataTableКомпоненты Carbon Svelte.

    Столбцы определяют ключ, а ячейки могут быть шаблонизированы с помощью слотов и реквизитов слотов.

    Например.

    <!-- DataTable.svelte -->
     <script>
         export let columns;
         export let rows;
     </script>
    
     <table>
         {#each rows as row}
             <tr>
                 {#each columns as column}
                     {@const value = row[column.key]}
                     <td>
                         <slot {value} key = {column.key} />
                     </td>
                 {/each}
             </tr>
         {/each}
     </table>
    

    Пример использования:

     <script>
         import DataTable from './DataTable.svelte';
         const rows = [
             { name: 'John', age: 64 },
             { name: 'Jane', age: 46 },
         ]
         const columns = [
             { key: 'name' },
             { key: 'age' },
         ]
     </script>
    
     <DataTable {columns} {rows} let:key let:value>
         {#if key == 'name'}
             <button>{value}</button>
         {:else}
             {value} <!-- Fallback to just the cell content -->
         {/if}
     </DataTable>
    

    РЕПЛ

Другие вопросы по теме

Как показать div при нажатии кнопки
Ссылка на действие аутентификации Reactjs firebase для проверки адреса электронной почты и сброса пароля
Как получить предупреждения React в расширении Parcel React
Почему реактивный компонент разбиения на страницы mui вызывает ошибку выполнения «createElement» в «Документе»: предоставленное имя тега («/.js») не является допустимым именем. ошибка?
Изображения не загружаются в ответ во время цикла даже после использования require
Ошибка: объекты недействительны в качестве дочернего элемента React — место ошибки?
Как я могу выбрать вариант из выбора, когда я нажимаю кнопку с помощью React?
Создание новой темы с помощью Material-ui версии 5 с версией реакции 18.01 — ошибка при использовании «@mui/styles»
Получить реквизиты useLocation из Route: Uncaught TypeError: невозможно прочитать свойства null (чтение «isNew»)
Uncaught TypeError: невозможно прочитать свойства null (чтение «оригинала»)