Function leptos::create_multi_action

source ·
pub fn create_multi_action<I, O, F, Fu>(action_fn: F) -> MultiAction<I, O>
where I: 'static, O: 'static, F: Fn(&I) -> Fu + 'static, Fu: Future<Output = O> + 'static,
Expand description

Creates a MultiAction to synchronize an imperative async call to the synchronous reactive system.

If you’re trying to load data by running an async function reactively, you probably want to use a create_resource instead. If you’re trying to occasionally run an async function in response to something like a user clicking a button, you’re in the right place.

async fn send_new_todo_to_api(task: String) -> usize {
  // do something...
  // return a task id
  42
}
let add_todo = create_multi_action(|task: &String| {
  // `task` is given as `&String` because its value is available in `input`
  send_new_todo_to_api(task.clone())
});

add_todo.dispatch("Buy milk".to_string());
add_todo.dispatch("???".to_string());
add_todo.dispatch("Profit!!!".to_string());

assert_eq!(add_todo.submissions().get().len(), 3);

The input to the async function should always be a single value, but it can be of any type. The argument is always passed by reference to the function, because it is stored in Submission::input as well.

// if there's a single argument, just use that
let action1 = create_multi_action(|input: &String| {
    let input = input.clone();
    async move { todo!() }
});

// if there are no arguments, use the unit type `()`
let action2 = create_multi_action(|input: &()| async { todo!() });

// if there are multiple arguments, use a tuple
let action3 =
    create_multi_action(|input: &(usize, String)| async { todo!() });