প্রতিক্রিয়া রাউটার ভি 4 / ভি 5 সহ নেস্টেড রুটগুলি


261

আমি বর্তমানে প্রতিক্রিয়া রাউটার ভি 4 ব্যবহার করে নেস্টিং রুটের সাথে লড়াই করছি।

নিকটতম উদাহরণটি ছিল প্রতিক্রিয়া-রাউটার ভি 4 ডকুমেন্টেশনের রুট কনফিগারেশন ।

আমি আমার অ্যাপটিকে 2 টি আলাদা আলাদা ভাগে ভাগ করতে চাই।

একটি অগ্রভাগ এবং প্রশাসক অঞ্চল।

আমি এই জাতীয় কিছু সম্পর্কে ভাবছিলাম:

<Match pattern="/" component={Frontpage}>
  <Match pattern="/home" component={HomePage} />
  <Match pattern="/about" component={AboutPage} />
</Match>
<Match pattern="/admin" component={Backend}>
  <Match pattern="/home" component={Dashboard} />
  <Match pattern="/users" component={UserPage} />
</Match>
<Miss component={NotFoundPage} />

সীমানা প্রশাসকের ক্ষেত্রের চেয়ে আলাদা বিন্যাস এবং স্টাইল রয়েছে। সুতরাং প্রথম পৃষ্ঠার অভ্যন্তরে রুট বাড়ির মধ্যে, প্রায় এবং তাই শিশুদের রুট হওয়া উচিত।

/ হোমটি ফ্রন্টপেজ উপাদানটিতে রেন্ডার করা উচিত এবং / অ্যাডমিন / হোম ব্যাকএন্ড উপাদানগুলির মধ্যে রেন্ডার করা উচিত।

আমি কিছু বৈকল্পিক চেষ্টা করেছি কিন্তু আমি সর্বদা শেষ / হোম বা / অ্যাডমিন / হোমকে আঘাত না করে।

সম্পাদনা - 19.04.2017

কারণ এই পোস্টে এখনই প্রচুর মতামত রয়েছে আমি এটি চূড়ান্ত সমাধানের সাথে আপডেট করেছি। আমি আশা করি এটি কাউকে সাহায্য করবে

সম্পাদনা - 08.05.2017

পুরানো সমাধান মুছে ফেলা হয়েছে

চূড়ান্ত সমাধান:

এটি এখনই আমি চূড়ান্ত সমাধানটি ব্যবহার করছি। এই উদাহরণটিতে একটি globalতিহ্যবাহী 404 পৃষ্ঠার মতো একটি বিশ্বব্যাপী ত্রুটি উপাদানও রয়েছে।

import React, { Component } from 'react';
import { Switch, Route, Redirect, Link } from 'react-router-dom';

const Home = () => <div><h1>Home</h1></div>;
const User = () => <div><h1>User</h1></div>;
const Error = () => <div><h1>Error</h1></div>

const Frontend = props => {
  console.log('Frontend');
  return (
    <div>
      <h2>Frontend</h2>
      <p><Link to="/">Root</Link></p>
      <p><Link to="/user">User</Link></p>
      <p><Link to="/admin">Backend</Link></p>
      <p><Link to="/the-route-is-swiggity-swoute">Swiggity swooty</Link></p>
      <Switch>
        <Route exact path='/' component={Home}/>
        <Route path='/user' component={User}/>
        <Redirect to={{
          state: { error: true }
        }} />
      </Switch>
      <footer>Bottom</footer>
    </div>
  );
}

const Backend = props => {
  console.log('Backend');
  return (
    <div>
      <h2>Backend</h2>
      <p><Link to="/admin">Root</Link></p>
      <p><Link to="/admin/user">User</Link></p>
      <p><Link to="/">Frontend</Link></p>
      <p><Link to="/admin/the-route-is-swiggity-swoute">Swiggity swooty</Link></p>
      <Switch>
        <Route exact path='/admin' component={Home}/>
        <Route path='/admin/user' component={User}/>
        <Redirect to={{
          state: { error: true }
        }} />
      </Switch>
      <footer>Bottom</footer>
    </div>
  );
}

class GlobalErrorSwitch extends Component {
  previousLocation = this.props.location

  componentWillUpdate(nextProps) {
    const { location } = this.props;

    if (nextProps.history.action !== 'POP'
      && (!location.state || !location.state.error)) {
        this.previousLocation = this.props.location
    };
  }

