这是另一个大误区。
很多人一听 Phoenix LiveView,就以为:
前端不重要了
JS 没用了完全不是。
Phoenix 官方对 JS 的态度一直很清楚:
- 能用声明式
Phoenix.LiveView.JS命令解决的,先用它 - 真有需要,就用 hooks / JS interop
- 不是禁止 JS,而是不鼓励为了小交互就把整页变成前端应用
比如客户端小交互:
alias Phoenix.LiveView.JS
<button
phx-click={
JS.push("toggle_filters")
|> JS.toggle(to: "#filters-panel")
}
>
筛选器
</button>这类交互不需要你额外开一整套前端框架。
而且 LiveView 的 JS 命令是 DOM patch aware 的,也就是知道如何在服务器补丁更新后继续保持行为一致。
如果你真要接第三方库、地图、图表、复杂拖拽,也可以上 Hook:
let Hooks = {}
Hooks.MapBoard = {
mounted() {
this.map = createMap(this.el, this.el.dataset.center)
},
updated() {
syncMarkers(this.map, this.el.dataset.markers)
},
destroyed() {
this.map?.remove()
}
}所以 Phoenix 的正确态度不是“零 JS 宗教”,而是:
默认别把整座城的交互治理都外包给浏览器,但该用 JS 时就精确地用。