WebApps 2

Client side rendering

If the WebApp requires client side functionallity. E.g. trigger events on clicks or collect user input. Opt for the client side rendering option.

Example

Assume the same example WebApp in the index.js example.

// index.js
import * as React from 'react';
import { renderToString } from 'react-dom/server';
...
router.get("/", (req, res) => {
  ...
  // Renders the App component statically
  res.agnosticRender(renderToString(<App name={name} />), {
    name,
  });
});

router.get("/published", (req, res) => {
  ...
  res.json({
    date,
  });
});
// main.js
import * as React from "react";
import ReactDOM from "react-dom";
import App from "./components/App";

export default (initialState, el) => {
   /* Update the rendered App component to
      include client side functionallity.
      
      E.g. to trigger a request on button click
      and display the fetched value.
   */
  ReactDOM.hydrate(<App name={initialState.name} />, el);
};
// components/App.js
import * as React from "react";
import PropTypes from "prop-types";
import router from "@sitevision/api/common/router";

// client side SDK
import toasts from "@sitevision/api/client/toasts";
import requester from "@sitevision/api/client/requester";


const App = ({ name }) => {
  // function to trigger on button click
  const moreInfo = () => {
    // send request to the /published route
    requester
      .doGet({
        url: router.getStandaloneUrl("/published"),
      })
      .then(({ date }) => {
        // Display date in a toast
        toasts.publish({
          ttl: 5,
          message: `Last published ${date}`,
        });
      });
  };

  // If no client side functionallity included onClick would never trigger
  return (
    <>
      <div className="env-text-h4">Welcome to {name}!</div>
      <button
        onClick={moreInfo}
        className="env-button env-button--primary env-button--large"
      >
        Latest publish
      </button>
    </>
  );
};

App.propTypes = {
  name: PropTypes.string,
};

export default App;

Example result

Welcome to Client side rendering!