【问题标题】:How to pass data to dynamically nested custom elements in Svelte?如何将数据传递给 Svelte 中动态嵌套的自定义元素?
【发布时间】:2021-11-29 03:19:03
【问题描述】:

CMS 返回带有自定义元素的 HTML 和相应的 props。

<!-- index.html -->

<svelte-accordion props='{"toggleAll":true}'>
  <svelte-accordion-item props='{"title":"Accordion item 1"}'>
    <p>Content of the first accordion item</p>
  </svelte-accordion-item>
  <svelte-accordion-item props='{"title":"Accordion item 2"}'>
    <p>Content of the second accordion item</p>
  </svelte-accordion-item>
  <svelte-accordion-item props='{"title":"Accordion item 3"}'>
    <p>Content of the third accordion item</p>
  </svelte-accordion-item>
</svelte-accordion>

我们的想法是为自定义元素使用 Svelte 组件,如下所示:

// Accordion.svelte

<svelte:options tag="svelte-accordion" />

<script>
  export let props;
</script>

<slot parentProps={props} />
// AccordionItem.svelte

<svelte:options tag="svelte-accordion-item" />

<script>
  export let props;
  export let parentProps;
  const { title } = JSON.parse(props);

  // parentProps is undefined
  console.info('__parentProps__', parentProps);
</script>

<h2>{title}</h2>
<slot />

在上面的例子中AccordionItem.svelte 无法接收到Accordion.svelte 传递的props。原因可能是props实际上是传递给Accordion.svelte内的&lt;slot&gt;,而不是直接传递给&lt;svelte-accordion-item&gt;。

我们如何解决这个问题?

感谢您的帮助!

【问题讨论】:

  • 谢谢,@Pythony!插槽道具在我的情况下不起作用,可能是因为 svelte-accordion-item 是由 CMS 在页面标记中动态插入的。
  • "...实际上是传递给 Accordion.svelte 中的 而不是直接传递给 。" 你为什么不通过parentprops 直接在 index.html 像 &lt;svelte-accordion-item props='{"title":"Accordion item 1"}' parentprops='{"toggleAll":true}'&gt; ?

标签: javascript frontend svelte


【解决方案1】:

当您执行&lt;slot parentProps={props}&gt; 时,parentProps 不会自动发送到 prop 的内容,而是在 Accordion 组件上以 let:parentProps 的形式提供。请注意,如果您认为不必使用组件来填充 slot,这将非常有意义:

<Accordion>
  <span>Some content here</span>
</Accordion>

在上面的示例中,没有 组件 可以将这些道具发送到!

要解决您的问题,您可以考虑使用ContextAPI,这使我们可以使变量可用于组件的所有后代。

<!-- Accordion.svelte -->

<svelte:options tag="svelte-accordion" />

<script>
  import { setContext } from 'svelte';
  export let props;
  setContext('parentProps', props)
</script>

<slot />
<!-- AccordionItem.svelte -->
<svelte:options tag="svelte-accordion-item" />

<script>
  import { getContext } from 'svelte';
  export let props;

  const parentProps = getContext('parentProps');
  const { title } = JSON.parse(props);

  // parentProps is undefined
  console.info('__parentProps__', parentProps);
</script>

<h2>{title}</h2>
<slot />

【讨论】:

  • 谢谢,@Stephane,上下文 API 在我的情况下不起作用,可能是因为 svelte-accordion-item 是动态的,而不是由 Accordion.svelte 调用。
  • 我必须检查一下,ContextAPI 可能不适用于自定义元素,它们是动态的应该不是问题,因为这正是它的目的。
  • getContext('parentProps') 在&lt;AccordionItem /&gt; 在AccordionItem.svelte 中手动呈现时有效,但当它通过&lt;slot /&gt; 呈现为自定义元素时则无效
  • &lt;slot&gt; 部分与它无关,它工作正常。似乎自定义元素不能使用 getContext,关于 github.com/sveltejs/svelte/issues/3422 的长期未决问题
  • 目前看来您唯一的选择是将 parentProps 手动传递给所有项目。
猜你喜欢
  • 2021-07-22
  • 2018-11-08
  • 1970-01-01
  • 2020-04-12
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多