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

通常信息是确定性的,因此为了更好的用户体验,最好在套接字连接后呈现相同的内容。