react router example -3
2020-08-05 本文已影响0人
penelope_2bad
1. StaticRouter Context
import React, { Component } from "react";
import { StaticRouter as Router, Route } from "react-router-dom";
// This example renders a route within a StaticRouter and populates its
// staticContext, which it then prints out. In the real world you would
// use the StaticRouter for server-side rendering:
// import express from "express";
// import ReactDOMServer from "react-dom/server";
// const app = express()
// app.get('*', (req, res) => {
// let staticContext = {}
// let html = ReactDOMServer.renderToString(
// <StaticRouter location={req.url} context={staticContext}>
// <App /> (includes the RouteStatus component below e.g. for 404 errors)
// </StaticRouter>
// );
// res.status(staticContext.statusCode || 200).send(html);
// });
// app.listen(process.env.PORT || 3000);
function RouteStatus(props) {
return (
<Route
render={({ staticContext }) => {
// we have to check if staticContext exists
// because it will be undefined if rendered through a BrowserRouter
if (staticContext) {
staticContext.statusCode = props.statusCode;
}
return <div>{props.children}</div>;
}}
/>
);
}
function PrintContext(props) {
return <p>Static context: {JSON.stringify(props.staticContext)}</p>;
}
export default class StaticRouterExample extends Component {
// This is the context object that we pass to the StaticRouter.
// It can be modified by routes to provide additional information
// for the server-side render
staticContext = {};
render() {
return (
<Router location="/foo" context={this.staticContext}>
<div>
<RouteStatus statusCode={404}>
<p>Route with statusCode 404</p>
<PrintContext staticContext={this.staticContext} />
</RouteStatus>
</div>
</Router>
);
}
}
2. Query Parameters
import React from "react";
import { BrowserRouter as Router, Link, useLocation } from "react-router-dom";
// React Router does not have any opinions about
// how you should parse URL query strings.
//
// If you use simple key=value query strings and
// you do not need to support IE 11, you can use
// the browser's built-in URLSearchParams API.
//
// If your query strings contain array or object
// syntax, you'll probably need to bring your own
// query parsing function.
export default function QueryParamsExample() {
return (
<Router>
<QueryParamsDemo />
</Router>
);
}
// A custom hook that builds on useLocation to parse
// the query string for you.
function useQuery() {
return new URLSearchParams(useLocation().search);
}
function QueryParamsDemo() {
let query = useQuery();
console.log("---query--", query, query.get("name"));
return (
<div>
<div>
<h2>Accounts</h2>
<ul>
<li>
<Link to="/account?name=netflix">Netflix</Link>
</li>
<li>
<Link to="/account?name=zillow-group">Zillow Group</Link>
</li>
<li>
<Link to="/account?name=yahoo">Yahoo</Link>
</li>
<li>
<Link to="/account?name=modus-create">Modus Create</Link>
</li>
</ul>
<Child name={query.get("name")} />
</div>
</div>
);
}
function Child({ name }) {
return (
<div>
{name ? (
<h3>
The <code>name</code> in the query string is "{name}
"
</h3>
) : (
<h3>There is no name in the query string</h3>
)}
</div>
);
}