UseFuture
use_future
permite executar um encerramento assíncrono e fornece seu resultado.
Por exemplo, podemos fazer uma solicitação de API dentro de use_future
:
#![allow(unused)] fn main() { let future = use_future(cx, (), |_| async move { reqwest::get("https://dog.ceo/api/breeds/image/random") .await .unwrap() .json::<ApiResponse>() .await }); }
O código dentro de use_future
será enviado ao agendador do Dioxus assim que o componente for renderizado.
Podemos usar .value()
para obter o resultado do Future
. Na primeira execução, como não há dados prontos quando o componente é carregado, seu valor será None
. No entanto, uma vez finalizado o Future
, o componente será renderizado novamente e o valor agora será Some(...)
, contendo o valor de retorno do encerramento.
Podemos então renderizar esse resultado:
#![allow(unused)] fn main() { cx.render(match future.value() { Some(Ok(response)) => rsx! { button { onclick: move |_| future.restart(), "Click to fetch another doggo" } div { img { max_width: "500px", max_height: "500px", src: "{response.image_url}", } } }, Some(Err(_)) => rsx! { div { "Loading dogs failed" } }, None => rsx! { div { "Loading dogs..." } }, }) }
Reiniciando o Future
O identificador UseFuture
fornece um método restart
. Ele pode ser usado para executar o Future
novamente, produzindo um novo valor.
Dependências
Muitas vezes, você precisará executar o Future
novamente toda vez que algum valor (por exemplo, uma prop) mudar. Ao invés de .restart
manualmente, você pode fornecer uma tupla de "dependências" para o gancho. Ele executará automaticamente o Future
quando qualquer uma dessas dependências for alterada. Exemplo:
#![allow(unused)] fn main() { let future = use_future(cx, (breed,), |(breed,)| async move { reqwest::get(format!("https://dog.ceo/api/breed/{breed}/images/random")) .await .unwrap() .json::<ApiResponse>() .await }); }