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 دیدن کنید.
با تشکر برای خواندن.