123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- //! Example: SSR
- //!
- //! This example shows how we can render the Dioxus Virtualdom using SSR.
- use dioxus::core::{Attribute, HasAttributesBox};
- use dioxus::html::GlobalAttributesExtension;
- use dioxus::html::{AudioExtension, ExtendedAudioMarker, ExtendedGlobalAttributesMarker};
- use dioxus::prelude::*;
- fn main() {
- // We can render VirtualDoms
- let mut vdom = VirtualDom::new(app);
- let _ = vdom.rebuild();
- println!("{}", dioxus_ssr::render(&vdom));
- }
- fn app(cx: Scope) -> Element {
- cx.render(rsx!(Foo {
- autoplay: true,
- controls: true,
- src: "https://www.w3schools.com/tags/horse.ogg",
- width: "100",
- }))
- }
- pub struct FooProps<'a> {
- pub open: Option<&'a str>,
- attributes: Vec<Attribute<'a>>,
- }
- // -----
- impl<'a> FooProps<'a> {
- #[doc = "\nCreate a builder for building `FooProps`.\nOn the builder, call `.open(...)`(optional) to set the values of the fields.\nFinally, call `.build()` to create the instance of `FooProps`.\n "]
- #[allow(dead_code)]
- pub fn builder(cx: &'a ScopeState) -> FooPropsBuilder<'a, ((),)> {
- FooPropsBuilder {
- bump: cx.bump(),
- fields: ((),),
- attributes: Vec::new(),
- _phantom: core::default::Default::default(),
- }
- }
- }
- #[must_use]
- #[doc(hidden)]
- #[allow(dead_code, non_camel_case_types, non_snake_case)]
- pub struct FooPropsBuilder<'a, TypedBuilderFields> {
- bump: &'a ::dioxus::core::exports::bumpalo::Bump,
- fields: TypedBuilderFields,
- attributes: Vec<Attribute<'a>>,
- _phantom: core::marker::PhantomData<&'a ()>,
- }
- //impl<'a, TypedBuilderFields, > Clone for FooPropsBuilder<'a, TypedBuilderFields, > where TypedBuilderFields: Clone { fn clone(&self) -> Self { Self { fields: self.fields.clone(), attributes: self.attributes, _phantom: Default::default() } } }
- impl<'a> dioxus::prelude::Properties<'a> for FooProps<'a> {
- type Builder = FooPropsBuilder<'a, ((),)>;
- const IS_STATIC: bool = false;
- fn builder(cx: &'a ScopeState) -> Self::Builder {
- FooProps::builder(cx)
- }
- unsafe fn memoize(&self, _other: &Self) -> bool {
- false
- }
- }
- #[doc(hidden)]
- #[allow(dead_code, non_camel_case_types, non_snake_case)]
- pub trait FooPropsBuilder_Optional<T> {
- fn into_value<F: FnOnce() -> T>(self, default: F) -> T;
- }
- impl<T> FooPropsBuilder_Optional<T> for () {
- fn into_value<F: FnOnce() -> T>(self, default: F) -> T {
- default()
- }
- }
- impl<T> FooPropsBuilder_Optional<T> for (T,) {
- fn into_value<F: FnOnce() -> T>(self, _: F) -> T {
- self.0
- }
- }
- #[allow(dead_code, non_camel_case_types, missing_docs)]
- impl<'a> FooPropsBuilder<'a, ((),)> {
- pub fn open(
- self,
- open: &'a str,
- ) -> FooPropsBuilder<
- 'a,
- ((
- Option<&'a str>,
- // pub attributes: Vec<Attribute<'a>>,
- ),),
- > {
- let open = (Some(open),);
- let (_,) = self.fields;
- FooPropsBuilder {
- bump: self.bump,
- fields: (open,),
- attributes: self.attributes,
- _phantom: self._phantom,
- }
- }
- }
- #[doc(hidden)]
- #[allow(dead_code, non_camel_case_types, non_snake_case)]
- pub enum FooPropsBuilder_Error_Repeated_field_open {}
- #[doc(hidden)]
- #[allow(dead_code, non_camel_case_types, missing_docs)]
- impl<'a>
- FooPropsBuilder<
- 'a,
- ((
- Option<&'a str>,
- // pub attributes: Vec<Attribute<'a>>,
- ),),
- >
- {
- #[deprecated(note = "Repeated field open")]
- pub fn open(
- self,
- _: FooPropsBuilder_Error_Repeated_field_open,
- ) -> FooPropsBuilder<
- 'a,
- ((
- Option<&'a str>,
- // pub attributes: Vec<Attribute<'a>>,
- ),),
- > {
- self
- }
- }
- #[allow(dead_code, non_camel_case_types, missing_docs)]
- impl<'a, __open: FooPropsBuilder_Optional<Option<&'a str>>> FooPropsBuilder<'a, (__open,)> {
- pub fn build(self) -> FooProps<'a> {
- let (open,) = self.fields;
- let open = FooPropsBuilder_Optional::into_value(open, || Default::default());
- FooProps {
- open,
- attributes: self.attributes,
- }
- }
- }
- // -----
- impl<'a, A> HasAttributesBox<'a, FooPropsBuilder<'a, (A,)>> for FooPropsBuilder<'a, (A,)> {
- fn push_attribute(
- self,
- name: &'a str,
- ns: Option<&'static str>,
- attr: impl IntoAttributeValue<'a>,
- volatile: bool,
- ) -> Self {
- let mut attrs = self.attributes;
- // We insert attributes so that the list is binary-searchable
- if let Err(index) = attrs.binary_search_by(|probe| probe.name.cmp(name)) {
- attrs.insert(
- index,
- Attribute::new(name, attr.into_value(self.bump), ns, volatile),
- );
- }
- FooPropsBuilder {
- bump: self.bump,
- fields: self.fields,
- attributes: attrs,
- _phantom: self._phantom,
- }
- }
- }
- impl<A> ExtendedGlobalAttributesMarker for FooPropsBuilder<'_, (A,)> {}
- impl<A> ExtendedAudioMarker for FooPropsBuilder<'_, (A,)> {}
- #[allow(non_snake_case)]
- pub fn Foo<'a>(cx: Scope<'a, FooProps<'a>>) -> Element<'a> {
- let attributes = &cx.props.attributes;
- render! {
- // rsx! {
- // audio {
- // ...attributes,
- // }
- // }
- ::dioxus::core::LazyNodes::new(move |__cx: &::dioxus::core::ScopeState| -> ::dioxus::core::VNode {
- static TEMPLATE: ::dioxus::core::Template = ::dioxus::core::Template { name: concat!(file!(), ":", line!(), ":", column!(), ":", "123" ), roots: &[::dioxus::core::TemplateNode::Element { tag: dioxus_elements::audio::TAG_NAME, namespace: dioxus_elements::audio::NAME_SPACE, attrs: &[::dioxus::core::TemplateAttribute::Dynamic { id: 0usize }], children: &[] }], node_paths: &[], attr_paths: &[&[0u8]] };
- let attrs = vec![(&**attributes).into()];
- ::dioxus::core::VNode {
- parent: None,
- key: None,
- template: std::cell::Cell::new(TEMPLATE),
- root_ids: dioxus::core::exports::bumpalo::collections::Vec::new_in(__cx.bump()).into(),
- dynamic_nodes: __cx.bump().alloc([]),
- dynamic_attrs: __cx.bump().alloc(attrs),
- }
- })
- }
- }
|