রিঅ্যাক্ট রাউটার ভি 4 ব্যবহার করে প্রোগ্রামগতভাবে নেভিগেট করুন


336

আমি সবেমাত্র react-routerv3 থেকে v4 এ প্রতিস্থাপন করেছি ।
তবে আমি নিশ্চিত না যে কীভাবে এ এর ​​সদস্য ফাংশনে প্রোগ্রামিয়ালি নেভিগেট করতে হয় Component। অর্থাত্ handleClick()ফাংশনে আমি /path/some/whereকিছু ডেটা প্রক্রিয়া করার পরে নেভিগেট করতে চাই । আমি এটি দ্বারা ব্যবহৃত:

import { browserHistory } from 'react-router'
browserHistory.push('/path/some/where')

তবে আমি v4 তে এই জাতীয় ইন্টারফেস খুঁজে পাই না।
আমি কীভাবে ভি 4 ব্যবহার করে নেভিগেট করতে পারি?


3
প্রপসের মাধ্যমে আপনি ভিউটিতে হিস্ট্রি অবজেক্টটি অ্যাক্সেস করতে পারবেন: this.prop.history.push ('/')
কোলেমারিক

6
আপনি যদি এটির চেয়ে আলাদা জায়গা থেকে অ্যাক্সেস করতে চান তবে কী হবে Component? উদাহরণস্বরূপ, রিডাক্স ক্রিয়াগুলির ভিতরে inside
ম্যাক্সিমাস এস

73
মাঝে মাঝে আমি ভাবছিলাম কেন কেবল একটি লিঙ্ক থেকে অন্য লিঙ্কে চলে যাওয়া এত জটিল)))
থাই ট্রান

12
কেউ ভাববেন যে এই দিন এবং যুগে পুনর্নির্দেশ করা এত জটিল হবে না।
অ্যালেন

: আমি এই পোস্টে সহায়ক বলে চিহ্নিত করেছেন medium.com/@anneeb/redirecting-in-react-4de5e517354a
BioData41

উত্তর:


413

আপনি যদি ব্রাউজারের পরিবেশগুলিকে লক্ষ্য করে তুলছেন তবে এর react-router-domপরিবর্তে আপনার প্যাকেজটি ব্যবহার করা দরকার react-router। কোর, ( react) এবং প্ল্যাটফর্ম নির্দিষ্ট কোডটিকে আলাদা করার জন্য তারা প্রতিক্রিয়ার মতো একই পদ্ধতি অনুসরণ করছে , ( react-dom, react-native) যে দুটি সূক্ষ্ম পার্থক্যের সাথে আপনাকে দুটি পৃথক প্যাকেজ ইনস্টল করতে হবে না, তাই পরিবেশ প্যাকেজগুলিতে সমস্ত কিছু রয়েছে তোমার দরকার. আপনি আপনার প্রকল্পে এটি যুক্ত করতে পারেন:

yarn add react-router-dom

অথবা

npm i react-router-dom

আপনাকে প্রথমে যা করতে হবে তা হ'ল <BrowserRouter>আপনার আবেদনের শীর্ষ পিতামাতার উপাদান হিসাবে একটি সরবরাহ করা। <BrowserRouter>এইচটিএমএল 5 historyএপিআই ব্যবহার করে এবং এটি আপনার জন্য পরিচালিত করে, তাই আপনাকে এটি নিজে ইনস্ট্যান্ট করার এবং <BrowserRouter>প্রপ হিসাবে এটি উপাদানটিকে সরবরাহ করার বিষয়ে চিন্তা করার দরকার নেই (পূর্ববর্তী সংস্করণগুলিতে আপনাকে যেমন করার দরকার ছিল)।

ভি 4-তে, প্রোগ্রামক্রমেটিকভাবে নেভিগেশনের জন্য আপনাকে historyঅবজেক্টটি অ্যাক্সেস করতে হবে যা রিএ্যাক্টের মাধ্যমে পাওয়া যায় context, যতক্ষণ না আপনার অ্যাপ্লিকেশনে শীর্ষস্থানীয় পিতা-মাতার হিসাবে কোনও <BrowserRouter> সরবরাহকারী উপাদান রয়েছে। লাইব্রেরিটি প্রসঙ্গের মাধ্যমে routerঅবজেক্টটি প্রকাশ করে , এতে নিজেই historyএকটি সম্পত্তি হিসাবে থাকে । historyইন্টারফেস যেমন বিভিন্ন গৌণ পদ্ধতি, উপলব্ধ করা হয় push, replaceএবং goBackঅন্যদের মধ্যে। আপনি এখানে সম্পত্তি এবং পদ্ধতিগুলির সম্পূর্ণ তালিকাটি পরীক্ষা করতে পারেন ।

Redux / Mobx ব্যবহারকারীদের জন্য গুরুত্বপূর্ণ নোট

আপনি যদি আপনার অ্যাপ্লিকেশনটিতে রিডেক্স বা মুবক্সকে আপনার রাজ্য পরিচালনা গ্রন্থাগার হিসাবে ব্যবহার করছেন তবে আপনি এমন উপাদানগুলি নিয়ে আসতে পারেন যেগুলি অবস্থান-সচেতন হওয়া উচিত তবে ইউআরএল আপডেট ট্রিগার করার পরে পুনরায় রেন্ডার করা হয়নি