  render() {
    const { location } = this.props;
    const isError = !!(
      location.state &&
      location.state.error &&
      this.previousLocation !== location // not initial render
    )

    return (
      <div>
        {          
          isError
          ? <Route component={Error} />
          : <Switch location={isError ? this.previousLocation : location}>
              <Route path="/admin" component={Backend} />
              <Route path="/" component={Frontend} />
            </Switch>}
      </div>
    )
  }
}

class App extends Component {
  render() {
    return <Route component={GlobalErrorSwitch} />
  }
}

export default App;

1
চূড়ান্ত উত্তর দিয়ে আপনার প্রশ্ন আপডেট করার জন্য আপনাকে ধন্যবাদ! কেবলমাত্র একটি পরামর্শ: সম্ভবত আপনি কেবল ৪ র্থ তালিকা এবং প্রথমটি রাখতে পারেন, যেহেতু অন্যান্যগুলি এপিআই এর পুরানো সংস্করণ ব্যবহার করছে এবং উত্তরটি থেকে বিরক্ত করছে
জিউলিয়ানো ভিলেলা

হ্যাঁ, এই তারিখটি কী আকারের তা আমার কোনও ধারণা নেই: 08.05.2017 আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি তারিখগুলির জন্য সর্বজনীন ISO8601 ফর্ম্যাটটি ব্যবহার করুন যদি আপনি লোককে বিভ্রান্ত করতে না চান। 08 মাস নাকি দিন? ISO8601 = Year.month.day ঘন্টা.minute.second (প্রগতিশীল আরও দানাদার)
ওয়েস্ট

দুর্দান্ত আপডেটেড চূড়ান্ত সমাধান, তবে আমি মনে করি আপনার previousLocationযুক্তি লাগবে না ।
tudorpavel

সম্পূর্ণরূপে রিঅ্যাক্ট রাউটারের অনুপ্রেরণা কি। এটি আরও ভাল কারণ হতে পারে
অলিভার ওয়াটকিন্স

এটি ঘোষণামূলক পদ্ধতির। যাতে আপনি প্রতিক্রিয়া উপাদানগুলি ব্যবহার করতেন তাই আপনি আপনার রাউটিংগুলি সেট আপ করতে পারেন।
ডটমল

উত্তর:


318

বিক্রিয়া-রাউটার-ভি 4 এ আপনি বাসা বাঁধেন না <Routes />। পরিবর্তে, আপনি তাদের অন্যের ভিতরে রেখেছেন <Component />


এই ক্ষেত্রে

<Route path='/topics' component={Topics}>
  <Route path='/topics/:topicId' component={Topic} />
</Route>

হয়ে উঠতে হবে

<Route path='/topics' component={Topics} />

সঙ্গে

const Topics = ({ match }) => (
  <div>
    <h2>Topics</h2>
    <Link to={`${match.url}/exampleTopicId`}>
      Example topic
    </Link>
    <Route path={`${match.path}/:topicId`} component={Topic}/>
  </div>
) 

প্রতিক্রিয়া-রাউটার ডকুমেন্টেশন থেকে সরাসরি এখানে একটি প্রাথমিক উদাহরণ


আমি আপনার লিঙ্কটি থেকে মৌলিক উদাহরণে প্রয়োগ করতে পেরেছি তবে আমি যখন ইউআরএলটি ম্যানুয়ালি টাইপ করি তখন এটি আমার লোকাল হোস্ট সার্ভারে কাজ করে না। তবে এটি আপনার উদাহরণে রয়েছে। অন্যহস্তে হ্যাশরউটারে আমি যখন ইউআরএল ম্যানুয়ালটি টাইপ করি তখন সঠিকভাবে কাজ করুন। আমার লোকালহোস্ট সার্ভারে ব্রাউজাররউটার যখন আমি নিজে ইউআরএল টাইপ করি তখন কেন কাজ করে না সে সম্পর্কে আপনার কোনও ধারণা আছে?
himawan_r

8
আপনি কি টপিক্সকে একটি ক্লাসে উপাদান তৈরি করতে পারেন? এবং 'ম্যাচ' প্যারামিটারটি কোথায় এসেছে? রেন্ডারে ()?
ব্যবহারকারী 1076813

21
হাস্যকর বলে মনে হচ্ছে আপনি কেবল অন্তর্নিহিত হওয়ার to="exampleTopicId"সাথেই পারেন না ${match.url}
সবুজিমালা

8
আপনার প্রতি দস্তাবেজ reacttraining.com/react-router/web/example/route-config প্রতি নেস্টেড রুট থাকতে পারে । এটি দস্তাবেজের বিষয় অনুযায়ী কেন্দ্রিকृत রুট কনফিগারেশনের অনুমতি দেবে। অনুপলব্ধ হলে আরও বড় প্রকল্পে পরিচালনা করতে এটি কত উন্মাদ হবে তা ভাবুন।
জাস্টডেভ

