首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Nunjucks和Fractal中渲染一个组件内部的另一个组件

在Nunjucks和Fractal中渲染一个组件内部的另一个组件
EN

Stack Overflow用户
提问于 2021-05-31 05:18:20
回答 1查看 124关注 0票数 1

我正在从事一个设计系统的工作,只是让我的头脑围绕组件的思维方式。

我们使用Nunjucks和Fractal

我们有一个现有的组件,一个accordion,它从一个JSON对象获取数据。道具是标题和内容。

我已经构建了一个组件,比如目录,它使用一个简单的循环,从一个ToC.config.js文件中拉入,显示一个带样式的链接列表。

我需要在accordion组件中包含这个新组件,ToC有一个标题和一个数组,其中包含每个链接的urls和文本。

目前,我刚刚在Fractal中复制了accordion视图中的HTML,但这可能不是可行的方法,但从视觉上讲,这是设计者所需要的。

如果我把所有的链接,HTML和所有的东西放在配置中,作为一个字符串,我也可以正确地呈现手风琴,但这也不是它应该工作的方式。

我想要做的,可能是正确的方式,就是把这个accordion放进去,并用我的ToC组件填充它。

{% render '@my-accordion', 'accordion: items' %}没有做我想做的事情,而且我似乎不知道如何实现我需要做的事情。

大概是这样的:

代码语言:javascript
复制
{% render '@my-accordion' %}
  // Pass in data from ToC, somehow
  {{ title: title }}
  {% for item in items %}
    {{ item.text etc }}
  {% endfor %} 

然后我会有我的accordion组件,它的标题、链接和超文本标记语言等都来自我的ToC组件。对于上面的粗略的伪代码,我很抱歉,它更多的是我想要做的例子。我无法将代码复制到外部资源。

使用render似乎不太合适,除非我遗漏了什么?我不能将列表作为字符串传递,因为它有当前页面的类和唱段等,内容作者将使用这些来构建页面。

在正确的方向上稍微推动一下就好了。

EN

回答 1

Stack Overflow用户

发布于 2021-06-01 00:06:28

您可以添加类似于includemacrorender-filter。

代码语言:javascript
复制
import 'nunjucks.min.js';

var env = new nunjucks.Environment({autoescape: true});

env.addFilter('render', function (template, ctx) {
    const html = env.render(template, ctx); // try-catch
    return env.filters.safe(html);
});

用法

代码语言:javascript
复制
// table.njk
<table>
{% for e in rows %}
    {% 'row.njk' | render({row: e}) %}
{% endfor %}
</table>

// row.njk
<tr>
    {% for c in row.cols %}
        <td> {{ c.name }} </td>
    {% endfor %}
</tr>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67765904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档