এটি ঘটছে কারণ প্রসঙ্গ মডেল ব্যবহার করে উপাদানগুলিতে react-routerযায় location

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

এটি সমাধানের জন্য দুটি পন্থা হ'ল:

  • আপনার সংযুক্ত উপাদানটিকে একটি নির্বিঘ্নে মোড়ানো <Route />। বর্তমান locationঅবজেক্টটি এমন একটি প্রপস যা <Route>এটির সরবরাহকারী উপাদানটিকে পাস করে
  • আপনার সংযুক্ত উপাদানটিকে withRouterউচ্চতর-অর্ডার উপাদান দিয়ে মুড়িয়ে দিন , বাস্তবে একই প্রভাব রয়েছে এবং locationপ্রপ হিসাবে ইনজেকশন দেয়

এটিকে নির্ধারণ করে, প্রস্তাবক্রমে আদেশক্রমে অগ্রগতিযুক্ত নেভিগেটের চারটি উপায় রয়েছে:

1.- একটি <Route>উপাদান ব্যবহার

এটি একটি ঘোষণামূলক শৈলীর প্রচার করে। ভি 4 এর আগে, <Route />উপাদানগুলি আপনার উপাদানগুলির ক্রমবিন্যাসের শীর্ষে স্থাপন করা হয়েছিল, আপনার রুটগুলির কাঠামোর আগেই ভাবতে হবে। তবে, এখন আপনার গাছের যে কোনও জায়গায়<Route> উপাদান থাকতে পারে , আপনাকে ইউআরএলের উপর নির্ভর করে শর্তাধীন রেন্ডারিংয়ের জন্য আরও ভাল নিয়ন্ত্রণ রাখতে দেয়। উদ্বুদ্ধ , এবং আপনার উপাদান মধ্যে সাজসরঞ্জাম হিসাবে। ন্যাভিগেশন পদ্ধতি (যেমন , , ...) বৈশিষ্ট্য পাওয়া যায় অবজেক্ট।RoutematchlocationhistorypushreplacegoBackhistory

একটি দিয়ে কিছু সরবরাহ করার জন্য 3 টি উপায় রয়েছে Route, হয় হয় বা প্রপস ব্যবহার করে component, তবে একইরকম একের বেশি ব্যবহার করবেন না । পছন্দটি ব্যবহারের ক্ষেত্রে নির্ভর করে, তবে মূলত দুটি দুটি বিকল্প কেবল তখনই আপনার উপাদানটিকে রেন্ডার করবে যদি ইউআরএল অবস্থানের সাথে মেলে তবে উপাদানটির সাথে এই স্থানটি রেন্ডার করা হবে যে পথটি অবস্থানটির সাথে মেলে কিনা বা না (ইউআরএল ভিত্তিক ইউআই সামঞ্জস্য করার জন্য দরকারী) ম্যাচিং)।renderchildrenRoutepathchildren

আপনি আপনার উপাদান রেন্ডারিং আউটপুট কাস্টমাইজ করতে চান , আপনি একটি ফাংশন আপনার উপাদান মোড়ানো প্রয়োজন এবং ব্যবহার renderবিকল্প, ক্রমে আপনার উপাদান অন্য কোন সাজসরঞ্জাম আপনি বাদে ইচ্ছা করছে, পাস match, locationএবং history। উদাহরণস্বরূপ উদাহরণ:

import { BrowserRouter as Router } from 'react-router-dom'

const ButtonToNavigate = ({ title, history }) => (
  <button
    type="button"
    onClick={() => history.push('/my-new-location')}
  >
    {title}
  </button>
);

const SomeComponent = () => (
  <Route path="/" render={(props) => <ButtonToNavigate {...props} title="Navigate elsewhere" />} />
)    

const App = () => (
  <Router>
    <SomeComponent /> // Notice how in v4 we can have any other component interleaved
    <AnotherComponent />
  </Router>
);

২.- withRouterহউক ব্যবহার করা

এই উচ্চতর অর্ডার উপাদানটি একই প্রসাকে ইনজেক্ট করবে Route। যাইহোক, এটি সীমাবদ্ধতার সাথে বহন করে যে আপনার প্রতি ফাইল প্রতি 1 জন হউক থাকতে পারে।

import { withRouter } from 'react-router-dom'

const ButtonToNavigate = ({ history }) => (
  <button
    type="button"
    onClick={() => history.push('/my-new-location')}
  >
    Navigate
  </button>
);


ButtonToNavigate.propTypes = {
  history: React.PropTypes.shape({
    push: React.PropTypes.func.isRequired,
  }),
};

export default withRouter(ButtonToNavigate);

3.- একটি Redirectউপাদান ব্যবহার

