【问题标题】:Pug - mixin with conditional .json objectPug - 带有条件 .json 对象的 mixin
【发布时间】:2017-07-11 09:55:27
【问题描述】:

我正在尝试使用条件(如果在外部 .json 中存在对象),但 pug 无法识别它。

所以,我的 json 文件是这样的:

{
  "portfolioItems": [object1: {
      objectA { ...
      },
      objectB { ...
      },
      "buttons": [{
        key: value
      }, {
        key: value
      }]
    }, object2: {
      objectA { ...
      },
      objectB { ...
      }], object3: {
      objectA { ...
      },
      objectB { ...
      }
    }
  }
}

基本上,我需要为“对象 1”(按钮)创建一个额外的 div。

mixin portfolio(css, image, title, description)
    div(class= "item " + css)
        .wrap-img
            img(src= assets + "img/home/" + image)&attributes(attributes)
        .wrap-text
            h3= title
            p= description
            if home.portfolioItems.buttons
                div.buttons
                    each val in home.portfolioItems.buttons
                        a(href= val.link, target="_blank")
                            img(class= val.className, src= assets + "img/stores/" + val.image)

div.portfolio--items
            - var projects = home.portfolioItems;
            each item in projects
                +portfolio(item.class, item.image, item.title[lang], item.description[lang])(alt= item.title[lang], title=item.title[lang])

Pug 可以访问“home.portfolioItems.buttons”,但它不能在 mixin 中执行条件?因为我可以在外面运行它(但我不想要它)。

提前致谢。对不起,英语有任何错误。 ;)

【问题讨论】:

标签: json pug mixins


【解决方案1】:

Mixins 有自己的作用域,因此您需要将它们传递到一个对象中。我还建议使用单个选项对象,它比跟踪单独的参数更容易,与顺序无关,并且也更具可读性。

请注意,您可以调用 mixin 并使用定义跨越多行

+portfolio({
  "css": "css",
  "image": "image",
  "title": "title",
  "description": "description",
  "items": portfolioItems
})

这就是 mixin 的样子:

mixin portfolio(options)
  div(class= "item " + options.css)
    .wrap-img
      img(src= assets + "img/home/" + options.image)&attributes(options.attributes)
    .wrap-text
      h3= options.title
      p= options.description
      if options.items.buttons
        div.buttons
          each val in options.items.buttons
            a(href= val.link, target="_blank")
              img(class= val.className, src= assets + "img/stores/" + val.image)

您也可以避免传入所有项目并传入按钮或空数组,如果按钮属性在portfolioItems 中不存在:

+portfolio({
  "css": "css",
  "image": "image",
  "title": "title",
  "description": "description",
  "buttons": portfolioItems.buttons || []
})

这将避免条件测试的需要,因为您可以保证在 mixin 中至少有一个空数组:

mixin portfolio(options)
  div(class= "item " + options.css)
    .wrap-img
      img(src= assets + "img/home/" + options.image)&attributes(options.attributes)
    .wrap-text
      h3= options.title
      p= options.description
      div.buttons
        each val in options.buttons
          a(href= val.link, target="_blank")
            img(class= val.className, src= assets + "img/stores/" + val.image)

【讨论】:

  • 我没有这个项目了,但是我用一个更小的例子进行了测试(在这里可能更容易阅读)并且它可以工作。传递对象是解决方案。谢谢 ;) codepen.io/joaosaro/pen/jeWgWd
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
  • 1970-01-01
相关资源
最近更新 更多