5
এগুলি নেস্টেড রুট নয়, এটি এখনও একটি এক-স্তরের রাউটিং যা কোনও রাউটের রেন্ডার সম্পত্তি ব্যবহার করে যা কোনও ইনপুট হিসাবে কার্যকরী উপাদান গ্রহণ করে, আরও সাবধানে দেখুন, প্রতিক্রিয়া রাউটারের অর্থে কোনও নেস্টিং নেই <4. প্যাটার্ন মিলটি ব্যবহার করে এমন রুটের তালিকাভুক্ত তালিকা।
ল্যুবোমির

102

react-router v6

2020-এর জন্য একটি আপডেট: আসন্ন ভি 6 রিলিজটিতে নেস্টেড Routeউপাদান থাকবে যা জাস্ট ওয়ার্ক ™ ™ এই ব্লগ পোস্টে উদাহরণ কোড দেখুন

যদিও মূল প্রশ্ন সম্পর্কে V4 / V5 , সঠিক উত্তর যখন V6 জাহাজ করা হবে না শুধু ব্যবহার যদি আপনি করতে পারেন । এটি বর্তমানে আলফায় রয়েছে।


react-router v4 & v5

এটি সত্য যে রুটগুলিকে বাসা বাঁধার জন্য আপনাকে সেগুলি রাস্তার সন্তানের অংশে রাখতে হবে।

তবে আপনি যদি আপনার রুটগুলি উপাদানগুলির মধ্যে ভেঙে ফেলার চেয়ে আরও বেশি ইনলাইন সিনট্যাক্স পছন্দ করেন তবে আপনিrender যে রুটটির নীচে নীড় বাঁধতে চান তার প্রপকে একটি কার্যকরী উপাদান সরবরাহ করতে পারেন।

<BrowserRouter>

  <Route path="/" component={Frontpage} exact />
  <Route path="/home" component={HomePage} />
  <Route path="/about" component={AboutPage} />

  <Route
    path="/admin"
    render={({ match: { url } }) => (
      <>
        <Route path={`${url}/`} component={Backend} exact />
        <Route path={`${url}/home`} component={Dashboard} />
        <Route path={`${url}/users`} component={UserPage} />
      </>
    )}
  />

</BrowserRouter>

renderপ্রোপটি কেন ব্যবহার করা উচিত, এবং componentপ্রপটি নয় তা যদি আপনি আগ্রহী হন , কারণ এটি প্রতিটি রেন্ডারে পুনরায় সঞ্চারিত হওয়া থেকে ইনলাইন কার্যকরী উপাদানটি বন্ধ করে দেয়। আরও বিশদ জন্য ডকুমেন্টেশন দেখুন

নোট উদাহরণস্বরূপ একটি নেস্টেড রুট গোপন অসম্পূর্ণ অংশ । প্রতিক্রিয়া 16 এর আগে, আপনি <div>পরিবর্তে একটি ধারক ব্যবহার করতে পারেন ।


16
শুকরিয়া একমাত্র সমাধান যা sortশ্বরের কাছে ধন্যবাদ, যা পরিষ্কার, মেন্টেবল এবং প্রত্যাশার মতো কাজ করে। আমি চাই প্রতিক্রিয়া রাউটার 3 নেস্টেড রুটগুলি ফিরে এসেছিল।
মেরুনাস গ্রিনকালাইটিস

এই এক নিখুঁত দেখতে কৌণিক রুট আউটলেট
পার্থ রঞ্জন

4
আপনার ব্যবহার করা উচিত match.path, না match.url। পূর্ববর্তীটি সাধারণত রুট pathপ্রপতে ব্যবহৃত হয় ; দ্বিতীয়টি যখন আপনি একটি নতুন to
রুটি

50

এই প্রশ্নটি পোস্ট করা / উত্তর দেওয়া হওয়ার পরে কেবলমাত্র প্রতিক্রিয়া-রাউটার ভি 4 উল্লেখ করতে চেয়েছিলাম ।

আর কোন <Match>উপাদান নেই ! <Switch>শুধুমাত্র প্রথম ম্যাচটি রেন্ডার করা হয়েছে তা নিশ্চিত করা। <Redirect>ভাল .. অন্য পথে পুনঃনির্দেশ। exactএকটি বা আংশিক ম্যাচ বাদ দিতে ব্যবহার করুন বা ছেড়ে দিন ।

দস্তাবেজগুলি দেখুন। তারা মহৎ. https://reacttraining.com/react-router/

