Struct next_rs::prelude::rsx::PhantomComponent

source ยท
pub struct PhantomComponent<T>
where T: BaseComponent,
{ /* private fields */ }
Expand description

A Component to represent a component that does not exist in current implementation.

During Hydration, Yew expected the Virtual DOM hierarchy to match the the layout used in server-side rendering. However, sometimes it is possible / reasonable to omit certain components from one side of the implementation. This component is used to represent a component as if a component โ€œexistedโ€ in the place it is defined.

ยงWarning

The Real DOM hierarchy must also match the server-side rendered artifact. This component is only usable when the original component does not introduce any additional elements. (e.g.: Context Providers)

A generic parameter is provided to help identify the component to be substituted. The type of the generic parameter is not required to be the same component that was in the other implementation. However, this behaviour may change in the future if more debug assertions were to be introduced. It is recommended that the generic parameter represents the component in the other implementation.

ยงExample

use yew::prelude::*;

#[function_component]
fn ServerApp() -> Html {
    // The Server Side Rendering Application has 3 Providers.
    html! {
        <Provider1>
            <Provider2>
                <Provider3>
                    <Comp />
                </Provider3>
            </Provider2>
        </Provider1>
    }
}

#[function_component]
fn App() -> Html {
    // The Client Side Rendering Application has 4 Providers.
    html! {
        <Provider1>
            <Provider2>
                <Provider3>

                    // This provider does not exist on the server-side
                    // Hydration will fail due to Virtual DOM layout mismatch.
                    <Provider4>
                        <Comp />
                    </Provider4>

                </Provider3>
            </Provider2>
        </Provider1>
    }
}

To mitigate this, we can use a PhantomComponent:

use yew::prelude::*;

#[function_component]
fn ServerApp() -> Html {
    html! {
        <Provider1>
            <Provider2>
                <Provider3>
                    // We add a PhantomComponent for Provider4,
                    // it acts if a Provider4 component presents in this position.
                    <PhantomComponent<Provider4>>
                        <Comp />
                    </PhantomComponent<Provider4>>
                </Provider3>
            </Provider2>
        </Provider1>
    }
}

#[function_component]
fn App() -> Html {
    html! {
        <Provider1>
            <Provider2>
                <Provider3>

                    // Hydration will succeed as the PhantomComponent in the server-side
                    // implementation will represent a Provider4 component in this position.
                    <Provider4>
                        <Comp />
                    </Provider4>

                </Provider3>
            </Provider2>
        </Provider1>
    }
}

Trait Implementationsยง

sourceยง

impl<T> BaseComponent for PhantomComponent<T>
where T: BaseComponent + 'static, PhantomComponent<T>: 'static,

ยง

type Message = ()

The Componentโ€™s Message.
ยง

type Properties = ChildrenProps

The Componentโ€™s Properties.
sourceยง

fn create(ctx: &Context<PhantomComponent<T>>) -> PhantomComponent<T>

Creates a component.
sourceยง

fn update( &mut self, _ctx: &Context<PhantomComponent<T>>, _msg: <PhantomComponent<T> as BaseComponent>::Message ) -> bool

Updates componentโ€™s internal state.
sourceยง

fn changed( &mut self, _ctx: &Context<PhantomComponent<T>>, _old_props: &<PhantomComponent<T> as BaseComponent>::Properties ) -> bool

React to changes of component properties.
sourceยง

fn view(&self, ctx: &Context<PhantomComponent<T>>) -> Result<VNode, RenderError>

Returns a component layout to be rendered.
sourceยง

fn rendered(&mut self, _ctx: &Context<PhantomComponent<T>>, _first_render: bool)

Notified after a layout is rendered.
sourceยง

fn destroy(&mut self, _ctx: &Context<PhantomComponent<T>>)

Notified before a component is destroyed.
sourceยง

fn prepare_state(&self) -> Option<String>

Prepares the server-side state.
sourceยง

impl<T> Debug for PhantomComponent<T>
where T: BaseComponent,

sourceยง

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
sourceยง

impl<T> FunctionProvider for PhantomComponent<T>
where T: BaseComponent,

ยง

type Properties = ChildrenProps

Properties for the Function Component.
sourceยง

fn run( ctx: &mut HookContext, props: &<PhantomComponent<T> as FunctionProvider>::Properties ) -> Result<VNode, RenderError>

Render the component. This function returns the Html to be rendered for the component. Read more

Auto Trait Implementationsยง

Blanket Implementationsยง

sourceยง

impl<T> Any for T
where T: 'static + ?Sized,

sourceยง

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
sourceยง

impl<T> Borrow<T> for T
where T: ?Sized,

sourceยง

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
sourceยง

impl<T> BorrowMut<T> for T
where T: ?Sized,

sourceยง

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
sourceยง

impl<T> From<T> for T

sourceยง

fn from(t: T) -> T

Returns the argument unchanged.

ยง

impl<T> Instrument for T

ยง

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
ยง

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
sourceยง

impl<T, U> Into<U> for T
where U: From<T>,

sourceยง

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

sourceยง

impl<T> IntoPropValue<Option<T>> for T

sourceยง

fn into_prop_value(self) -> Option<T>

Convert self to a value of a Properties struct.
sourceยง

impl<T> IntoPropValue<T> for T

sourceยง

fn into_prop_value(self) -> T

Convert self to a value of a Properties struct.
sourceยง

impl<T, U> TryFrom<U> for T
where U: Into<T>,

ยง

type Error = Infallible

The type returned in the event of a conversion error.
sourceยง

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
sourceยง

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

ยง

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
sourceยง

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
ยง

impl<T> WithSubscriber for T

ยง

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
ยง

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
sourceยง

impl<Token, Builder, How> AllPropsFor<Builder, How> for Token
where Builder: Buildable<Token>, <Builder as Buildable<Token>>::WrappedToken: HasAllProps<<Builder as Buildable<Token>>::Output, How>,

sourceยง

impl<T> HasAllProps<(), T> for T