pub struct Resource<T: 'static> { /* private fields */ }
Expand description
A handle to a reactive future spawned with use_resource
that can be used to modify or read the result of the future.
§Example
Reading the result of a resource:
fn App() -> Element {
let mut revision = use_signal(|| "1d03b42");
let mut resource = use_resource(move || async move {
// This will run every time the revision signal changes because we read the count inside the future
reqwest::get(format!("https://github.com/DioxusLabs/awesome-dioxus/blob/{revision}/awesome.json")).await
});
// Since our resource may not be ready yet, the value is an Option. Our request may also fail, so the get function returns a Result
// The complete type we need to match is `Option<Result<String, reqwest::Error>>`
// We can use `read_unchecked` to keep our matching code in one statement while avoiding a temporary variable error (this is still completely safe because dioxus checks the borrows at runtime)
match &*resource.read_unchecked() {
Some(Ok(value)) => rsx! { "{value:?}" },
Some(Err(err)) => rsx! { "Error: {err}" },
None => rsx! { "Loading..." },
}
}
Implementations§
Source§impl<T> Resource<T>
impl<T> Resource<T>
Sourcepub fn restart(&mut self)
pub fn restart(&mut self)
Restart the resource’s future.
This will cancel the current future and start a new one.
§Example
fn App() -> Element {
let mut revision = use_signal(|| "1d03b42");
let mut resource = use_resource(move || async move {
// This will run every time the revision signal changes because we read the count inside the future
reqwest::get(format!("https://github.com/DioxusLabs/awesome-dioxus/blob/{revision}/awesome.json")).await
});
rsx! {
button {
// We can get a signal with the value of the resource with the `value` method
onclick: move |_| resource.restart(),
"Restart resource"
}
"{resource:?}"
}
}
Sourcepub fn cancel(&mut self)
pub fn cancel(&mut self)
Forcefully cancel the resource’s future.
§Example
fn App() -> Element {
let mut revision = use_signal(|| "1d03b42");
let mut resource = use_resource(move || async move {
reqwest::get(format!("https://github.com/DioxusLabs/awesome-dioxus/blob/{revision}/awesome.json")).await
});
rsx! {
button {
// We can cancel the resource before it finishes with the `cancel` method
onclick: move |_| resource.cancel(),
"Cancel resource"
}
"{resource:?}"
}
}
Sourcepub fn pause(&mut self)
pub fn pause(&mut self)
Pause the resource’s future.
§Example
fn App() -> Element {
let mut revision = use_signal(|| "1d03b42");
let mut resource = use_resource(move || async move {
// This will run every time the revision signal changes because we read the count inside the future
reqwest::get(format!("https://github.com/DioxusLabs/awesome-dioxus/blob/{revision}/awesome.json")).await
});
rsx! {
button {
// We can pause the future with the `pause` method
onclick: move |_| resource.pause(),
"Pause"
}
button {
// And resume it with the `resume` method
onclick: move |_| resource.resume(),
"Resume"
}
"{resource:?}"
}
}
Sourcepub fn resume(&mut self)
pub fn resume(&mut self)
Resume the resource’s future.
§Example
fn App() -> Element {
let mut revision = use_signal(|| "1d03b42");
let mut resource = use_resource(move || async move {
// This will run every time the revision signal changes because we read the count inside the future
reqwest::get(format!("https://github.com/DioxusLabs/awesome-dioxus/blob/{revision}/awesome.json")).await
});
rsx! {
button {
// We can pause the future with the `pause` method
onclick: move |_| resource.pause(),
"Pause"
}
button {
// And resume it with the `resume` method
onclick: move |_| resource.resume(),
"Resume"
}
"{resource:?}"
}
}
Sourcepub fn clear(&mut self)
pub fn clear(&mut self)
Clear the resource’s value. This will just reset the value. It will not modify any running tasks.
§Example
fn App() -> Element {
let mut revision = use_signal(|| "1d03b42");
let mut resource = use_resource(move || async move {
// This will run every time the revision signal changes because we read the count inside the future
reqwest::get(format!("https://github.com/DioxusLabs/awesome-dioxus/blob/{revision}/awesome.json")).await
});
rsx! {
button {
// We clear the value without modifying any running tasks with the `clear` method
onclick: move |_| resource.clear(),
"Clear"
}
"{resource:?}"
}
}
Sourcepub fn task(&self) -> Task
pub fn task(&self) -> Task
Get a handle to the inner task backing this resource Modify the task through this handle will cause inconsistent state
Sourcepub fn finished(&self) -> bool
pub fn finished(&self) -> bool
Is the resource’s future currently finished running?
Reading this does not subscribe to the future’s state
§Example
fn App() -> Element {
let mut revision = use_signal(|| "1d03b42");
let mut resource = use_resource(move || async move {
// This will run every time the revision signal changes because we read the count inside the future
reqwest::get(format!("https://github.com/DioxusLabs/awesome-dioxus/blob/{revision}/awesome.json")).await
});
// We can use the `finished` method to check if the future is finished
if resource.finished() {
rsx! {
"The resource is finished"
}
} else {
rsx! {
"The resource is still running"
}
}
}
Sourcepub fn state(&self) -> ReadOnlySignal<UseResourceState>
pub fn state(&self) -> ReadOnlySignal<UseResourceState>
Get the current state of the resource’s future. This method returns a ReadOnlySignal
which can be read to get the current state of the resource or passed to other hooks and components.
§Example
fn App() -> Element {
let mut revision = use_signal(|| "1d03b42");
let mut resource = use_resource(move || async move {
// This will run every time the revision signal changes because we read the count inside the future
reqwest::get(format!("https://github.com/DioxusLabs/awesome-dioxus/blob/{revision}/awesome.json")).await
});
// We can read the current state of the future with the `state` method
match resource.state().cloned() {
UseResourceState::Pending => rsx! {
"The resource is still pending"
},
UseResourceState::Paused => rsx! {
"The resource has been paused"
},
UseResourceState::Stopped => rsx! {
"The resource has been stopped"
},
UseResourceState::Ready => rsx! {
"The resource is ready!"
},
}
}
Sourcepub fn value(&self) -> ReadOnlySignal<Option<T>>
pub fn value(&self) -> ReadOnlySignal<Option<T>>
Get the current value of the resource’s future. This method returns a ReadOnlySignal
which can be read to get the current value of the resource or passed to other hooks and components.
§Example
fn App() -> Element {
let mut revision = use_signal(|| "1d03b42");
let mut resource = use_resource(move || async move {
// This will run every time the revision signal changes because we read the count inside the future
reqwest::get(format!("https://github.com/DioxusLabs/awesome-dioxus/blob/{revision}/awesome.json")).await
});
// We can get a signal with the value of the resource with the `value` method
let value = resource.value();
// Since our resource may not be ready yet, the value is an Option. Our request may also fail, so the get function returns a Result
// The complete type we need to match is `Option<Result<String, reqwest::Error>>`
// We can use `read_unchecked` to keep our matching code in one statement while avoiding a temporary variable error (this is still completely safe because dioxus checks the borrows at runtime)
match &*value.read_unchecked() {
Some(Ok(value)) => rsx! { "{value:?}" },
Some(Err(err)) => rsx! { "Error: {err}" },
None => rsx! { "Loading..." },
}
}
Sourcepub fn suspend(&self) -> Result<MappedSignal<T>, RenderError>
pub fn suspend(&self) -> Result<MappedSignal<T>, RenderError>
Suspend the resource’s future and only continue rendering when the future is ready
Trait Implementations§
Source§impl<T: Clone> Deref for Resource<T>
Allow calling a signal with signal() syntax
impl<T: Clone> Deref for Resource<T>
Allow calling a signal with signal() syntax
Currently only limited to copy types, though could probably specialize for string/arc/rc