Item 1
不属于 my_list 的模板,而是属于调用者。因此,它也被视为“根”并获得 phx-r 属性。然后,因为 my_list 使用作用域共置 CSS,所以它的根元素(在本例中只有一个)也获得一个唯一的 phx-css-* 属性。结合起来,我们可以编写以下 CSS: @scope ([phx-css-foo]) to ([phx-r]){p{font-weight:bold;使用此规则,只有属于 my_list 模板的 p 标签才会呈现为粗体,而页面上的任何其他 p 标签不受影响。 LiveView 不会自动注入 phx-r 属性。相反,它选择使用新的编译时配置: config :phoenix_live_view , # 在所有根标签上设置的属性。用于Phoenix.LiveView.Co locatedCSS。 root_tag_attribute : "phx-r" 在实现并置 CSS 时,我们偶然发现了一个问题,需要我们重新审视 HEEx 模板的编译方式。如果您想了解更多相关内容,我们发布了单独的技术深入探讨。 tl;dr:为了使共置 CSS 工作,我们必须改变编译 HEEx 模板的方式,将编译拆分为单独的标记化和解析步骤,从而允许我们处理宏组件(共置 CSS 和 JS),而不会使其余的编译变得更加复杂。它还允许我们重用以前必须在模板编译和格式化之间复制的代码。默认情况下,我们不提供作用域 尽管为共置 CSS 付出了所有努力,但当您听说我们实际上并未在 LiveView 1.2 中提供作用域时,您可能会感到惊讶。原因是在撰写本文时(2026 年 6 月),@scope 规则尚未得到跨浏览器的良好支持。相反,我们提供了一个@behaviour,您可以实现它来进行自定义范围界定,这也允许您使用不同的策略。如果您决定成为早期采用者,我们在文档中确实有 @scope 实现。 1.2 中的小改进 除了并置 CSS 之外,LiveView 1.2 还包括一些小改进: 您现在可以实现 Phoenix.LiveView.HTMLForm
开发者生态
morning
凤凰直播1.2发布
摘要
Phoenix LiveView 1。Posted on June 10th, 2026 by Steffen Deusch LiveView 1。0 is available now。To update from LiveView 1。2, simply update the version requirement in your mix。
the
LiveView
scope
that
your
2026-06-14
1 阅读
约7分钟阅读
ksec
字号:
凤凰直播1.2发布!发布者:Steffen Deusch,2026 年 6 月 10 日 LiveView 1.2.0 现已推出!要从 LiveView 1.1 更新到 1.2,只需更新 mix.exs 文件中的版本要求并重新获取依赖项: { :phoenix_live_view , "~> 1.2.0" } 共置 CSS 在 LiveView 1.1 中,我们引入了共置 Hooks 和共置 JavaScript ,允许您直接在任何 HEEx 模板内编写挂钩。 LiveView 1.2 建立在 Phoenix.LiveView.Co locatedJS 的后台工作之上,允许您在 HEEx 中并置 CSS。 def table ( allocates ) do ~H""" < style :type = { MyApp.Co locatedCSS } > thead { color : ... ; } tbody , tr :hover { ... } style > < table > ... table > """ end 与 Co located JS 一样, :type 属性告诉 LiveView 在编译时将标签的内容提取到 _build 目录中的特殊 phoenix-co located 文件夹中。然后,您的打包程序(通常是 Tailwind 或 Esbuild)会拾取该文件,并将其作为正常 CSS 管道的一部分进行处理。但这是简单的部分。定义共置样式时,您通常想要的是确定它们的范围,这样它们就不会意外地应用于来自不同组件的页面上的其他元素。现代 CSS 有一个相对较新的 @scope 规则,它允许我们做到这一点,但有一些注意事项。 @scope 规则 @scope (scope root ) to (scope limit ) { /* … */ } @scope 规则接受根选择器和可选的限制选择器。如果我们能够对渲染的 HTML 进行注释,使其包含一个唯一的属性来标识模板的“根”及其结束位置,那么我们就可以拥有仅适用于该模板的规则。由于我们控制 HEEx 编译为 HTML 的方式,因此我们可以做到这一点。让我们看一个例子: attr :description , :string slot :item def my_list ( allocates ) do ~H""" < style :type = { MyApp.Co locatedCSS } > p { font - Weight : bold ; } style > < div > < p > { @description } p > < ul > < li :for = { item <- @item } > { render_slot ( @item ) } li > ul > div > """ end 当我们在另一个模板中使用此组件时,例如在 LiveView 的 render/1 函数中, < p > Hello World p > < .my_list description = " My List " > < :item > < p > Item 1 p > :item > < :item > Item 2 :item > .my_list > 未修改的渲染 HTML看起来像这样: < p > Hello World p > < div > < p > My List p > < ul > < li > < p > Item 1 p > li > < li > Item 2 li > ul > div > 现在,为了正确识别属于 my_list 组件的 HTML 部分,我们需要注释所有模板的边界: < p phx-r > Hello World p > < div phx-r phx-css-foo > < p > 我的列表 p > < ul > < li > < p phx-r > Item 1 p > li > < li > Item 2 li > ul > div > 我们使用一个特殊的 phx-r 属性,该属性被添加到模板的所有最外层元素中,并且可以用作 @scope 规则中的限制选择器。请注意,我们在上面的示例中使用了一个槽。
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