我正在使用Leptos框架开发一个简单的应用程序,它更新了一个计数器。我已经克隆了一个ReadSignal
和它对应的setter函数。然而,我注意到,当我更新原始信号和克隆信号时,它们都增加了相同的值。
#[component]
fn App(cx: Scope) -> impl IntoView {
let (count, set_count) = create_signal(cx, 0);
let dup_count = count.clone();
let dup_set = set_count.clone();
view! { cx,
<div>
<button
on:click=move |_| {
set_count.update(|n| *n += 1);
dup_set.update(|n| *n += 2);
}
>
"Click me: "
{count.get()}
</button>
<div>{count}</div>
<div>{dup_count}</div>
<ProgressBar progress=count />
<ProgressBar progress=dup_count />
</div>
}
}
字符串
我正试图更好地理解信号和Leptos中的不同方法。我希望有一些解释来加深我的理解。提前谢谢你!
3条答案
按热度按时间tmb3ates1#
信号的工作方式与通道类似。一对
WriteSignal
和ReadSignal
始终相互连接,它们的克隆也是如此。这意味着您可以通过克隆WriteSignal
来更新来自多个位置的相同信号,并通过克隆ReadSignal
来对来自多个位置的相同信号做出React。如果你想创建一个新的
WriteSignal
,它不连接到原来的ReadSignal
,那么你需要用create_signal
从头开始创建它。qaxu7uf22#
解决问题的方法可能是添加move||:
字符串
参见https://leptos-rs.github.io/leptos/view/01_basic_component.html,其中解释了这一点。
zwghvu4y3#
由于信号是如何在leptos中构建的,克隆一个信号并不是简单地从零开始克隆它的存在,而是创建一个对父信号的“引用”。正如在另一个答案中所述,这可以通过单独构建另一个信号来轻松避免。
字符串
注意,这个例子使用了nightlyrust,所以没有.get()类型的信号表示法