57
在 section 里 {% assign color = 'red' %},然后 {% render 'badge' %},snippet 里 {{ color }} 是空的;换成 include 就正常了。
在 section 里 {% assign color = 'red' %},然后 {% render 'badge' %},snippet 里 {{ color }} 是空的;换成 include 就正常了。
先把判断放在前面:render 是隔离作用域,父模板变量不会自动传进去;include 会把父作用域整个带进去,但已被官方标记为过时写法。
{% render 'badge', color: color, size: 'sm' %}。{% assign c = color | default: 'gray' %} 兜底,避免调用方漏传导致空白。settings 之外的外部变量,settings 是全局可用的,其他都需要传。include 全部替换成 render,同时补齐参数,长期这样改能避免变量污染。{% comment %} 推荐写法:显式传参 + 默认值 {% endcomment %}
{% render 'product-badge', product: product, style: 'compact' %}
{% comment %} snippet 内部 {% endcomment %}
{%- liquid
assign badge_style = style | default: 'default'
assign badge_text = product.metafields.custom.badge.value | default: '新品'
-%}
<span class="badge badge--{{ badge_style }}">{{ badge_text }}</span>
include 全部替换为 render 后页面渲染无变化。include 还有个坑:它会把 snippet 里的 assign 泄漏回父作用域,两个 snippet 用同名变量时会互相覆盖,这类 bug 极难查。这也是官方要求迁移到 render 的原因。
写下你实际验证过的步骤,比「我也有这个问题」有用得多。当前版本为静态展示,提交后会由团队整理并回复。