একটি রেন্ডারিং একটি <Redirect>নতুন স্থানে নেভিগেট করবে। তবে মনে রাখবেন যে, ডিফল্টরূপে , বর্তমান স্থানটি সার্ভার-সাইড রিডাইরেক্টস (HTTP 3xx) এর মতো নতুন দ্বারা প্রতিস্থাপিত হয়। নতুন অবস্থানটি toপ্রোপ দ্বারা সরবরাহ করা হয়েছে , এটি স্ট্রিং (পুনর্নির্দেশের URL) বা কোনও locationঅবজেক্ট হতে পারে। পরিবর্তে আপনি যদি ইতিহাসের উপরে একটি নতুন এন্ট্রি চাপতে চান তবেpush পাশাপাশি একটি প্রপও পাস করুন এবং সেট করুনtrue

<Redirect to="/your-new-location" push />

৪- routerপ্রসঙ্গে ম্যানুয়ালি অ্যাক্সেস করা

কিছুটা নিরুৎসাহিত করা হয়েছে কারণ প্রসঙ্গটি এখনও একটি পরীক্ষামূলক এপিআই এবং এটি ভবিষ্যতে প্রতিক্রিয়া প্রকাশের ক্ষেত্রে বিরতি / পরিবর্তন হতে পারে

const ButtonToNavigate = (props, context) => (
  <button
    type="button"
    onClick={() => context.router.history.push('/my-new-location')}
  >
    Navigate to a new location
  </button>
);

ButtonToNavigate.contextTypes = {
  router: React.PropTypes.shape({
    history: React.PropTypes.object.isRequired,
  }),
};

এটির বলার অপেক্ষা রাখে না যে অন্যান্য রাউটার উপাদানগুলি ব্রাউজার নন-ইকোসিস্টেমগুলির জন্য বোঝানো হয়েছে, যেমন মেমরিতে<NativeRouter> নেভিগেশন স্ট্যাকের প্রতিরূপ তৈরি করে এবং প্যাকেজের মাধ্যমে উপলব্ধ নেটিভ প্ল্যাটফর্মকে লক্ষ্য করে ।react-router-native

পরবর্তী কোনও রেফারেন্সের জন্য, সরকারী দস্তাবেজগুলি একবার দেখে নিতে দ্বিধা করবেন না । লাইব্রেরির অন্যতম সহ-লেখক দ্বারা তৈরি করা একটি ভিডিও রয়েছে যা কিছু বড় বড় পরিবর্তনগুলি হাইলাইট করে রিঅ্যাক্ট-রাউটার ভি 4 এর জন্য দুর্দান্ত শীতল ভূমিকা সরবরাহ করে।


2
আমি ভি 4 ব্যবহার করছি এবং উপরের কাজগুলি ভাল করে। আমি ভি 4 রাউটারের সাথে ব্যঙ্গ করে বেশ কিছুটা সময় ব্যয় করেছি কারণ এখানে কিছু অদ্ভুত পছন্দ আছে তবে উপরেরটি অবশ্যই কাজ করে। আমি তোমাদের আমদানি করছি অনুমান withRouterথেকেreact-router-dom
স্যাম Parmenter

3
আমি আমদানির করছি withRouterথেকে react-router-dom<Route>
ইতিহাস.পুশ

1
@ আরলিওহমসি এই সম্পর্কে আমি ভুল ছিলাম। সমস্যাটি হ'ল আমার কাছে <Router> একটি প্রতিক্রিয়া উপাদান রয়েছে @observerযা সজ্জিত , যা এই সমস্যাটিকে ট্রিগার করে । চারপাশের কাজটি হ'ল @withRouterএই জাতীয় প্রতিটি প্রতিক্রিয়া উপাদানকে নিয়ে।
ব্রেকডেএস

3
যারা এই দুর্দান্ত উত্তরটি জুড়ে আসেন তাদের withRouterপক্ষে কেবল একটি এইচওসি যা Routeহুডের নীচে ব্যবহার করে। যার অর্থ এটি কেবল 3 টি প্রপস, ইতিহাস, মিল এবং অবস্থান ব্যবহার করে । উপরের উদাহরণে এটি প্রদর্শিত হয় যে এটি pushএমন একটি প্রস্তাব যা যুক্ত withRouterকরবে তবে ButtonToNavigateএটি ক্ষেত্রে নেই that props.history.pushপরিবর্তে ব্যবহার করতে হবে। আশা করি এটি অন্যদের যারা কিছুটা বিভ্রান্ত হয়েছিল তাদের সহায়তা করে।
ভিনিম্যাক

39
কি দারুন. browserHistory.push('/path/some/where')অনেক সহজ মনে হচ্ছে। লেখকরা অত্যাবশ্যক প্রোগ্রামিংকে নিরুৎসাহিত করার চেষ্টা করছেন, তবে কখনও কখনও এটি আরও ভাল কাজ করে!
লাক্স

149

এটি সম্পন্ন করার সবচেয়ে সহজ উপায়:

this.props.history.push("/new/url")

বিঃদ্রঃ:

  • আপনি history propপ্যারেন্ট উপাদানটি থেকে উপাদানটি নীচে অংশটি পাস করতে চাইতে পারেন আপনি যদি ক্রিয়াকলাপটি উপলভ্য না হন তবে এটি করতে চান want

