1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- //! This example shows how to use the `eval` function to run JavaScript code in the webview.
- //!
- //! Eval will only work with renderers that support javascript - so currently only the web and desktop/mobile renderers
- //! that use a webview. Native renderers will throw "unsupported" errors when calling `eval`.
- use async_std::task::sleep;
- use dioxus::prelude::*;
- fn main() {
- dioxus::launch(app);
- }
- fn app() -> Element {
- // Create a future that will resolve once the javascript has been successfully executed.
- let future = use_resource(move || async move {
- // Wait a little bit just to give the appearance of a loading screen
- sleep(std::time::Duration::from_secs(1)).await;
- // The `eval` is available in the prelude - and simply takes a block of JS.
- // Dioxus' eval is interesting since it allows sending messages to and from the JS code using the `await dioxus.recv()`
- // builtin function. This allows you to create a two-way communication channel between Rust and JS.
- let mut eval = document::eval(
- r#"
- dioxus.send("Hi from JS!");
- let msg = await dioxus.recv();
- console.log(msg);
- return "hi from JS!";
- "#,
- );
- // Send a message to the JS code.
- eval.send("Hi from Rust!").unwrap();
- // Our line on the JS side will log the message and then return "hello world".
- let res: String = eval.recv().await.unwrap();
- // This will print "Hi from JS!" and "Hi from Rust!".
- println!("{:?}", eval.await);
- res
- });
- match future.value().as_ref() {
- Some(v) => rsx!( p { "{v}" } ),
- _ => rsx!( p { "waiting.." } ),
- }
- }
|