feat: Modal component prop

This commit is contained in:
luoxiao 2023-06-02 22:54:57 +08:00
parent 808e844c3d
commit 275798a64b
8 changed files with 24 additions and 26 deletions

View file

@ -34,6 +34,9 @@ pub fn App(cx: Scope) -> impl IntoView {
<Route path="/image" view=move |cx| view! {cx, <Route path="/image" view=move |cx| view! {cx,
<ImagePage /> <ImagePage />
} /> } />
<Route path="/modal" view=move |cx| view! {cx,
<ModalPage />
} />
</Route> </Route>
</Routes> </Routes>
<Routes base="/mobile".to_string()> <Routes base="/mobile".to_string()>

View file

@ -1,18 +0,0 @@
use leptos::*;
use melt_ui::*;
#[component]
pub fn DemoModal(cx: Scope) -> impl IntoView {
let (open, set_open) = create_signal(cx, false);
let on_cancel = SignalSetter::map(cx, move |_| {
set_open.set(false);
});
view! { cx,
<Button on:click=move |_| set_open.update(move |value| *value = !*value)>
"open modal"
</Button>
<Modal title="标题" open=open on_cancel=on_cancel>
"sd"
</Modal>
}
}

View file

@ -1,7 +1,6 @@
mod app; mod app;
mod demo_button; mod demo_button;
mod demo_checkbox; mod demo_checkbox;
mod demo_modal;
mod demo_slider; mod demo_slider;
mod pages; mod pages;

View file

@ -38,6 +38,7 @@ pub fn ComponentsPage(cx: Scope) -> impl IntoView {
<MenuItem key="tabbar" label="tabbar" /> <MenuItem key="tabbar" label="tabbar" />
<MenuItem key="input" label="input" /> <MenuItem key="input" label="input" />
<MenuItem key="image" label="image" /> <MenuItem key="image" label="image" />
<MenuItem key="modal" label="madal" />
</Menu> </Menu>
</aside> </aside>
<main> <main>

View file

@ -1,6 +1,5 @@
use crate::demo_button::*; use crate::demo_button::*;
use crate::demo_checkbox::*; use crate::demo_checkbox::*;
use crate::demo_modal::*;
use crate::demo_slider::*; use crate::demo_slider::*;
use leptos::*; use leptos::*;
use leptos_router::use_navigate; use leptos_router::use_navigate;
@ -43,8 +42,6 @@ pub fn Home(cx: Scope) -> impl IntoView {
<hr /> <hr />
<DemoButton /> <DemoButton />
<hr /> <hr />
<DemoModal/>
<hr />
<DemoCheckout /> <DemoCheckout />
<hr /> <hr />
<DemoSlider /> <DemoSlider />

View file

@ -4,6 +4,7 @@ mod image;
mod input; mod input;
mod menu; mod menu;
mod mobile; mod mobile;
mod modal;
mod slider; mod slider;
mod tabbar; mod tabbar;
@ -13,5 +14,6 @@ pub use image::*;
pub use input::*; pub use input::*;
pub use menu::*; pub use menu::*;
pub use mobile::*; pub use mobile::*;
pub use modal::*;
pub use slider::*; pub use slider::*;
pub use tabbar::*; pub use tabbar::*;

View file

@ -0,0 +1,15 @@
use leptos::*;
use melt_ui::*;
#[component]
pub fn ModalPage(cx: Scope) -> impl IntoView {
let show = create_rw_signal(cx, false);
view! { cx,
<Button on:click=move |_| show.set(true)>
"open modal"
</Button>
<Modal title="标题" show>
"sd"
</Modal>
}
}

View file

@ -11,8 +11,7 @@ pub fn Modal(
#[prop(optional, into)] title: Option<MaybeSignal<String>>, #[prop(optional, into)] title: Option<MaybeSignal<String>>,
children: Children, children: Children,
#[prop(optional)] footer: Option<Children>, #[prop(optional)] footer: Option<Children>,
#[prop(optional, into)] open: MaybeSignal<bool>, #[prop(into)] show: RwSignal<bool>,
#[prop(optional)] on_cancel: Option<SignalSetter<()>>,
) -> impl IntoView { ) -> impl IntoView {
let class_name = mount_style("modal", || style_sheet_str!("./src/modal/modal.css")); let class_name = mount_style("modal", || style_sheet_str!("./src/modal/modal.css"));
let header = move |cx| { let header = move |cx| {
@ -30,7 +29,7 @@ pub fn Modal(
view! { view! {
cx, cx,
<> <>
<span style="cursor: pointer;" on:click=move |_| if let Some(on_cancel) = &on_cancel { on_cancel.set(())}> <span style="cursor: pointer;" on:click=move |_| show.set(false)>
<Icon icon=AiIcon::AiCloseOutlined/> <Icon icon=AiIcon::AiCloseOutlined/>
</span> </span>
</> </>
@ -39,7 +38,7 @@ pub fn Modal(
view! { view! {
cx, class=class_name, cx, class=class_name,
<Teleport> <Teleport>
<div class="melt-modal-container" style=move || if open.get() { "" } else { "display: none" }> <div class="melt-modal-container" style=move || if show.get() { "" } else { "display: none" }>
<div class="melt-modal-mask"></div> <div class="melt-modal-mask"></div>
<div class="melt-modal-body"> <div class="melt-modal-body">
<Card header=Some(Box::new(header)) header_extra=Some(Box::new(header_extra)) footer=footer> <Card header=Some(Box::new(header)) header_extra=Some(Box::new(header_extra)) footer=footer>