এখানে একটি উদাহরণ যা আমি আশা করি আপনার প্রশ্নের উত্তর দেওয়ার জন্য ব্যবহারযোগ্য।

<Router>
  <div>
    <Redirect exact from='/' to='/front'/>
    <Route path="/" render={() => {
      return (
        <div>
          <h2>Home menu</h2>
          <Link to="/front">front</Link>
          <Link to="/back">back</Link>
        </div>
      );
    }} />          
    <Route path="/front" render={() => {
      return (
        <div>
        <h2>front menu</h2>
        <Link to="/front/help">help</Link>
        <Link to="/front/about">about</Link>
        </div>
      );
    }} />
    <Route exact path="/front/help" render={() => {
      return <h2>front help</h2>;
    }} />
    <Route exact path="/front/about" render={() => {
      return <h2>front about</h2>;
    }} />
    <Route path="/back" render={() => {
      return (
        <div>
        <h2>back menu</h2>
        <Link to="/back/help">help</Link>
        <Link to="/back/about">about</Link>
        </div>
      );
    }} />
    <Route exact path="/back/help" render={() => {
      return <h2>back help</h2>;
    }} />
    <Route exact path="/back/about" render={() => {
      return <h2>back about</h2>;
    }} />
  </div>
</Router>

আশা করি এটি সাহায্য করেছে, আমাকে জানান। যদি এই উদাহরণটি আপনার প্রশ্নের যথেষ্ট উত্তর দিচ্ছে না, আমাকে বলুন এবং আমি এটি পরিবর্তন করতে পারি কিনা তা আমি দেখতে পাচ্ছি।


কোন হয় exactউপর Redirect reacttraining.com/react-router/web/api/Redirect এটার চেয়েও অনেক ক্লিনার হবে <Route exact path="/" render={() => <Redirect to="/path" />} />যে আমি পরিবর্তে করছি। কমপক্ষে এটি আমাকে টাইপস্ক্রিপ্ট দিয়ে দেবে না।
ফিলিউরেন

2
আমি কি সঠিকভাবে বুঝতে পারি যে নেস্টেড / সাব রুট (আর) এর মতো কোনও জিনিস নেই? আমার কি সব রুটে বেস রুটটি নকল করতে হবে? প্রতিক্রিয়া-রাউটার 4 কি রক্ষণাবেক্ষণযোগ্য পদ্ধতিতে রুটগুলি গঠনের জন্য কোনও সহায়তা সরবরাহ করে না?
ভিল

5
@ উইল আমি অবাক; আপনি কি আরও ভাল সমাধান খুঁজে পেয়েছেন? আমি সমস্ত জায়গা জুড়ে রুট রাখতে চাই না,
গশ

1
এটি কাজ করবে তবে নিশ্চিত হয়ে নিন যে আপনার কাছে পাবলিক পাথটি "/" ওয়েবপ্যাক কনফিগারেশনে bundle.js এর জন্য সেট করা আছে, অন্যথায় নেস্টেড রুটগুলি পৃষ্ঠা রিফ্রেশে কাজ করবে না।
বিক্রম

6

এটার মতো কিছু.

import React from 'react';
import {
  BrowserRouter as Router, Route, NavLink, Switch, Link
} from 'react-router-dom';

import '../assets/styles/App.css';

const Home = () =>
  <NormalNavLinks>
    <h1>HOME</h1>
  </NormalNavLinks>;
const About = () =>
  <NormalNavLinks>
    <h1>About</h1>
  </NormalNavLinks>;
const Help = () =>
  <NormalNavLinks>
    <h1>Help</h1>
  </NormalNavLinks>;

const AdminHome = () =>
  <AdminNavLinks>
    <h1>root</h1>
  </AdminNavLinks>;

const AdminAbout = () =>
  <AdminNavLinks>
    <h1>Admin about</h1>
  </AdminNavLinks>;

const AdminHelp = () =>
  <AdminNavLinks>
    <h1>Admin Help</h1>
  </AdminNavLinks>;


const AdminNavLinks = (props) => (
  <div>
    <h2>Admin Menu</h2>
    <NavLink exact to="/admin">Admin Home</NavLink>
    <NavLink to="/admin/help">Admin Help</NavLink>
    <NavLink to="/admin/about">Admin About</NavLink>
    <Link to="/">Home</Link>
    {props.children}
  </div>
);

const NormalNavLinks = (props) => (
  <div>
    <h2>Normal Menu</h2>
    <NavLink exact to="/">Home</NavLink>
    <NavLink to="/help">Help</NavLink>
    <NavLink to="/about">About</NavLink>
    <Link to="/admin">Admin</Link>
    {props.children}
  </div>
);