10
আমি 4.0 রাউটার ব্যবহার করি তবে প্রপসগুলিতে কোনও ইতিহাস কী নেই। আমি কীভাবে এটি ঠিক করতে পারি?
নিকোলাস এস এক্সু 21

41
যদি this.props.historyআপনার উপাদানটিতে উপলব্ধ না থাকে তবে আপনি import {withRouter} from 'react-router-dom'এবং তারপরে export default withRouter(MyComponent)(বা const MyComponent = withRouter(...)) করতে পারেন এবং এটি historyআপনার উপাদানটির প্রপসগুলিতে আইটেমটি সন্নিবেশ করবে ।
মালভাইনাস

@ মালভাইনাস আকর্ষণীয়, এটি সম্পর্কে জানতেন না! চেষ্টা করে দেখুন!
জিক্কু জোসে

2
আমি অবশ্যই কিছু মৌলিক অনুপস্থিত হব, কারণ এটি আমার পক্ষে দুর্দান্ত কাজ করে তাই সমস্ত উত্তরগুলিতে কেন এই দীর্ঘ ব্যাখ্যার প্রয়োজন তা আমার কোনও ধারণা নেই।
জোশুয়া পিন্টার

কীভাবে উপাদান পুনঃসমাপ্তি রোধ করতে হবে history.pushএবং ঠিক আপডেটগুলি ট্রিগার করার সময় আমরা যখন ক্লিক করব<Link>
রাহুল যাদব

55

প্রতিক্রিয়া-রাউটার ভি 4 এ স্থানান্তর করার সময় আমার একই সমস্যা ছিল তাই আমি নীচে আমার সমাধানটি ব্যাখ্যা করার চেষ্টা করব।

দয়া করে এই উত্তরটিকে সমস্যার সমাধান করার সঠিক উপায় হিসাবে বিবেচনা করবেন না, আমি কল্পনা করেছি যে প্রতিক্রিয়া রাউটার ভি 4 আরও পরিণত হওয়ার সাথে সাথে বিটা ছেড়ে যাওয়ার ফলে আরও ভাল কিছু হওয়ার সম্ভাবনা রয়েছে (এটি এমনকি ইতিমধ্যে উপস্থিত থাকতে পারে এবং আমি এটি আবিষ্কার করি নি) ।

প্রসঙ্গে, আমার এই সমস্যাটি ছিল কারণ আমি মাঝে মধ্যে Redux-Sagaপ্রোগ্রামের সাথে ইতিহাসের অবজেক্টটি পরিবর্তন করতে ব্যবহার করি (যখন কোনও ব্যবহারকারী সফলভাবে প্রমাণিত হয় তখন বলুন)।

প্রতিক্রিয়া রাউটার ডক্সে, <Router> উপাদানটি একবার দেখুন এবং আপনি দেখতে পাচ্ছেন যে আপনার নিজের ইতিহাসের বিষয়টিকে কোনও প্রোপের মাধ্যমে পাস করার ক্ষমতা রয়েছে। এই সমাধান সারাংশ - আমরা ইতিহাস বস্তুর সরবরাহ করার React-RouterA থেকে বিশ্বব্যাপী মডিউল।

