add a way to subscribe to a dependency tuple for the use_resource hook
This commit is contained in:
1 parent
41809f9a1b
commit
2bbc609082
3 files changed
+73
-40
No files matched your search
Generated
+27
-34
@@ -2201,7 +2201,7 @@ version = "0.5.0-alpha.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"criterion 0.3.6",
|
"criterion 0.3.6",
|
||||||
"dioxus-config-macro",
|
"dioxus-config-macro",
|
||||||
"dioxus-core 0.5.0-alpha.0",
|
"dioxus-core",
|
||||||
"dioxus-core-macro",
|
"dioxus-core-macro",
|
||||||
"dioxus-desktop",
|
"dioxus-desktop",
|
||||||
"dioxus-fullstack",
|
"dioxus-fullstack",
|
||||||
@@ -2268,7 +2268,7 @@ dependencies = [
|
|||||||
"dioxus-autofmt",
|
"dioxus-autofmt",
|
||||||
"dioxus-check",
|
"dioxus-check",
|
||||||
"dioxus-cli-config",
|
"dioxus-cli-config",
|
||||||
"dioxus-core 0.5.0-alpha.0",
|
"dioxus-core",
|
||||||
"dioxus-hot-reload",
|
"dioxus-hot-reload",
|
||||||
"dioxus-html",
|
"dioxus-html",
|
||||||
"dioxus-rsx",
|
"dioxus-rsx",
|
||||||
@@ -2356,20 +2356,6 @@ dependencies = [
|
|||||||
"tracing-subscriber",
|
"tracing-subscriber",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "dioxus-core"
|
|
||||||
version = "0.5.0-alpha.0"
|
|
||||||
source = "git+https://github.com/DioxusLabs/dioxus#44d09fcd2de4af32c8a3a107cabdd3e6860baeeb"
|
|
||||||
dependencies = [
|
|
||||||
"futures-channel",
|
|
||||||
"futures-util",
|
|
||||||
"longest-increasing-subsequence",
|
|
||||||
"rustc-hash",
|
|
||||||
"slab",
|
|
||||||
"tracing",
|
|
||||||
"tracing-subscriber",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dioxus-core-macro"
|
name = "dioxus-core-macro"
|
||||||
version = "0.5.0-alpha.0"
|
version = "0.5.0-alpha.0"
|
||||||
@@ -2400,7 +2386,7 @@ dependencies = [
|
|||||||
"core-foundation",
|
"core-foundation",
|
||||||
"dioxus",
|
"dioxus",
|
||||||
"dioxus-cli-config",
|
"dioxus-cli-config",
|
||||||
"dioxus-core 0.5.0-alpha.0",
|
"dioxus-core",
|
||||||
"dioxus-hooks",
|
"dioxus-hooks",
|
||||||
"dioxus-hot-reload",
|
"dioxus-hot-reload",
|
||||||
"dioxus-html",
|
"dioxus-html",
|
||||||
@@ -2501,7 +2487,7 @@ name = "dioxus-hooks"
|
|||||||
version = "0.5.0-alpha.0"
|
version = "0.5.0-alpha.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dioxus",
|
"dioxus",
|
||||||
"dioxus-core 0.5.0-alpha.0",
|
"dioxus-core",
|
||||||
"dioxus-debug-cell",
|
"dioxus-debug-cell",
|
||||||
"dioxus-signals",
|
"dioxus-signals",
|
||||||
"futures-channel",
|
"futures-channel",
|
||||||
@@ -2519,7 +2505,7 @@ name = "dioxus-hot-reload"
|
|||||||
version = "0.5.0-alpha.0"
|
version = "0.5.0-alpha.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
"dioxus-core 0.5.0-alpha.0",
|
"dioxus-core",
|
||||||
"dioxus-html",
|
"dioxus-html",
|
||||||
"dioxus-rsx",
|
"dioxus-rsx",
|
||||||
"execute",
|
"execute",
|
||||||
@@ -2536,7 +2522,7 @@ name = "dioxus-html"
|
|||||||
version = "0.5.0-alpha.0"
|
version = "0.5.0-alpha.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"dioxus-core 0.5.0-alpha.0",
|
"dioxus-core",
|
||||||
"dioxus-html-internal-macro",
|
"dioxus-html-internal-macro",
|
||||||
"dioxus-rsx",
|
"dioxus-rsx",
|
||||||
"enumset",
|
"enumset",
|
||||||
@@ -2569,7 +2555,7 @@ dependencies = [
|
|||||||
name = "dioxus-interpreter-js"
|
name = "dioxus-interpreter-js"
|
||||||
version = "0.5.0-alpha.0"
|
version = "0.5.0-alpha.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dioxus-core 0.5.0-alpha.0",
|
"dioxus-core",
|
||||||
"dioxus-html",
|
"dioxus-html",
|
||||||
"js-sys",
|
"js-sys",
|
||||||
"md5",
|
"md5",
|
||||||
@@ -2585,7 +2571,7 @@ name = "dioxus-lib"
|
|||||||
version = "0.5.0-alpha.0"
|
version = "0.5.0-alpha.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dioxus-config-macro",
|
"dioxus-config-macro",
|
||||||
"dioxus-core 0.5.0-alpha.0",
|
"dioxus-core",
|
||||||
"dioxus-core-macro",
|
"dioxus-core-macro",
|
||||||
"dioxus-hooks",
|
"dioxus-hooks",
|
||||||
"dioxus-html",
|
"dioxus-html",
|
||||||
@@ -2600,7 +2586,7 @@ dependencies = [
|
|||||||
"axum",
|
"axum",
|
||||||
"dioxus",
|
"dioxus",
|
||||||
"dioxus-cli-config",
|
"dioxus-cli-config",
|
||||||
"dioxus-core 0.5.0-alpha.0",
|
"dioxus-core",
|
||||||
"dioxus-hot-reload",
|
"dioxus-hot-reload",
|
||||||
"dioxus-html",
|
"dioxus-html",
|
||||||
"dioxus-interpreter-js",
|
"dioxus-interpreter-js",
|
||||||
@@ -2634,7 +2620,7 @@ dependencies = [
|
|||||||
"anymap 1.0.0-beta.2",
|
"anymap 1.0.0-beta.2",
|
||||||
"dashmap",
|
"dashmap",
|
||||||
"dioxus",
|
"dioxus",
|
||||||
"dioxus-core 0.5.0-alpha.0",
|
"dioxus-core",
|
||||||
"dioxus-native-core",
|
"dioxus-native-core",
|
||||||
"dioxus-native-core-macro",
|
"dioxus-native-core-macro",
|
||||||
"keyboard-types",
|
"keyboard-types",
|
||||||
@@ -2743,7 +2729,7 @@ dependencies = [
|
|||||||
name = "dioxus-rsx"
|
name = "dioxus-rsx"
|
||||||
version = "0.5.0-alpha.0"
|
version = "0.5.0-alpha.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dioxus-core 0.5.0-alpha.0",
|
"dioxus-core",
|
||||||
"internment",
|
"internment",
|
||||||
"krates",
|
"krates",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
@@ -2758,7 +2744,7 @@ name = "dioxus-signals"
|
|||||||
version = "0.5.0-alpha.0"
|
version = "0.5.0-alpha.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dioxus",
|
"dioxus",
|
||||||
"dioxus-core 0.5.0-alpha.0",
|
"dioxus-core",
|
||||||
"futures-channel",
|
"futures-channel",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"generational-box",
|
"generational-box",
|
||||||
@@ -2782,7 +2768,7 @@ dependencies = [
|
|||||||
"async-trait",
|
"async-trait",
|
||||||
"chrono",
|
"chrono",
|
||||||
"dioxus",
|
"dioxus",
|
||||||
"dioxus-core 0.5.0-alpha.0",
|
"dioxus-core",
|
||||||
"dioxus-html",
|
"dioxus-html",
|
||||||
"dioxus-signals",
|
"dioxus-signals",
|
||||||
"fern",
|
"fern",
|
||||||
@@ -2813,7 +2799,7 @@ dependencies = [
|
|||||||
"criterion 0.3.6",
|
"criterion 0.3.6",
|
||||||
"crossterm 0.26.1",
|
"crossterm 0.26.1",
|
||||||
"dioxus",
|
"dioxus",
|
||||||
"dioxus-core 0.5.0-alpha.0",
|
"dioxus-core",
|
||||||
"dioxus-hot-reload",
|
"dioxus-hot-reload",
|
||||||
"dioxus-html",
|
"dioxus-html",
|
||||||
"dioxus-native-core",
|
"dioxus-native-core",
|
||||||
@@ -2831,7 +2817,7 @@ dependencies = [
|
|||||||
"async-trait",
|
"async-trait",
|
||||||
"console_error_panic_hook",
|
"console_error_panic_hook",
|
||||||
"dioxus",
|
"dioxus",
|
||||||
"dioxus-core 0.5.0-alpha.0",
|
"dioxus-core",
|
||||||
"dioxus-html",
|
"dioxus-html",
|
||||||
"dioxus-interpreter-js",
|
"dioxus-interpreter-js",
|
||||||
"dioxus-ssr",
|
"dioxus-ssr",
|
||||||
@@ -5714,15 +5700,18 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "manganis"
|
name = "manganis"
|
||||||
version = "0.1.1"
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c10916db4ed51967d92545eb5629ce1e1cc05c74da2cd2aab6ab6c57c2e838b6"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dioxus-core 0.5.0-alpha.0 (git+https://github.com/DioxusLabs/dioxus)",
|
|
||||||
"manganis-macro",
|
"manganis-macro",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "manganis-cli-support"
|
name = "manganis-cli-support"
|
||||||
version = "0.1.1"
|
version = "0.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "081bb598e2046ee191f90f454f772f83d4327b665e6fcb090ea3ed808712ba55"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"cargo-lock 9.0.0",
|
"cargo-lock 9.0.0",
|
||||||
@@ -5747,7 +5736,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "manganis-common"
|
name = "manganis-common"
|
||||||
version = "0.1.1"
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "82ee0f9002a9f5d7e3b662e55562996c60401bae16da23f3790c52e0823216ea"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"base64",
|
"base64",
|
||||||
@@ -5761,7 +5752,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "manganis-macro"
|
name = "manganis-macro"
|
||||||
version = "0.1.1"
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "da50cc6074480dc6c255a09c9d48dd4a379e6162feb5d308ec33d5ba9da4e579"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"manganis-common",
|
"manganis-common",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/// A dependency is a trait that can be used to determine if a effect or selector should be re-run.
|
/// A dependency is a trait that can be used to determine if a effect or selector should be re-run.
|
||||||
pub trait Dependency: Sized + Clone {
|
pub trait Dependency: Sized + Clone {
|
||||||
/// The output of the dependency
|
/// The output of the dependency
|
||||||
type Out: Clone + PartialEq;
|
type Out: Clone + PartialEq + 'static;
|
||||||
/// Returns the output of the dependency.
|
/// Returns the output of the dependency.
|
||||||
fn out(&self) -> Self::Out;
|
fn out(&self) -> Self::Out;
|
||||||
/// Returns true if the dependency has changed.
|
/// Returns true if the dependency has changed.
|
||||||
@@ -16,10 +16,10 @@ impl Dependency for () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// A dependency is a trait that can be used to determine if a effect or selector should be re-run.
|
/// A dependency is a trait that can be used to determine if a effect or selector should be re-run.
|
||||||
pub trait Dep: 'static + PartialEq + Clone {}
|
pub trait DependencyElement: 'static + PartialEq + Clone {}
|
||||||
impl<T> Dep for T where T: 'static + PartialEq + Clone {}
|
impl<T> DependencyElement for T where T: 'static + PartialEq + Clone {}
|
||||||
|
|
||||||
impl<A: Dep> Dependency for &A {
|
impl<A: DependencyElement> Dependency for &A {
|
||||||
type Out = A;
|
type Out = A;
|
||||||
fn out(&self) -> Self::Out {
|
fn out(&self) -> Self::Out {
|
||||||
(*self).clone()
|
(*self).clone()
|
||||||
@@ -33,7 +33,7 @@ macro_rules! impl_dep {
|
|||||||
impl< $($el),* > Dependency for ($(&$el,)*)
|
impl< $($el),* > Dependency for ($(&$el,)*)
|
||||||
where
|
where
|
||||||
$(
|
$(
|
||||||
$el: Dep
|
$el: DependencyElement
|
||||||
),*
|
),*
|
||||||
{
|
{
|
||||||
type Out = ($($el,)*);
|
type Out = ($($el,)*);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#![allow(missing_docs)]
|
#![allow(missing_docs)]
|
||||||
|
|
||||||
use crate::{use_callback, use_signal, UseCallback};
|
use crate::{dependency, use_callback, use_signal, UseCallback};
|
||||||
use dioxus_core::prelude::*;
|
use dioxus_core::prelude::*;
|
||||||
use dioxus_core::{
|
use dioxus_core::{
|
||||||
prelude::{spawn, use_hook},
|
prelude::{spawn, use_hook},
|
||||||
@@ -125,6 +125,46 @@ pub enum UseResourceState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<T> Resource<T> {
|
impl<T> Resource<T> {
|
||||||
|
/// Adds an explicit dependency to the resource. If the dependency changes, the resource's future will rerun.
|
||||||
|
///
|
||||||
|
/// Signals will automatically be added as dependencies, so you don't need to call this method for them.
|
||||||
|
///
|
||||||
|
/// NOTE: You must follow the rules of hooks when calling this method.
|
||||||
|
///
|
||||||
|
/// ```rust
|
||||||
|
/// # use dioxus::prelude::*;
|
||||||
|
/// # async fn sleep(delay: u32) {}
|
||||||
|
///
|
||||||
|
/// #[component]
|
||||||
|
/// fn Comp(delay: u32) -> Element {
|
||||||
|
/// // Because the resource subscribes to `delay` by adding it as a dependency, the resource's future will rerun every time `delay` changes.
|
||||||
|
/// let current_weather = use_resource(move || async move {
|
||||||
|
/// sleep(delay).await;
|
||||||
|
/// "Sunny"
|
||||||
|
/// })
|
||||||
|
/// .use_dependencies((&delay,));
|
||||||
|
///
|
||||||
|
/// rsx! {
|
||||||
|
/// // the value of the resource can be polled to
|
||||||
|
/// // conditionally render elements based off if it's future
|
||||||
|
/// // finished (Some(Ok(_)), errored Some(Err(_)),
|
||||||
|
/// // or is still running (None)
|
||||||
|
/// match &*current_weather.read_unchecked() {
|
||||||
|
/// Some(weather) => rsx! { "{weather}" },
|
||||||
|
/// None => rsx! { p { "Loading..." } }
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
pub fn use_dependencies(self, dependency: impl dependency::Dependency) -> Self {
|
||||||
|
let mut dependencies_signal = use_signal(|| dependency.out());
|
||||||
|
let changed = { dependency.changed(&*dependencies_signal.read()) };
|
||||||
|
if changed {
|
||||||
|
dependencies_signal.set(dependency.out());
|
||||||
|
}
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Restart the resource's future.
|
/// Restart the resource's future.
|
||||||
///
|
///
|
||||||
/// Will not cancel the previous future, but will ignore any values that it
|
/// Will not cancel the previous future, but will ignore any values that it
|
||||||
|
|||||||
Reference in new issue
Block a user