Skip to main content
Version: v0.x (deprecated)

createHydrationContext

This version is deprecated

This documentation is for use-less-react v0.x, which has been deprecated.
See v1.0 documentation for the current API.

Builds upon createGenericContext to handle server-to-client hydration of serializable class instances.


Overview

createHydrationContext provides two nested contexts:

  • One for passing dehydrated data (serialized) from server to client
  • Another for hydrating instances and sharing them to client components

Example

1. Define a serializable class

import { SerializableClass, PubSub, Notifies } from '@dxbox/use-less-react/classes';

@SerializableClass()
export class Sprite extends PubSub {
static readonly serialName: string = 'Sprite';

constructor(private x: number, private y: number) {
super();
}

get position() {
return { x: this.x, y: this.y };
}

@Notifies('position')
setPosition(x: number, y: number) {
this.x = x;
this.y = y;
}

static hydrate(obj: object): Sprite {
if ('x' in obj && 'y' in obj) {
return new Sprite(obj.x as number, obj.y as number);
}
throw new Error('invalid params');
}

dehydrate(): object {
return { x: this.x, y: this.y };
}
}

2. Register the class

// serializable-classes-registry.ts
export const serializableClassesRegistry: SerializableClassesRegistry = {
[Sprite.serialName]: Sprite,
};

3. Create the hydration context

import { createHydrationContext } from '@dxbox/use-less-react/client';

export const [HomepageHydrationProvider, useHomepageHydratedInstances] =
createHydrationContext<HomepageHydratedProps>(serializableClassesRegistry);

4. Use on server side

// page.ts (server side)
import { dehydrateInstances } from '@dxbox/use-less-react/classes';

function Homepage() {
const playerSprite = new Sprite(5, 5);
const value: HomepageHydratedProps = { playerSprite };

return (
<HomepageHydrationProvider dehydratedData={dehydrateInstances(value)}>
<HomepageClientSideComponent />
</HomepageHydrationProvider>
);
}

5. Use on client side

// client-component.tsx
function HomepageClientSideComponent() {
const { playerSprite } = useHomepageHydratedInstances();

const { state: position } = useReactiveInstance(
playerSprite,
(s) => s.position,
['position'],
);

return <div>Position: {position.x}, {position.y}</div>;
}

Migration: See v1.0 createHydrationContext for the modern equivalent.