পদক্ষেপ:

  1. ইতিহাস এনপিএম মডিউলটি ইনস্টল করুন - yarn add history বা npm install history --save
  2. history.jsআপনার App.jsস্তরের ফোল্ডারে ডাকা একটি ফাইল তৈরি করুন (এটি আমার পছন্দ ছিল)

    // src/history.js
    
    import createHistory from 'history/createBrowserHistory';
    export default createHistory();`
  3. আপনার রাউটার উপাদানটিতে এই ইতিহাসের বিষয়টিকে যুক্ত করুন

    // src/App.js
    
    import history from '../your/path/to/history.js;'
    <Router history={history}>
    // Route tags here
    </Router>
  4. আপনার বিশ্বব্যাপী ইতিহাস অবজেক্টটি আমদানি করে ঠিক আগের মতো ইউআরএল সামঞ্জস্য করুন :

    import history from '../your/path/to/history.js;'
    history.push('new/path/here/');

এখনই সমস্ত কিছু সিঙ্ক হওয়া উচিত এবং আপনার ইতিহাসের বিষয়টিকে প্রোগ্রামগতভাবে সেট করার কোনও পদ্ধতিতে অ্যাক্সেস থাকতে হবে কোনও উপাদান / ধারক দ্বারা নয়।


5
এই পরিবর্তনটি আমার পক্ষে কাজ করেছে, তবে কেবলমাত্র আমি একটি উপাদানটির বাইরে নেভিগেট করছি। যদি আমি ওপি এর মতো কোনও উপাদানটির ভিতরে নেভিগেট করছিলাম তবে আমি @rauliyohmc দ্বারা প্রস্তাবিত পদ্ধতির সাথে উপাদানটি দিয়ে দেওয়া প্রসগুলি ব্যবহার করব Route
ড্যান এলিস

2
এটি 08/17 এর হিসাবে প্রস্তাবিত পদ্ধতি
স্পেটস

2
@ স্পেটস আমার ক্ষেত্রে, যদি আমি এই ধরণের পদ্ধতির ব্যবহার করি তবে লিঙ্কটি ধাক্কা দেওয়ার পরে সঠিকভাবে আপডেট হবে তবে উপাদানগুলি যথাযথভাবে রেন্ডার করা হয়নি (উদাহরণস্বরূপ, লিঙ্কটি আপডেট করার পরে, উপাদানটি আপডেট করা হবে না যদি আপনি পৃষ্ঠা রিফ্রেশ করতে বাধ্য না করেন) আপনি কোথায় পেলেন যে এটি প্রস্তাবিত পদ্ধতির? কোন লিঙ্ক / উত্স?
ঠাণ্ডা

2
@ স্কটকোটস আমি প্যারামিটার হিসাবে ইতিহাস সরবরাহ করে উপরের উদাহরণটি ব্যবহার করে বাছাই করেছি, তবে নোড মডিউলগুলি নিজে নিজে ডিবাগ করার পরে। "ব্রাউজারহিসটরি হিসাবে রাউটার হিসাবে আমদানি" ব্যবহার করে ওয়েবে সর্বত্র একটি প্রচলিত ভুল রয়েছে, পরিবর্তে রিঅ্যাক্ট-রাউটার-ডোমের সর্বশেষ সংস্করণে রাউটার নামে একটি অন্য অবজেক্ট রয়েছে। উপরোক্ত উদাহরণ হিসাবে নির্মিত ইতিহাসের সাথে এটি ব্যবহার করা ঠিক কাজ করে।
ঠান্ডা

2
ইউআরএল আপডেট করা হয়েছে, তবে পৃষ্ঠাটি নতুন মূলের ভিত্তিতে রেন্ডার করা হয়নি। কোন সমাধান? ট্রিগার রুট এত কঠিন কেন? প্রতিক্রিয়া ডিজাইন করা লোকেরা কি তাদের মনের বাইরে?
নিকোলাস এস এক্সু 21

43

টি এল; ডিআর:

if (navigate) {
  return <Redirect to="/" push={true} />
}

সহজ এবং ঘোষিত উত্তরটি হ'ল আপনার <Redirect to={URL} push={boolean} />সাথে একসাথে ব্যবহার করা দরকারsetState()

পুশ: বুলিয়ান - সত্য হয়ে গেলে, পুনর্নির্দেশটি বর্তমানের পরিবর্তে ইতিহাসে নতুন এন্ট্রি ঠেলে দেবে।


import { Redirect } from 'react-router'

class FooBar extends React.Component {
  state = {
    navigate: false
  }

  render() {
    const { navigate } = this.state

    // here is the important part
    if (navigate) {
      return <Redirect to="/" push={true} />
    }
   // ^^^^^^^^^^^^^^^^^^^^^^^

    return (
      <div>
        <button onClick={() => this.setState({ navigate: true })}>
          Home
        </button>
      </div>
    )
  }
}

এখানে সম্পূর্ণ উদাহরণ । এখানে আরও পড়ুন ।

পুনশ্চ. উদাহরণটি রাষ্ট্রের সূচনা করার জন্য ES7 + সম্পত্তি প্রারম্ভিক ব্যবহার করে । আগ্রহী হলে এখানেও দেখুন ।


5
এটি উত্তর গ্রহণ করা উচিত। সবচেয়ে সহজ সমাধান! @ লাস্টয়কভের জন্য +1
আলী আব্বাস জাফরি

1
আমার বোতামটি শিরোনামের মধ্যে রয়েছে বলে আমি উপাদানবিহীন ডিপআপেেটে মিথ্যাতে ফিরে নেভিগেট সেট করেছি এবং অন্যথায় কেবল একবার নেভিগেট করব।
পিটারেরাম

পৃষ্ঠাটি লোড হওয়ার পরে আপনি যদি পুনঃনির্দেশের বিষয়ে জানেন তবে এটি কেবল কাজ করে। আপনি যদি অ্যাসিক্রোনাস কলটি ফিরে আসার অপেক্ষায় থাকেন (যেমন গুগল বা কোনও কিছুর সাথে প্রমাণীকরণ) তবে আপনাকে একটি history.push()পদ্ধতি ব্যবহার করতে হবে ।
brittohalloran

সত্যই নয়, আপনি এখনও <পুনর্নির্দেশ /> উপাদানটির সাথে মিলিত প্রতিক্রিয়ার ঘোষণামূলক প্রকৃতিটি উপার্জন করতে পারেন। পৃষ্ঠাটি লোড না হলে আপনি অন্য <
রিড্রাইक्ट

@ ব্রিটহোহালোরান এই পদ্ধতিটির সঠিক ধারণাটি ব্যবহার করে সঠিক রিঅ্যাক্ট রাউটারটি ব্যবহার করে এটি পুনরায় রেন্ডার করতে বাধ্য করতে আপনি সেটস্টেট ব্যবহার করেছেন তা নিশ্চিত করা।
কেউ বিশেষ

15

useHistoryআপনি যদি ফাংশন উপাদান ব্যবহার করছেন তবে হুক ব্যবহার করুন

আপনি উদাহরণ useHistoryপেতে হুক ব্যবহার করতে পারেন history

import { useHistory } from "react-router-dom";

const MyComponent = () => {
  var history = useHistory();

  return (
    <button onClick={() => history.push("/about")}>
      Click me
    </button>
  );
}

useHistoryহুক আপনি ইতিহাস উদাহরণস্বরূপ অ্যাক্সেস আপনি নেভিগেট করতে ব্যবহার করতে পারেন আপনি।

historyপৃষ্ঠার উপাদানগুলির অভ্যন্তরে সম্পত্তি ব্যবহার করুন

প্রতিক্রিয়া রাউটার historyপৃষ্ঠার উপাদানগুলি সহ কিছু বৈশিষ্ট্যকে ইনজেকশন দেয় ।

class HomePage extends React.Component {
  render() {
    const { history } = this.props;

    return (
      <div>
        <button onClick={() => history.push("/projects")}>
          Projects
        </button>
      </div>
    );
  }
}

withRouterরাউটারের বৈশিষ্ট্যগুলি ইনজেকশনের জন্য সন্তানের উপাদানগুলি মোড়ানো

withRouterমোড়ক উপাদানগুলিতে রাউটারের বৈশিষ্ট্যগুলিকে ইনজেকশন দেয়। উদাহরণস্বরূপ আপনি এই মোড়কটি ব্যবহারকারীর মেনুর ভিতরে থাকা লগআউট বোতামের উপাদানটি রাউটার ইনজেকশন করতে ব্যবহার করতে পারেন।

import { withRouter } from "react-router";

const LogoutButton = withRouter(({ history }) => {
  return (
    <button onClick={() => history.push("/login")}>
      Logout
    </button>
  );
});

export default LogoutButton;

11

আপনি ইতিহাস অবজেক্ট অ্যাক্সেস করতে প্রপস ব্যবহার করতে পারেন: this.props.history.push('new_url')


5
উপাদানটি যখন রাউটার থেকে সরাসরি নেমে আসে কেবল তখনই কার্যকর। পাছে ইতিহাসের
প্রাপকে

3
যদি this.props.historyআপনার উপাদানটিতে উপলব্ধ না থাকে তবে আপনি import {withRouter} from 'react-router-dom'এবং তারপরে export default withRouter(MyComponent)(বা const MyComponent = withRouter(...)) করতে পারেন এবং এটি historyআপনার উপাদানটির প্রপসগুলিতে আইটেমটি সন্নিবেশ করবে ।
মারভিনিয়াস

9

পদক্ষেপ 1: উপরে আমদানি করার জন্য কেবল একটি জিনিস রয়েছে:

import {Route} from 'react-router-dom';

পদক্ষেপ 2: আপনার রুটে, ইতিহাসটি পাস করুন:

<Route
  exact
  path='/posts/add'
  render={({history}) => (
    <PostAdd history={history} />
  )}
/>

পদক্ষেপ 3: ইতিহাস পরবর্তী অংশগুলিতে প্রপসের অংশ হিসাবে স্বীকৃত হয়, সুতরাং আপনি সহজভাবে এটি করতে পারেন:

this.props.history.push('/');

এটি ছিল সহজ এবং সত্যই শক্তিশালী।


7

এইটা কাজ করে:

import { withRouter } from 'react-router-dom';

const SomeComponent = withRouter(({ history }) => (
    <div onClick={() => history.push('/path/some/where')}>
        some clickable element
    </div>); 
);

export default SomeComponent;

5

আমার উত্তরটি অ্যালেক্সের মতো । আমি নিশ্চিত নই যে কেন প্রতিক্রিয়া-রাউটার এটিকে এত অযথা জটিল করে তুলেছে। মূলত বিশ্বব্যাপী কী কীতে অ্যাক্সেস পেতে আমাকে কেন আমার উপাদানটি একটি হকের সাথে আবদ্ধ করতে হবে?

যাই হোক, আপনি যদি তা কিভাবে বাস্তবায়ন কটাক্ষপাত করা <BrowserRouter>, এটি প্রায় ঠিক একটি ক্ষুদ্র মোড়কের এর ইতিহাস

আমরা সেই ইতিহাসটিকে কিছুটা টেনে আনতে পারি যাতে আমরা এটিকে যে কোনও জায়গা থেকে আমদানি করতে পারি। কৌশলটি হ'ল যদি আপনি সার্ভার-সাইড রেন্ডারিং করে থাকেন এবং আপনি importইতিহাসের মডিউলটি চেষ্টা করেন তবে এটি কাজ করবে না কারণ এটি ব্রাউজার-কেবলমাত্র এপিআই ব্যবহার করে। তবে এটি ঠিক আছে কারণ আমরা সাধারণত ক্লিক বা অন্য কোনও ক্লায়েন্ট-সাইড ইভেন্টের প্রতিক্রিয়া হিসাবে পুনঃনির্দেশ করি। সুতরাং এটি সম্ভবত জাল করা ঠিক আছে:

// history.js
if(__SERVER__) {
    module.exports = {};
} else {
    module.exports = require('history').createBrowserHistory();
}

ওয়েবপ্যাকের সাহায্যে আমরা কিছু ভার সংজ্ঞা দিতে পারি যাতে আমরা জানতে পারি যে আমরা কোন পরিবেশে আছি:

plugins: [
    new DefinePlugin({
        '__SERVER__': 'false',
        '__BROWSER__': 'true', // you really only need one of these, but I like to have both
    }),

এবং এখন আপনি পারেন

import history from './history';

যেকোন স্থান থেকে. এটি সার্ভারে খালি মডিউলটি ফিরিয়ে দেবে।

আপনি যদি এই ম্যাজিক ভার্স ব্যবহার করতে না চান তবে আপনাকে কেবলমাত্র requireবিশ্বব্যাপী অবজেক্টে এটি প্রয়োজন যেখানে এটি প্রয়োজন (আপনার ইভেন্ট হ্যান্ডলারের ভিতরে)। importকাজ করবে না কারণ এটি কেবলমাত্র শীর্ষ-স্তরে কাজ করে।


6
অভিশাপ তারা এটিকে এত জটিল করে তুলেছে।
অভিষেক

4
আমি সম্পূর্ণরূপে আপনার সাথে একমত। এটি কেবলমাত্র একটি নেভিগেশনের জন্য জটিল
থাই ট্রান

5

আমার মনে হয় @ggmemezz বেশিরভাগ ক্ষেত্রে বিয়োগ বিয়োগ করে যেটি আমি মনে করি এটি বেশ গুরুত্বপূর্ণ।

// history is already a dependency or React Router, but if don't have it then try npm install save-dev history

import createHistory from "history/createBrowserHistory"

// in your function then call add the below 
const history = createHistory();
// Use push, replace, and go to navigate around.
history.push("/home");

এটি আমাকে ক্রিয়াকলাপ / কল সহ একটি সাধারণ পরিষেবা লেখার অনুমতি দেয় যা আমি আমার উপাদানগুলিতে খুব বেশি হুক না করেই চাই যে কোনও উপাদান থেকে নেভিগেশন করতে কল করতে পারি ...

কেন আগে কেউ এই সমাধান সরবরাহ করেনি তা পরিষ্কার নয়। আমি আশা করি এটি সাহায্য করে এবং আপনি যদি এটির সাথে কোনও সমস্যা দেখতে পান তবে আমাকে জানান let


4

আমি এখন কয়েক দিন ধরে v4 পরীক্ষা করছি এবং .. আমি এটিকে এখনও ভালবাসি! এটি কিছুক্ষণ পরে বোঝা যায়।

আমারও একই প্রশ্ন ছিল এবং আমি নিম্নলিখিত হ'ল সবচেয়ে ভাল কাজ করেছেন (এবং এটি কীভাবে উদ্দেশ্যযুক্ত তাও হতে পারে) এর মত হ্যান্ডেল করতে পেলাম। এটি স্টেট, একটি টেরিনারি অপারেটর এবং <Redirect>

কনস্ট্রাক্টরে ()

this.state = {
    redirectTo: null
} 
this.clickhandler = this.clickhandler.bind(this);

রেন্ডারে ()

render(){
    return (
        <div>
        { this.state.redirectTo ?
            <Redirect to={{ pathname: this.state.redirectTo }} /> : 
            (
             <div>
               ..
             <button onClick={ this.clickhandler } />
              ..
             </div>
             )
         }

ক্লিকহ্যান্ডলারে ()

 this.setState({ redirectTo: '/path/some/where' });

আশা করি এটা সাহায্য করবে. আমাকে জানতে দাও.


এই পদ্ধতিতে কোনও সমস্যা আছে? আমার প্রকল্পে কাজগুলি কেবল যখন আমি কন্সট্রাক্টরে রাজ্য সেট করি, সেখান থেকে আমি যে কোনও পৃষ্ঠাতে চাইব red তবে যখন আমি ইভেন্টে স্টেট স্থাপন করি (উদাহরণস্বরূপ
প্রপসগুলি

সমস্যাটি হ'ল এটি ইতিহাসটি প্রতিস্থাপন করবে, সুতরাং আপনি পিছনে ফিরে আসতে সক্ষম হবেন না - সুতরাং মূলত এটি কোনও ভাল সমাধান নয়।
dannytenaglias

4

আমি কিছুক্ষণের জন্য এটির সাথে লড়াই করেছি - এত সাধারণ কিছু, তবু জটিল, কারণ রিঅ্যাক্টজেএস ওয়েব অ্যাপ্লিকেশন লেখার সম্পূর্ণ ভিন্ন উপায়, এটি আমাদের কাছে বয়স্ক লোকদের কাছে খুব এলিয়েন!

এই জগাখিচুড়ি দূরে সরানোর জন্য আমি একটি পৃথক উপাদান তৈরি করেছি:

// LinkButton.js

import React from "react";
import PropTypes from "prop-types";
import {Route} from 'react-router-dom';

export default class LinkButton extends React.Component {

    render() {
        return (
            <Route render={({history}) => (
                <button {...this.props}
                       onClick={() => {
                           history.push(this.props.to)
                       }}>
                    {this.props.children}
                </button>
            )}/>
        );
    }
}

LinkButton.propTypes = {
    to: PropTypes.string.isRequired
};

তারপরে এটি আপনার render()পদ্ধতিতে যুক্ত করুন:

<LinkButton className="btn btn-primary" to="/location">
    Button Text
</LinkButton>

আমি এই সমাধানটি বেশ দরকারী বলে মনে করি। আমি কোডটি অনুলিপি করছি। আমাকে জানতে দিন আপনি এটি গিথুবে রেখেছেন - আমি এটি সরাসরি আপনার কাছে দেব।
অভিনব মনচাঁদা

3

যেহেতু এই ভয়াবহ নকশাটি মোকাবেলা করার কোনও উপায় নেই, তাই আমি একটি জেনেরিক উপাদান লিখেছি যা withRouter এইচওসি পদ্ধতির ব্যবহার করে । নীচের উদাহরণটি একটি buttonউপাদান মোড়ানো , তবে আপনি যে কোনও ক্লিকযোগ্য উপাদানগুলিতে প্রয়োজন তা পরিবর্তন করতে পারেন:

import React from 'react';
import PropTypes from 'prop-types';
import { withRouter } from 'react-router-dom';

const NavButton = (props) => (
  <Button onClick={() => props.history.push(props.to)}>
    {props.children}
  </Button>
);

NavButton.propTypes = {
  history: PropTypes.shape({
    push: PropTypes.func.isRequired
  }),
  to: PropTypes.string.isRequired
};

export default withRouter(NavButton);

ব্যবহার:

<NavButton to="/somewhere">Click me</NavButton>

3
this.props.history.push("/url")

যদি আপনি এই উপাদানটি পাওয়া যায় না তবে আপনার উপাদানগুলির মধ্যে এই.পড়গুলি। হিস্টরিটি পাওয়া যায়, তবে এটি চেষ্টা করে দেখুন

import {withRouter} from 'react-router-dom'
export default withRouter(MyComponent)  

অনেক ধন্যবাদ!
কোজেনএমজেড

1

কখনও কখনও আমি অ্যাপ্লিকেশন এবং তারপরে বোতামগুলির মাধ্যমে রুটগুলি স্যুইচ করতে পছন্দ করি, এটি আমার পক্ষে কাজ করে এমন একটি ন্যূনতম কার্যকারী উদাহরণ:

import { Component } from 'react'
import { BrowserRouter as Router, Link } from 'react-router-dom'

class App extends Component {
  constructor(props) {
    super(props)

    /** @type BrowserRouter */
    this.router = undefined
  }

  async handleSignFormSubmit() {
    await magic()
    this.router.history.push('/')
  }

  render() {
    return (
      <Router ref={ el => this.router = el }>
        <Link to="/signin">Sign in</Link>
        <Route path="/signin" exact={true} render={() => (
          <SignPage onFormSubmit={ this.handleSignFormSubmit } />
        )} />
      </Router>
    )
  }
}

0

আপনারা যারা রউটারটি সম্পূর্ণরূপে ব্যবহারের পূর্বে পুনঃনির্দেশের প্রয়োজন হয় React Routerবা React Router Domআপনি ইতিহাসের অবজেক্টটি অ্যাক্সেস করে এবং আপনার নির্মাণকারীর মধ্যে একটি নতুন রাষ্ট্রকে চাপ দিয়ে পুনর্নির্দেশ সরবরাহ করতে পারেন app.js। নিম্নোক্ত বিবেচনা কর:

function getSubdomain(hostname) {
    let regexParse = new RegExp('[a-z\-0-9]{2,63}\.[a-z\.]{2,5}$');
    let urlParts = regexParse.exec(hostname);
    return hostname.replace(urlParts[0], '').slice(0, -1);
}

class App extends Component {

    constructor(props) {
        super(props);


        this.state = {
            hostState: true
        };

        if (getSubdomain(window.location.hostname).length > 0) {
            this.state.hostState = false;
            window.history.pushState('', '', './login');
        } else {
            console.log(getSubdomain(window.location.hostname));
        }

    }


    render() {
        return (

            <BrowserRouter>
                {this.state.hostState ? (
                    <div>
                        <Route path="/login" component={LoginContainer}/>
                        <Route path="/" component={PublicContainer}/>
                    </div>
                ) : (
                    <div>
                        <Route path="/login" component={LoginContainer}/>
                    </div>
                )

                }
            </BrowserRouter>)
    }


}

এখানে আমরা সাবডোমেনের উপর নির্ভরশীল আউটপুট রুটগুলি পরিবর্তন করতে চাই, যখন উপাদানটি রেন্ডার করার আগে আমরা কার্যকরভাবে পুনর্নির্দেশ করতে পারি তার আগে ইতিহাসের বিষয়টির সাথে আলাপচারিতা করে আমাদের রুটগুলি কৌশলে ছেড়ে যেতে চাই।

window.history.pushState('', '', './login');
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.