const App = () => (
  <Router>
    <div>
      <Switch>
        <Route exact path="/" component={Home}/>
        <Route path="/help" component={Help}/>
        <Route path="/about" component={About}/>

        <Route exact path="/admin" component={AdminHome}/>
        <Route path="/admin/help" component={AdminHelp}/>
        <Route path="/admin/about" component={AdminAbout}/>
      </Switch>

    </div>
  </Router>
);


export default App;


6

আমি Switchরুট রুটের চেয়ে নেস্টেড রুটগুলি মোড়ানো এবং নেস্টেড রুটগুলি সংজ্ঞায়িত করে নির্ধারিত করতে সক্ষম হয়েছি ।

<BrowserRouter>
  <Switch>
    <Route path="/staffs/:id/edit" component={StaffEdit} />
    <Route path="/staffs/:id" component={StaffShow} />
    <Route path="/staffs" component={StaffIndex} />
  </Switch>
</BrowserRouter>

তথ্যসূত্র: https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/Switch.md


অর্ডারটিকে পুনরায় সাজানো আমার সমস্যা ঠিক করেছে যদিও এর কোনও পার্শ্ব প্রতিক্রিয়া হবে কিনা তা আমি জানি না। তবে এখনই কাজ করছি .. ধন্যবাদ :)
Anbu369

2

আপনি Routes.js এর মতো কিছু চেষ্টা করতে পারেন

import React, { Component } from 'react'
import { BrowserRouter as Router, Route } from 'react-router-dom';
import FrontPage from './FrontPage';
import Dashboard from './Dashboard';
import AboutPage from './AboutPage';
import Backend from './Backend';
import Homepage from './Homepage';
import UserPage from './UserPage';
class Routes extends Component {
    render() {
        return (
            <div>
                <Route exact path="/" component={FrontPage} />
                <Route exact path="/home" component={Homepage} />
                <Route exact path="/about" component={AboutPage} />
                <Route exact path="/admin" component={Backend} />
                <Route exact path="/admin/home" component={Dashboard} />
                <Route exact path="/users" component={UserPage} />    
            </div>
        )
    }
}

export default Routes

App.js

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
import { BrowserRouter as Router, Route } from 'react-router-dom'
import Routes from './Routes';

class App extends Component {
  render() {
    return (
      <div className="App">
      <Router>
        <Routes/>
      </Router>
      </div>
    );
  }
}

export default App;

আমি মনে করি আপনি এখান থেকেও এটি অর্জন করতে পারবেন।


ভাল যুক্তি! জাভা স্প্রিং বুট অ্যাপ্লিকেশন বিকাশের পরে প্রতিক্রিয়া দিয়ে শুরু করার সময় আমি একইভাবে ভেবেছিলাম। কেবলমাত্র আমি যা পরিবর্তন করব তা হ'ল 'ডিভ' থেকে 'সুইচ' এ রুটস.জেএস। আর tbh, আপনি App.js সমস্ত যাত্রাপথ সংজ্ঞায়িত কিন্তু উদাহরণস্বরূপ index.js ফাইলে বাইরে মোড়ানো (তৈরি-প্রতিক্রিয়া-অ্যাপ) করতে পারেন
Reborn থেকে

হ্যাঁ তুমিই ঠিক! আমি এই পদ্ধতি প্রয়োগ করেছি তাই আমি এই পদ্ধতির উল্লেখ করছি।
অনিরুদ্ধ আগরওয়াল

-6
interface IDefaultLayoutProps {
    children: React.ReactNode
}

const DefaultLayout: React.SFC<IDefaultLayoutProps> = ({children}) => {
    return (
        <div className="DefaultLayout">
            {children}
        </div>
    );
}


const LayoutRoute: React.SFC<IDefaultLayoutRouteProps & RouteProps> = ({component: Component, layout: Layout, ...rest}) => {
const handleRender = (matchProps: RouteComponentProps<{}, StaticContext>) => (
        <Layout>
            <Component {...matchProps} />
        </Layout>
    );

    return (
        <Route {...rest} render={handleRender}/>
    );
}

const ScreenRouter = () => (
    <BrowserRouter>
        <div>
            <Link to="/">Home</Link>
            <Link to="/counter">Counter</Link>
            <Switch>
                <LayoutRoute path="/" exact={true} layout={DefaultLayout} component={HomeScreen} />
                <LayoutRoute path="/counter" layout={DashboardLayout} component={CounterScreen} />
            </Switch>
        </div>
    </BrowserRouter>
);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.