美文网首页
react - router example - 3

react - router example - 3

作者: penelope_2bad | 来源:发表于2020-08-04 21:57 被阅读0次

    1.sidebar

    import React from "react";
    import { BrowserRouter as Router, Switch, Route, Link } from "react-router-dom";
    
    // Each logical "route" has two components, one for
    // the sidebar and one for the main area. We want to
    // render both of them in different places when the
    // path matches the current URL.
    
    // We are going to use this route config in 2
    // spots: once for the sidebar and once in the main
    // content section. All routes are in the same
    // order they would appear in a <Switch>.
    const routes = [
      {
        path: "/",
        exact: true,
        sidebar: () => <div>home!</div>,
        main: () => <h2>Home</h2>,
      },
      {
        path: "/bubblegum",
        sidebar: () => <div>bubblegum!</div>,
        main: () => <h2>Bubblegum</h2>,
      },
      {
        path: "/shoelaces",
        sidebar: () => <div>shoelaces!</div>,
        main: () => <h2>Shoelaces</h2>,
      },
    ];
    
    export default function SidebarExample() {
      return (
        <Router>
          <div style={{ display: "flex" }}>
            <div
              style={{
                padding: "10px",
                width: "40%",
                background: "#f0f0f0",
              }}
            >
              <ul style={{ listStyleType: "none", padding: 0 }}>
                <li>
                  <Link to="/">Home</Link>
                </li>
                <li>
                  <Link to="/bubblegum">Bubblegum</Link>
                </li>
                <li>
                  <Link to="/shoelaces">Shoelaces</Link>
                </li>
              </ul>
    
              <Switch>
                {routes.map((route, index) => (
                  // You can render a <Route> in as many places
                  // as you want in your app. It will render along
                  // with any other <Route>s that also match the URL.
                  // So, a sidebar or breadcrumbs or anything else
                  // that requires you to render multiple things
                  // in multiple places at the same URL is nothing
                  // more than multiple <Route>s.
                  <Route
                    key={index}
                    path={route.path}
                    exact={route.exact}
                    children={<route.sidebar />}
                  />
                ))}
              </Switch>
            </div>
    
            <div style={{ flex: 1, padding: "10px" }}>
              <Switch>
                {routes.map((route, index) => (
                  // Render more <Route>s with the same paths as
                  // above, but different components this time.
                  <Route
                    key={index}
                    path={route.path}
                    exact={route.exact}
                    children={<route.main />}
                  />
                ))}
              </Switch>
            </div>
          </div>
        </Router>
      );
    }
    
    

    2. Animated Transitions

    import "./packages/react-router-dom/examples/Animation/styles.css";
    
    import React from "react";
    import {
      TransitionGroup,
      CSSTransition
    } from "react-transition-group";
    import {
      BrowserRouter as Router,
      Switch,
      Route,
      Link,
      Redirect,
      useLocation,
      useParams
    } from "react-router-dom";
    
    export default function AnimationExample() {
      return (
        <Router>
          <Switch>
            <Route exact path="/">
              <Redirect to="/hsl/10/90/50" />
            </Route>
            <Route path="*">
              <AnimationApp />
            </Route>
          </Switch>
        </Router>
      );
    }
    
    function AnimationApp() {
      let location = useLocation();
    
      return (
        <div style={styles.fill}>
          <ul style={styles.nav}>
            <NavLink to="/hsl/10/90/50">Red</NavLink>
            <NavLink to="/hsl/120/100/40">Green</NavLink>
            <NavLink to="/rgb/33/150/243">Blue</NavLink>
            <NavLink to="/rgb/240/98/146">Pink</NavLink>
          </ul>
    
          <div style={styles.content}>
            <TransitionGroup>
              {/*
                This is no different than other usage of
                <CSSTransition>, just make sure to pass
                `location` to `Switch` so it can match
                the old location as it animates out.
              */}
              <CSSTransition
                key={location.key}
                classNames="fade"
                timeout={300}
              >
                <Switch location={location}>
                  <Route path="/hsl/:h/:s/:l" children={<HSL />} />
                  <Route path="/rgb/:r/:g/:b" children={<RGB />} />
                </Switch>
              </CSSTransition>
            </TransitionGroup>
          </div>
        </div>
      );
    }
    
    function NavLink(props) {
      return (
        <li style={styles.navItem}>
          <Link {...props} style={{ color: "inherit" }} />
        </li>
      );
    }
    
    function HSL() {
      let { h, s, l } = useParams();
    
      return (
        <div
          style={{
            ...styles.fill,
            ...styles.hsl,
            background: `hsl(${h}, ${s}%, ${l}%)`
          }}
        >
          hsl({h}, {s}%, {l}%)
        </div>
      );
    }
    
    function RGB() {
      let { r, g, b } = useParams();
    
      return (
        <div
          style={{
            ...styles.fill,
            ...styles.rgb,
            background: `rgb(${r}, ${g}, ${b})`
          }}
        >
          rgb({r}, {g}, {b})
        </div>
      );
    }
    
    const styles = {};
    
    styles.fill = {
      position: "absolute",
      left: 0,
      right: 0,
      top: 0,
      bottom: 0
    };
    
    styles.content = {
      ...styles.fill,
      top: "40px",
      textAlign: "center"
    };
    
    styles.nav = {
      padding: 0,
      margin: 0,
      position: "absolute",
      top: 0,
      height: "40px",
      width: "100%",
      display: "flex"
    };
    
    styles.navItem = {
      textAlign: "center",
      flex: 1,
      listStyleType: "none",
      padding: "10px"
    };
    
    styles.hsl = {
      ...styles.fill,
      color: "white",
      paddingTop: "20px",
      fontSize: "30px"
    };
    
    styles.rgb = {
      ...styles.fill,
      color: "white",
      paddingTop: "20px",
      fontSize: "30px"
    };
    

    3.Route Config

    import React from "react";
    import {
      BrowserRouter as Router,
      Switch,
      Route,
      Link
    } from "react-router-dom";
    
    // Some folks find value in a centralized route config.
    // A route config is just data. React is great at mapping
    // data into components, and <Route> is a component.
    
    // Our route config is just an array of logical "routes"
    // with `path` and `component` props, ordered the same
    // way you'd do inside a `<Switch>`.
    const routes = [
      {
        path: "/sandwiches",
        component: Sandwiches
      },
      {
        path: "/tacos",
        component: Tacos,
        routes: [
          {
            path: "/tacos/bus",
            component: Bus
          },
          {
            path: "/tacos/cart",
            component: Cart
          }
        ]
      }
    ];
    
    export default function RouteConfigExample() {
      return (
        <Router>
          <div>
            <ul>
              <li>
                <Link to="/tacos">Tacos</Link>
              </li>
              <li>
                <Link to="/sandwiches">Sandwiches</Link>
              </li>
            </ul>
    
            <Switch>
              {routes.map((route, i) => (
                <RouteWithSubRoutes key={i} {...route} />
              ))}
            </Switch>
          </div>
        </Router>
      );
    }
    
    // A special wrapper for <Route> that knows how to
    // handle "sub"-routes by passing them in a `routes`
    // prop to the component it renders.
    function RouteWithSubRoutes(route) {
      return (
        <Route
          path={route.path}
          render={props => (
            // pass the sub-routes down to keep nesting
            <route.component {...props} routes={route.routes} />
          )}
        />
      );
    }
    
    function Sandwiches() {
      return <h2>Sandwiches</h2>;
    }
    
    function Tacos({ routes }) {
      return (
        <div>
          <h2>Tacos</h2>
          <ul>
            <li>
              <Link to="/tacos/bus">Bus</Link>
            </li>
            <li>
              <Link to="/tacos/cart">Cart</Link>
            </li>
          </ul>
    
          <Switch>
            {routes.map((route, i) => (
              <RouteWithSubRoutes key={i} {...route} />
            ))}
          </Switch>
        </div>
      );
    }
    
    function Bus() {
      return <h3>Bus</h3>;
    }
    
    function Cart() {
      return <h3>Cart</h3>;
    }
    

    4. Modal Gallery

    import React from "react";
    import {
      BrowserRouter as Router,
      Switch,
      Route,
      Link,
      useHistory,
      useLocation,
      useParams,
    } from "react-router-dom";
    
    // This example shows how to render two different screens
    // (or the same screen in a different context) at the same URL,
    // depending on how you got there.
    //
    // Click the "featured images" and see them full screen. Then
    // "visit the gallery" and click on the colors. Note the URL and
    // the component are the same as before but now we see them
    // inside a modal on top of the gallery screen.
    
    export default function ModalGalleryExample() {
      return (
        <Router>
          <ModalSwitch />
        </Router>
      );
    }
    
    function ModalSwitch() {
      let location = useLocation();
    
      // This piece of state is set when one of the
      // gallery links is clicked. The `background` state
      // is the location that we were at when one of
      // the gallery links was clicked. If it's there,
      // use it as the location for the <Switch> so
      // we show the gallery in the background, behind
      // the modal.
      let background = location.state && location.state.background;
    
      return (
        <div>
          <Switch location={background || location}>
            <Route exact path="/" children={<Home />} />
            <Route path="/gallery" children={<Gallery />} />
            <Route path="/img/:id" children={<ImageView />} />
          </Switch>
    
          {/* Show the modal when a background page is set */}
          {background && <Route path="/img/:id" children={<Modal />} />}
        </div>
      );
    }
    
    const IMAGES = [
      { id: 0, title: "Dark Orchid", color: "DarkOrchid" },
      { id: 1, title: "Lime Green", color: "LimeGreen" },
      { id: 2, title: "Tomato", color: "Tomato" },
      { id: 3, title: "Seven Ate Nine", color: "#789" },
      { id: 4, title: "Crimson", color: "Crimson" },
    ];
    
    function Thumbnail({ color }) {
      return (
        <div
          style={{
            width: 50,
            height: 50,
            background: color,
          }}
        />
      );
    }
    
    function Image({ color }) {
      return (
        <div
          style={{
            width: "100%",
            height: 400,
            background: color,
          }}
        />
      );
    }
    
    function Home() {
      return (
        <div>
          <Link to="/gallery">Visit the Gallery</Link>
          <h2>Featured Images</h2>
          <ul>
            <li>
              <Link to="/img/2">Tomato</Link>
            </li>
            <li>
              <Link to="/img/4">Crimson</Link>
            </li>
          </ul>
        </div>
      );
    }
    
    function Gallery() {
      let location = useLocation();
    
      return (
        <div>
          {IMAGES.map((i) => (
            <Link
              key={i.id}
              to={{
                pathname: `/img/${i.id}`,
                // This is the trick! This link sets
                // the `background` in location state.
                state: { background: location },
              }}
            >
              <Thumbnail color={i.color} />
              <p>{i.title}</p>
            </Link>
          ))}
        </div>
      );
    }
    
    function ImageView() {
      let { id } = useParams();
      let image = IMAGES[parseInt(id, 10)];
    
      if (!image) return <div>Image not found</div>;
    
      return (
        <div>
          <h1>{image.title}</h1>
          <Image color={image.color} />
        </div>
      );
    }
    
    function Modal() {
      let history = useHistory();
      let { id } = useParams();
      let image = IMAGES[parseInt(id, 10)];
    
      if (!image) return null;
    
      let back = (e) => {
        e.stopPropagation();
        history.goBack();
      };
    
      return (
        <div
          onClick={back}
          style={{
            position: "absolute",
            top: 0,
            left: 0,
            bottom: 0,
            right: 0,
            background: "rgba(0, 0, 0, 0.15)",
          }}
        >
          <div
            className="modal"
            style={{
              position: "absolute",
              background: "#fff",
              top: 25,
              left: "10%",
              right: "10%",
              padding: 15,
              border: "2px solid #444",
            }}
          >
            <h1>{image.title}</h1>
            <Image color={image.color} />
            <button type="button" onClick={back}>
              Close
            </button>
          </div>
        </div>
      );
    }
    
    

    相关文章

      网友评论

          本文标题:react - router example - 3

          本文链接:https://www.haomeiwen.com/subject/xijgrktx.html