برنامه نویسی

SaladUI – اجرای مولفه آواتار برای Phoenix LiveView

این پست پس از پیاده‌سازی مؤلفه Avatar برای کتابخانه مؤلفه SaladUI برای Phoenix Liveview نوشته شده است.

یک جزء آواتار بسیار ساده است، اما من می‌خواهم آن را با متن آواتار بهبود ببخشم. ساختار قالب به صورت زیر است:

<.avatar>
  <.avatar_image src="./my-profile-img.jpg">.avatar_image>
  <.avatar_fallback class="bg-primary text-white">CN.avatar_fallback>
<.avatar>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در اینجا پیاده سازی جزء آواتار در html آمده است

 class="relative rounded-full overflow-hidden w-10 h-10">
     class="aspect-square w-full h-full" src="https://github.com/shadcn.png">
     class="flex rounded-full bg-primary text-white items-center justify-center w-full h-full">CN

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توضیحات تصویر

این مورد خوشحال کننده است، تصویر وجود دارد، و عنصر بازگشتی به دلیل کلاس به پایین فشار داده شده و پنهان می شود overflow-hidden.

اما زمانی که تصویر وجود نداشته باشد، تصویر شکسته نمایش داده می شود.

توضیحات تصویر

هوم، اگر تصویر وجود نداشته باشد یا هنگام بارگیری خطا داشته باشد، باید پنهان شود. خوشبختانه، img فراهم کند onerror رویداد.

 class="relative rounded-full overflow-hidden w-10 h-10">
     class="aspect-square w-full h-full" src="badimage.png" onerror="this.style.display='none'">
     class="flex rounded-full bg-primary text-white items-center justify-center w-full h-full">CN

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مهمان چی چیزی تغییر نکرده است، تصویر شکسته هنوز قابل مشاهده است.
مدتی طول کشید تا دلیل آن را کشف کنم. onerror="this.style.display='none'" ویژگی را در سمت کلاینت تغییر دهید، هنگامی که Phoenix LiveView به روز می شود، html را وصله می کند و حذف می کند display ارزش سبک پس فقط اضافه کنید phx-update="ignore" و شما تصویر خطا را مخفی کردید.

 class="relative rounded-full overflow-hidden w-10 h-10">
     class="aspect-square w-full h-full" src="https://github.com/shadcn.png" onerror="this.style.display='none'" phx-update="ignore">
     class="flex rounded-full bg-primary text-white items-center justify-center w-full h-full">CN

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و همانطور که انتظار می رود کار می کند

توضیحات تصویر

حالا جزء را بپیچید

defmodule SaladUI.Avatar do
  @moduledoc false
  use Phoenix.Component

  attr(:class, :string, default: nil)
  attr(:rest, :global)

  def avatar(assigns) do
    ~H"""
    relative h-10 w-10 overflow-hidden rounded-full", @class])} {@rest}>
      <%= render_slot(@inner_block) %>
    
    """
  end

  attr(:class, :string, default: nil)
  attr(:rest, :global)

  def avatar_image(assigns) do
    ~H"""
    aspect-square h-full w-full", @class])}
      {@rest}
      phx-update="ignore"
      style="display:none"
      onload="this.style.display=''"
    />
    """
  end

  attr(:class, :string, default: nil)
  attr(:rest, :global)
  slot(:inner_block, required: false)

  def avatar_fallback(assigns) do
    ~H"""
    flex h-full w-full items-center justify-center rounded-full bg-muted", @class])
      }
      {@rest}
    >
      <%= render_slot(@inner_block) %>
    
    """
  end
end
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ممکن است متوجه شوید که من استفاده می کنم onload رویداد به جای onerror:

style="display:none"
onload="this.style.display=''"
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

استفاده كردن onerror مرورگر منتظر می ماند تا بارگیری تصویر کامل شود تا تصمیم بگیرد که آیا خطایی وجود دارد یا خیر و سپس رویداد را راه اندازی کند. این باعث ایجاد آواتار سفید در هنگام بارگیری تصویر می شود. استفاده كردن onload رویداد برای نمایش تصویر پس از تکمیل فرآیند بارگذاری، بنابراین به طور پیش فرض اگر بارگذاری تصویر کند باشد، آواتار بازگشتی همچنان نمایش داده می شود.

اگر می‌خواهید بیشتر بدانید، از مخزن github من https://github.com/bluzky/salad_ui دیدن کنید.

با تشکر برای خواندن.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا