rust 为什么克隆一个Leptos信号会导致多次更新同一个值?

rkttyhzu  于 2023-11-19  发布在  其他
关注(0)|答案(3)|浏览(162)

我正在使用Leptos框架开发一个简单的应用程序,它更新了一个计数器。我已经克隆了一个ReadSignal和它对应的setter函数。然而,我注意到,当我更新原始信号和克隆信号时,它们都增加了相同的值。

  1. #[component]
  2. fn App(cx: Scope) -> impl IntoView {
  3. let (count, set_count) = create_signal(cx, 0);
  4. let dup_count = count.clone();
  5. let dup_set = set_count.clone();
  6. view! { cx,
  7. <div>
  8. <button
  9. on:click=move |_| {
  10. set_count.update(|n| *n += 1);
  11. dup_set.update(|n| *n += 2);
  12. }
  13. >
  14. "Click me: "
  15. {count.get()}
  16. </button>
  17. <div>{count}</div>
  18. <div>{dup_count}</div>
  19. <ProgressBar progress=count />
  20. <ProgressBar progress=dup_count />
  21. </div>
  22. }
  23. }

字符串
我正试图更好地理解信号和Leptos中的不同方法。我希望有一些解释来加深我的理解。提前谢谢你!

tmb3ates

tmb3ates1#

信号的工作方式与通道类似。一对WriteSignalReadSignal始终相互连接,它们的克隆也是如此。这意味着您可以通过克隆WriteSignal来更新来自多个位置的相同信号,并通过克隆ReadSignal来对来自多个位置的相同信号做出React。
如果你想创建一个新的WriteSignal,它不连接到原来的ReadSignal,那么你需要用create_signal从头开始创建它。

qaxu7uf2

qaxu7uf22#

解决问题的方法可能是添加move||

  1. <button
  2. on:click=move |_| {
  3. set_count.update(|n| *n += 1);
  4. dup_set.update(|n| *n += 2);
  5. }
  6. "Click me: " {move || count.get()}
  7. </button>

字符串
参见https://leptos-rs.github.io/leptos/view/01_basic_component.html,其中解释了这一点。

zwghvu4y

zwghvu4y3#

由于信号是如何在leptos中构建的,克隆一个信号并不是简单地从零开始克隆它的存在,而是创建一个对父信号的“引用”。正如在另一个答案中所述,这可以通过单独构建另一个信号来轻松避免。

  1. let (apple, set_apple) = create_signal(String::new());
  2. let setapple_clone = set_apple.clone();
  3. setapple_clone("from clone".to_string()); // setapple_clone practically inherits the functionality of set_apple as if it was only copied
  4. println!("{}",apple()); // "from clone"
  5. set_apple("from parent".to_string());
  6. println!("{}",apple()); // "from parent"

字符串
注意,这个例子使用了nightlyrust,所以没有.get()类型的信号表示法

相关问题