Phoenix中两次生成随机数运行的函数
A function generating random numbers run twice in Phoenix
出于某种原因,标准函数在模板中 运行 两次。
例如,如果我在挂载中有这个:
def mount(_params, _session, socket) do
random_number = :rand.uniform()
socket =
assign(socket,
random_number: random_number
)
{:ok, socket}
end
这是 html 模板:
<%= @random_number %>
然后在几分之一秒内我在浏览器中得到一个数字,然后用另一个重新绘制。
我做错了什么?
编辑:
我制作了这个问题的视频。这里是linkof the video
如您所见,当我稍微按下浏览器的刷新按钮时,您可以看到第一个 运行dom 编号被替换为第二个 运行dom 编号并保留在那里.
正如文档中关于 Phoenix.LiveView.mount/3
回调的明确说明:
For each LiveView in the root of a template, mount/3
is invoked twice: once to do the initial page load and again to establish the live socket.
这是可以从中受益的预期行为。如果您不知道如何从中受益,请忽略它加载两次的事实。
正如 Alexei 提到的那样 mount/3
被调用了两次,但是您可以控制要渲染的内容。
实现此目的最简单的方法是检查套接字是否 connected:
def mount(_params, _session, socket) do
socket =
if connected?(socket) do
random_number = :rand.uniform()
assign(socket,
random_number: random_number
)
else
assign(socket,
random_number: 0
)
end
{:ok, socket}
end
通常信息是确定性的,因此为了更好的用户体验,最好在套接字连接后呈现相同的内容。
出于某种原因,标准函数在模板中 运行 两次。
例如,如果我在挂载中有这个:
def mount(_params, _session, socket) do
random_number = :rand.uniform()
socket =
assign(socket,
random_number: random_number
)
{:ok, socket}
end
这是 html 模板:
<%= @random_number %>
然后在几分之一秒内我在浏览器中得到一个数字,然后用另一个重新绘制。
我做错了什么?
编辑:
我制作了这个问题的视频。这里是linkof the video
如您所见,当我稍微按下浏览器的刷新按钮时,您可以看到第一个 运行dom 编号被替换为第二个 运行dom 编号并保留在那里.
正如文档中关于 Phoenix.LiveView.mount/3
回调的明确说明:
For each LiveView in the root of a template,
mount/3
is invoked twice: once to do the initial page load and again to establish the live socket.
这是可以从中受益的预期行为。如果您不知道如何从中受益,请忽略它加载两次的事实。
正如 Alexei 提到的那样 mount/3
被调用了两次,但是您可以控制要渲染的内容。
实现此目的最简单的方法是检查套接字是否 connected:
def mount(_params, _session, socket) do
socket =
if connected?(socket) do
random_number = :rand.uniform()
assign(socket,
random_number: random_number
)
else
assign(socket,
random_number: 0
)
end
{:ok, socket}
end
通常信息是确定性的,因此为了更好的用户体验,最好在套接字连接后呈现相同的内容。