每日整理真实提问 356 个问题 · 726 个回答 需要系统性的技术文档?看 Shopify 技术百科 1000 篇 → 400-873-8117
已解决 提问于 1 个月前

render 引入的 snippet 拿不到外面定义的变量

2 个回答 2,419 次浏览 主题与 Liquid 最后活跃 1 个月前
57

在 section 里 {% assign color = 'red' %},然后 {% render 'badge' %},snippet 里 {{ color }} 是空的;换成 include 就正常了。

泽
阿泽提问者
前端工程师 · Hydrogen / Storefront API
1 个月前提问 · 已收到 2 个回答

2 个回答

已采纳 · 提问者确认解决
26

先把判断放在前面:render 是隔离作用域,父模板变量不会自动传进去;include 会把父作用域整个带进去,但已被官方标记为过时写法。

1处理顺序

  1. 把变量显式传进去:{% render 'badge', color: color, size: 'sm' %}。
  2. snippet 里用 {% assign c = color | default: 'gray' %} 兜底,避免调用方漏传导致空白。
  3. 不要在 snippet 里依赖全局的 settings 之外的外部变量,settings 是全局可用的,其他都需要传。
  4. 把旧代码里的 include 全部替换成 render,同时补齐参数,长期这样改能避免变量污染。
  5. 批量替换后跑一次全站预览,重点看那些依赖父作用域的旧 snippet。
liquid
{% 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>
验收:snippet 里能正常输出传入的变量,且把 include 全部替换为 render 后页面渲染无变化。
风 风格技术团队 回答于 1 个月前
10

include 还有个坑:它会把 snippet 里的 assign 泄漏回父作用域,两个 snippet 用同名变量时会互相覆盖,这类 bug 极难查。这也是官方要求迁移到 render 的原因。

陈 陈工 · Shopify 认证开发者 · 1 个月前

你的处理方式是什么?

写下你实际验证过的步骤,比「我也有这个问题」有用得多。当前版本为静态展示,提交后会由团队整理并回复。

描述你遇到的现象、店铺环境(主题 / 套餐 / 应用)、已经试过哪些操作……
我要单独提问 工作日 10 分钟内回复,可直接加微信 fenggejishu