প্রতিক্রিয়াশীল রাউটার ব্যবহার করে প্রোগ্রামগতভাবে নেভিগেট করুন


1426

এর সাথে react-routerআমি Linkলিঙ্কগুলি তৈরি করতে উপাদানটি ব্যবহার করতে পারি যা প্রতিক্রিয়া রাউটার দ্বারা স্থানীয়ভাবে পরিচালিত হয়।

আমি অভ্যন্তরীণভাবে দেখতে পাই এটি কল করে this.context.transitionTo(...)

আমি একটি নেভিগেশন করতে চান। কোনও লিঙ্ক থেকে নয়, একটি ড্রপডাউন নির্বাচন থেকে (উদাহরণ হিসাবে)। আমি কোডে এটি কীভাবে করতে পারি? কী this.context?

আমি Navigationমিশ্রণটি দেখেছি , তবে আমি কি এটি ছাড়া এটি করতে পারি mixins?


26
@ সেরজিওটিপিয়া মনে রাখবেন যে এই প্রশ্নটি রিঅ্যাক্ট-রাউটারের একটি বড় রিলিজ, রিএ্যাক্টের একটি বড় রিলিজ এবং জাভাস্ক্রিপ্টের একটি বড় প্রকাশকে স্তম্ভিত করেছে
জর্জ মাউয়ার

5
প্রতিক্রিয়া রাউটার ভি 4 এর অফিশিয়াল ডক্সে
রিরেট


4
আপনি এই উত্তর পেয়ে আমি খুশি, তবে দুঃখজনক যে এটি এই জটিল হতে হবে। একটি ওয়েব অ্যাপের মধ্যে নেভিগেট করা সহজ এবং ভাল নথিভুক্ত হওয়া উচিত। ভ্যুজেএস এটিকে তুচ্ছ করে তোলে। প্রতিটি উপাদান রাউটার উদাহরণটি স্বয়ংক্রিয়ভাবে ইনজেকশন পায়। তাদের ডক্সে এর জন্য একটি স্পষ্টভাবে সংজ্ঞায়িত বিভাগ রয়েছে। router.vuejs.org/guide/essentials/navication.html আমি অনেক কিছুর জন্য প্রতিক্রিয়া জানাতে চাই তবে এটি কখনও কখনও অত্যধিক জটিল complicated </
ran

7
আপনি ঠিক বলেছেন এই সম্প্রদায়টি এ সম্পর্কে নয়। এটি ফ্রেমওয়ার্কের উপর ঝাঁকুনির জন্য নয়, প্রশ্নের উত্তর দেওয়ার বিষয়ে। অনুস্মারকটির জন্য ধন্যবাদ।
colefner

উত্তর:


1426

হুকস সহ রাউটার v5.1.0 প্রতিক্রিয়া

useHistoryআপনি প্রতিক্রিয়া> 16.8.0 এবং কার্যকরী উপাদানগুলি ব্যবহার করে যদি প্রতিক্রিয়া রাউটার> 5.1.0 এ একটি নতুন হুক রয়েছে।

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

function HomeButton() {
  const history = useHistory();

  function handleClick() {
    history.push("/home");
  }

  return (
    <button type="button" onClick={handleClick}>
      Go home
    </button>
  );
}

প্রতিক্রিয়া রাউটার v4

প্রতিক্রিয়া রাউটারের v4 এর সাথে, তিনটি পন্থা রয়েছে যা আপনি উপাদানগুলির মধ্যে প্রোগ্রাম্যাটিক রাউটিংয়ে নিতে পারেন।

  1. withRouterউচ্চতর অর্ডার উপাদান ব্যবহার করুন ।
  2. রচনা ব্যবহার করুন এবং রেন্ডার করুন a <Route>
  3. ব্যবহার করুন context

প্রতিক্রিয়া রাউটারটি সাধারণত historyলাইব্রেরির চারপাশে একটি মোড়ক pper historyব্রাউজারটির window.historyব্রাউজার এবং হ্যাশ ইতিহাসের সাথে আপনার জন্য ইন্টারঅ্যাকশন পরিচালনা করে । এটি একটি মেমরির ইতিহাসও সরবরাহ করে যা বিশ্বব্যাপী ইতিহাস না এমন পরিবেশগুলির জন্য দরকারী। এটি বিশেষত মোবাইল অ্যাপ্লিকেশন বিকাশ ( react-native) এবং নোডের সাথে ইউনিট পরীক্ষায় কার্যকর।

একটি historyউদাহরণ নেভিগেট জন্য দুটি পদ্ধতি আছে: pushএবং replace। আপনি যদি historyপরিদর্শনকৃত অবস্থানগুলির অ্যারে হিসাবে মনে করেন তবে অ্যারেতে pushএকটি নতুন অবস্থান যুক্ত হবে এবং অ্যারের replaceবর্তমান অবস্থানটি নতুনটির সাথে প্রতিস্থাপন করবে। সাধারণত আপনি pushনেভিগেট করার সময় আপনি পদ্ধতিটি ব্যবহার করতে চাইবেন ।

রাউটার প্রতিক্রিয়া 'র পূর্ববর্তী সংস্করণে, আপনি আপনার নিজের তৈরি করা ছিল historyউদাহরণস্বরূপ, কিন্তু V4 মধ্যে <BrowserRouter>, <HashRouter>এবং <MemoryRouter>উপাদান আপনার জন্য একটি ব্রাউজার, হ্যাশ, এবং মেমরি দৃষ্টান্ত তৈরি করবে। প্রতিক্রিয়া historyরাউটারটি আপনার রাউটারের সাথে সম্পর্কিত দৃষ্টান্তের বৈশিষ্ট্য এবং পদ্ধতিগুলি প্রসঙ্গের মাধ্যমে routerঅবজেক্টের অধীনে উপলব্ধ করে ।

1. withRouterউচ্চতর অর্ডার উপাদান ব্যবহার করুন

withRouterউচ্চতর-অর্ডার উপাদান উদ্বুদ্ধ করা হবে historyউপাদানের একটি ঠেকনা যেমন অবজেক্ট। এটি আপনাকে লেনদেন না করেই পদ্ধতি pushএবং replaceপদ্ধতিগুলি অ্যাক্সেস করার অনুমতি দেয় context

import { withRouter } from 'react-router-dom'
// this also works with react-router-native

const Button = withRouter(({ history }) => (
  <button
    type='button'
    onClick={() => { history.push('/new-location') }}
  >
    Click Me!
  </button>
))

২. রচনা ব্যবহার করুন এবং রেন্ডার করুন a <Route>

<Route>কম্পোনেন্ট শুধু ম্যাচিং অবস্থানের জন্য নয়। আপনি একটি পথহীন রুট রেন্ডার করতে পারেন এবং এটি সর্বদা বর্তমান অবস্থানের সাথে মেলে<Route>উপাদান হিসাবে একই সাজসরঞ্জাম পাসের withRouter, তাই আপনি অ্যাক্সেস করতে সক্ষম হবে historyমাধ্যমে পদ্ধতি historyঠেকনা।

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

const Button = () => (
  <Route render={({ history}) => (
    <button
      type='button'
      onClick={() => { history.push('/new-location') }}
    >
      Click Me!
    </button>
  )} />
)

৩. প্রসঙ্গটি ব্যবহার করুন *

তবে আপনার সম্ভবত করা উচিত নয়

শেষ বিকল্পটি এমন একটি যা আপনি কেবল তখনই ব্যবহার করতে পারেন যদি আপনি প্রতিক্রিয়াটির প্রসঙ্গ মডেলটির সাথে কাজ করতে স্বাচ্ছন্দ্য বোধ করেন (প্রতিক্রিয়াটির প্রসঙ্গ এপিআই v16 এর হিসাবে স্থিতিশীল)।

const Button = (props, context) => (
  <button
    type='button'
    onClick={() => {
      // context.history.push === history.push
      context.history.push('/new-location')
    }}
  >
    Click Me!
  </button>
)

// you need to specify the context type so that it
// is available within the component
Button.contextTypes = {
  history: React.PropTypes.shape({
    push: React.PropTypes.func.isRequired
  })
}

1 এবং 2 হ'ল বাস্তবায়নের সহজ বিকল্প, তাই বেশিরভাগ ব্যবহারের ক্ষেত্রে এটি আপনার সেরা বেট।


24
আমি এইভাবে রৌটার (({ইতিহাস}) => so কনসোল.লগ ("এইচএইচহ্হ্হ্হ্"); ইতিহাস.পশ ('/ বেটস')}) দিয়ে 1 পদ্ধতিটি ব্যবহার করার চেষ্টা করেছি; তবে এটি কখনও রাউটার 4
দিমিত্রি মালুগিন

57
কি!? আমি আমার সমস্ত উপাদান দিয়ে withRouterযাওয়ার পরিবর্তে কেবল ব্যবহার করতে পারি history?? গাহ আমাকে ডকস পড়ার জন্য আরও বেশি সময় ব্যয় করতে হবে ...
হ্যালোজেফাল

18
history.push('/new-location')বাটন বা অন্যান্য ডিওএম উপাদানগুলির সাথে এই আচরণটি সংযুক্ত না করে আপনি কীভাবে চালাতে পারেন ?
নিল

4
ত্রুটি ছুঁড়ে মারতেUnexpected use of 'history' no-restricted-globals
পারদীপ জৈন

18
contextপ্রতিক্রিয়া হিসাবে 16 এখন আর পরীক্ষামূলক নয়।
ট্রাইসিস

919

প্রতিক্রিয়া-রাউটার 5.1.0+ উত্তর (হুক ব্যবহার করে প্রতিক্রিয়া> 16.8 ব্যবহার করে)

আপনি useHistoryকার্যকরী উপাদানগুলিতে নতুন হুক ব্যবহার করতে পারেন এবং প্রোগ্রামগতভাবে নেভিগেট করতে পারেন:

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

function HomeButton() {
  let history = useHistory();
  // use history.push('/some/path') here
};

প্রতিক্রিয়া-রাউটার 4.0.0+ উত্তর

৪.০ এবং তার উপরে, ইতিহাসটিকে আপনার উপাদানগুলির প্রপোস হিসাবে ব্যবহার করুন।

class Example extends React.Component {
   // use `this.props.history.push('/some/path')` here
};

দ্রষ্টব্য: আপনার উপাদান দ্বারা রেন্ডার করা হয়নি সে ক্ষেত্রে এই.পড়গুলি। হিস্টরিটি বিদ্যমান নেই <Route><Route path="..." component={YourComponent}/>আপনার কম্পোনেন্টে এটি.প্রোসস হিস্ট্রি ব্যবহার করা উচিত

প্রতিক্রিয়া-রাউটার 3.0.0+ উত্তর

3.0 এবং তারপরে, রাউটারটি আপনার উপাদানগুলির উত্স হিসাবে ব্যবহার করুন।

class Example extends React.Component {
   // use `this.props.router.push('/some/path')` here
};

প্রতিক্রিয়া-রাউটার 2.4.0+ উত্তর

২.৪ এবং তদূর্ধের ক্ষেত্রে, রাউটারটি আপনার উপাদানগুলির প্রপোস হিসাবে পেতে একটি উচ্চতর অর্ডার উপাদান ব্যবহার করুন।

import { withRouter } from 'react-router';

class Example extends React.Component {
   // use `this.props.router.push('/some/path')` here
};

// Export the decorated class
var DecoratedExample = withRouter(Example);

// PropTypes
Example.propTypes = {
  router: React.PropTypes.shape({
    push: React.PropTypes.func.isRequired
  }).isRequired
};

প্রতিক্রিয়া-রাউটার 2.0.0+ উত্তর

এই সংস্করণটি 1.x এর সাথে পিছনে সামঞ্জস্যপূর্ণ তাই আপগ্রেড গাইডের দরকার নেই। উদাহরণগুলির মধ্যে দিয়ে যাওয়া যথেষ্ট ভাল হওয়া উচিত।

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

import { browserHistory } from 'react-router'

এখন আপনার ব্রাউজারের ইতিহাসে অ্যাক্সেস রয়েছে, সুতরাং আপনি ধাক্কা, প্রতিস্থাপন ইত্যাদির মতো জিনিসগুলি করতে পারেন ... যেমন:

browserHistory.push('/some/path')

আরও পড়া: ইতিহাস এবং নেভিগেশন


প্রতিক্রিয়া-রাউটার 1.xx উত্তর

আমি আপগ্রেডিং বিশদে যাব না। আপনি যে সম্পর্কে পড়তে পারেন আপগ্রেড গাইডে

এখানে প্রশ্ন সম্পর্কে প্রধান পরিবর্তন হ'ল নেভিগেশন মিশ্রণ থেকে ইতিহাসে পরিবর্তন। এখন এটি রুট পরিবর্তন করতে ব্রাউজারের ইতিহাস API ব্যবহার করছে যাতে আমরা ব্যবহার করবpushState() এখন থেকে ।

এখানে মিক্সিন ব্যবহারের একটি উদাহরণ রয়েছে:

var Example = React.createClass({
  mixins: [ History ],
  navigateToHelpPage () {
    this.history.pushState(null, `/help`);
  }
})

নোট করুন যে এটি র‌্যাক্ট / ইতিহাসHistory থেকে এসেছে প্রকল্প । প্রতিক্রিয়া-রাউটার থেকে নিজেই নয়।

আপনি যদি কোনও কারণে ম্যাক্সিন ব্যবহার করতে না চান (সম্ভবত ES6 শ্রেণীর কারণে) তবে আপনি রাউটার থেকে যে ইতিহাসটি পেয়েছেন তা অ্যাক্সেস করতে পারবেন this.props.history । এটি কেবল আপনার রাউটার দ্বারা সরবরাহিত উপাদানগুলির জন্য অ্যাক্সেসযোগ্য। সুতরাং, আপনি যদি এটি কোনও সন্তানের উপাদানগুলিতে ব্যবহার করতে চান তবে এটির মাধ্যমে একটি অ্যাট্রিবিউট হিসাবে পাস করতে হবে props

তাদের নতুন রিলিজ সম্পর্কে আরও পড়তে পারেন 1.0.x ডকুমেন্টেশনে

এখানে আপনার উপাদানগুলির বাইরে নেভিগেট সম্পর্কে বিশেষত একটি সহায়তা পৃষ্ঠা রয়েছে

এটি একটি রেফারেন্স দখল history = createHistory()এবং এটি কল replaceStateকরার পরামর্শ দেয়।

প্রতিক্রিয়া-রাউটার 0.13.x উত্তর

আমি একই সমস্যায় পড়েছি এবং কেবলমাত্র নেভিগেশন মিক্সিনের সাথে সমাধানটি পেয়েছি যা প্রতিক্রিয়া-রাউটারের সাথে আসে।

আমি এটি কীভাবে করেছি তা এখানে

import React from 'react';
import {Navigation} from 'react-router';

let Authentication = React.createClass({
  mixins: [Navigation],

  handleClick(e) {
    e.preventDefault();

    this.transitionTo('/');
  },

  render(){
    return (<div onClick={this.handleClick}>Click me!</div>);
  }
});

transitionTo()অ্যাক্সেসের প্রয়োজন ছাড়াই আমি কল করতে সক্ষম হয়েছি.context

অথবা আপনি অভিনব ES6 চেষ্টা করতে পারেন class

import React from 'react';

export default class Authentication extends React.Component {
  constructor(props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick(e) {
    e.preventDefault();

    this.context.router.transitionTo('/');
  }

  render(){
    return (<div onClick={this.handleClick}>Click me!</div>);
  }
}

Authentication.contextTypes = {
  router: React.PropTypes.func.isRequired
};

প্রতিক্রিয়া-রাউটার-Redux

নোট: যদি আপনি Redux ব্যবহার করছেন, আরেকটা প্রকল্পের বলা হয় ReactRouter-Redux আপনি ReactRouter জন্য বাইন্ডিং redux, কিছুটা একই পদ্ধতি যে ব্যবহার দেয় প্রতিক্রিয়া-Redux করে

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

নিম্নলিখিত পদ্ধতিগুলি এক্সপ্লোর করুন:

  • push(location)
  • replace(location)
  • go(number)
  • goBack()
  • goForward()

এখানে Redux-Thunk এর সাথে ব্যবহারের একটি উদাহরণ রয়েছে :

./actioncreators.js

import { goBack } from 'react-router-redux'

export const onBackPress = () => (dispatch) => dispatch(goBack())

./viewcomponent.js

<button
  disabled={submitting}
  className="cancel_button"
  onClick={(e) => {
    e.preventDefault()
    this.props.onBackPress()
  }}
>
  CANCEL
</button>

3
আমি ব্যবহার করছি v2.4.0কিন্তু উল্লিখিত পদ্ধতির আমার জন্য কাজ করে, আমার অ্যাপ্লিকেশন সব এবং কনসোল আউটপুট এ রেন্ডার নেই না: Uncaught TypeError: (0 , _reactRouter.withRouter) is not a functionএখানে আমার তাই পোস্টটির লিঙ্ক দেওয়া হল: stackoverflow.com/questions/37306166/...
nburk

7
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, স্বীকৃত উত্তরটি কিছুটা গোলমাল এবং খুব পুরানো। @ জায়েন্টএলক আমার কাছে সংস্করণটির উত্তরে বর্ণিত হিসাবে এটি কাজ করছে 2.6.0
জেএম্যাক

2
এই পদ্ধতির এখনও সংস্করণ জন্য প্রস্তাবিত উপায় 3.0.x? অনেক লোক মনে হয় উপায়টি ব্যবহার করছে context
velop

6
৪.০-তে, এই.প্রেসস হিস্টরিটির অস্তিত্ব নেই। কি হচ্ছে?
নিকোলাস এস এক্সু

4
@ নিকোলাসএস.এক্সু this.props.historyআপনার উপাদানটি রেন্ডার না করায় বিদ্যমান নেই <Route>। আপনি ব্যবহার করা উচিত <Route path="..." component={YourComponent}/>আছে this.props.historyমধ্যে YourComponent
ভোগডিব

508

প্রতিক্রিয়া-রাউটার v2

সর্বাধিক সাম্প্রতিক প্রকাশের জন্য ( v2.0.0-rc5), প্রস্তাবিত নেভিগেশন পদ্ধতিটি হিস্ট্রি সিঙ্গলটনে সরাসরি চাপ দেওয়া। আপনি উপাদান ডকের বাইরে নেভিগেটে ক্রিয়াকলাপটি দেখতে পারেন ।

প্রাসঙ্গিক অংশ:

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

যদি নতুন রিএ্যাক্ট-রাউটার এপিআই ব্যবহার করে থাকেন তবে আপনাকে উপাদানগুলির ভিতরে historyথাকা this.propsঅবস্থায় এর ব্যবহারটি করতে হবে যাতে:

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

এটি অফার করে pushStateতবে লগ করা সতর্কতা অনুসারে এটি হ্রাস করা হয়।

যদি ব্যবহার করা হয় তবে react-router-reduxএটি এমন একটি pushফাংশন সরবরাহ করে যাতে আপনি প্রেরণ করতে পারেন:

import { push } from 'react-router-redux';
this.props.dispatch(push('/some/path'));

তবে এটি কেবলমাত্র ইউআরএল পরিবর্তন করতে ব্যবহার করা যেতে পারে, পৃষ্ঠায় আসলে নেভিগেট করার জন্য নয়।


15
ভুলে যাবেন না যে নতুন এপিআই ব্যবহার করে না import { browserHistory } from './react-router'বরং পরিবর্তে ইতিহাস তৈরি করে import createBrowserHistory from 'history/lib/createBrowserHistory'। পরে, আপনি historyউপাদানগুলির প্রপসগুলি থেকে অ্যাক্সেস করতে পারবেন :this.props.history('/some/path')
রিকার্ডো পেদ্রোনি

7
var browserHistory = require('react-router').browserHistory; browserHistory.goBack();
ববি

7
প্রতিক্রিয়া-রাউটার-রিডেক্স pushকেবলমাত্র ইউআরএল পরিবর্তন করে, পৃষ্ঠাটি আসলে পরিবর্তন করে না। উভয় আমদানি করার জন্য, browserHistoryথেকে react-routerএবং ব্যবহার browserHistory.push('/my-cool-path')। দুর্ভাগ্যক্রমে, এটি সন্ধান করা খুব সহজ নয়। github.com/reactjs/react-router/blob/master/docs/guides/…
অ্যান্ড্রু

4
আমি এটি.প্রোসস হিস্টরি.পুশ ('/') ব্যবহার করছি তবে কেবল ইউআরএল পরিবর্তিত হবে ... এখানে আসল কোনও রাউটিং চলছে না। আমি কী মিস করছি?
rgcalsaverini


56

এখানে আপনি কিভাবে সঙ্গে এই কাজ এর react-router v2.0.0সঙ্গে ES6 এরreact-routerমিশিন থেকে দূরে সরে গেছে।

import React from 'react';

export default class MyComponent extends React.Component {
  navigateToPage = () => {
    this.context.router.push('/my-route')
  };

  render() {
    return (
      <button onClick={this.navigateToPage}>Go!</button>
    );
  }
}

MyComponent.contextTypes = {
  router: React.PropTypes.object.isRequired
}

5
আমি বিশ্বাস করি যে বর্তমান সুপারিশটি হ'ল history@ বোবির বর্ণিত সিঙ্গলটন ব্যবহার করা। আপনি ব্যবহার করতে পারেন context.routerতবে আপনি সেই উপাদানগুলিকে পরীক্ষা করা সত্যই কঠিন করে তুলছেন ঠিক যে উপাদানটির প্রেক্ষাপটে এটি থাকবে না inst
জর্জি মাউয়ার

2
@ জর্জমৌয়ার আমার ধারণা কোডটি কোথায় চলছে তার উপর নির্ভর করে। প্রতিক্রিয়াযুক্ত ডক্স অনুসারে, এটি সার্ভারে চালিত হলে প্রসঙ্গ.আউটার ব্যবহারের পরামর্শ দেওয়া হচ্ছে। github.com/reactjs/react-router/blob/master/upgrade-guides/…
কুমারএম

50

প্রতিক্রিয়া-রাউটার 4.x উত্তর:

আমার শেষে, আমি একটি একক ইতিহাসের অবজেক্ট রাখতে চাই যা আমি এমনকি বাইরের উপাদানগুলিও বহন করতে পারি। আমি যা করতে চাই তা হ'ল আমি চাহিদা অনুযায়ী আমদানি করে এমন একক ইতিহাস.জেএস ফাইল রাখি এবং কেবল এটি পরিচালনা করি।

আপনাকে কেবল BrowserRouterরাউটারে পরিবর্তন করতে হবে এবং ইতিহাসের প্রোপ নির্দিষ্ট করতে হবে। এটি আপনার জন্য কিছু পরিবর্তন করে না আপনার নিজের ইতিহাসের বিষয়বস্তু যা আপনি যেমন চান তেমন পরিচালনা করতে পারেন।

আপনার ইতিহাস ইনস্টল করতে হবে , ব্যবহৃত গ্রন্থাগার react-router

ব্যবহারের উদাহরণ, ES6 স্বরলিপি:

history.js

import createBrowserHistory from 'history/createBrowserHistory'
export default createBrowserHistory()

BasicComponent.js

import React, { Component } from 'react';
import history from './history';

class BasicComponent extends Component {

    goToIndex(e){
        e.preventDefault();
        history.push('/');
    }

    render(){
        return <a href="#" onClick={this.goToIndex}>Previous</a>;
    }
}

এডিআইটি 16 এপ্রিল, 2018:

যদি আপনাকে কোনও উপাদান থেকে প্রকৃতপক্ষে রেন্ডার করা উপাদান থেকে নেভিগেট করতে হয় Route, আপনি প্রপস থেকে ইতিহাসও অ্যাক্সেস করতে পারেন, এর মতো:

BasicComponent.js

import React, { Component } from 'react';

class BasicComponent extends Component {

    navigate(e){
        e.preventDefault();
        this.props.history.push('/url');
    }

    render(){
        return <a href="#" onClick={this.navigate}>Previous</a>;
    }
}

2
প্রতিক্রিয়া রাউটার ডকগুলি বাদে আমাদের জানান যে আপনার উচিত নয়, বেশিরভাগ ক্ষেত্রে Routerপরিবর্তে ব্যবহার করা দরকার BrowserRouter। আপনার জন্য অবজেক্ট BrowserRouterতৈরি করে এবং বজায় রাখে history। আপনি আপনার নিজের তৈরি ডিফল্ট উচিত নয়, শুধুমাত্র আপনি [ "Redux মত রাষ্ট্র পরিচালনা সরঞ্জামের সঙ্গে গভীর ইন্টিগ্রেশন প্রয়োজন।"] Reacttraining.com/react-router/web/api/Router
bobbyz

2
এটি এমন কিছু যা আমি সময় এবং অভিজ্ঞতার সাথে শিখেছি। ডিফল্টটি ব্যবহার করা সাধারণত একটি ভাল অনুশীলন হলেও this.props.history, আমি এখনও এমন কোনও সমাধান খুঁজে পাইনি যা আমাকে ক্লাসে এমন কাজ করতে সহায়তা করতে পারে যা কোনও উপাদান নয় বা অন্য কোনও সরঞ্জাম যা প্রতিক্রিয়া উপাদান হিসাবে তৈরি করা হয়নি to আপনি প্রপস পাস করতে পারেন আপনার মতামতের জন্য ধন্যবাদ :)
এরিক মার্টিন

44

এইটির জন্য, কে সার্ভারের পক্ষে নিয়ন্ত্রণ করে না এবং এর জন্য হ্যাশ রাউটার ভি 2 ব্যবহার করছে:

আপনার ইতিহাসকে পৃথক ফাইলে রাখুন (উদাঃ app_history.js ES6):

import { useRouterHistory } from 'react-router'
import { createHashHistory } from 'history'
const appHistory = useRouterHistory(createHashHistory)({ queryKey: false });

export default appHistory;

এবং সর্বত্র এটি ব্যবহার করুন!

প্রতিক্রিয়া-রাউটারের জন্য আপনার প্রবেশের স্থান (app.js ES6):

import React from 'react'
import { render } from 'react-dom'
import { Router, Route, Redirect } from 'react-router'
import appHistory from './app_history'
...
const render((
  <Router history={appHistory}>
  ...
  </Router>
), document.querySelector('[data-role="app"]'));

যে কোনও উপাদানগুলির মধ্যে আপনার নেভিগেশন (ES6):

import appHistory from '../app_history'
...
ajaxLogin('/login', (err, data) => {
  if (err) {
    console.error(err); // login failed
  } else {
    // logged in
    appHistory.replace('/dashboard'); // or .push() if you don't need .replace()
  }
})

1
ধন্যবাদ। হয়তো আমি কিছু মিস করছি। এটি কি শীর্ষ দুটি জবাবের মতো ঠিক নয়?
জর্জ মাউয়ার

2
আপনি যখন "হ্যাশ" নেভিগেশন ব্যবহার করছেন, যখন "রিএ্যাক্ট-রাউটার" ভি 2 তে আপনাকে অতিরিক্ত মডিউল "ইতিহাস" ইনস্টল করতে হবে (আপনি যদি অদ্ভুত হ্যাশ প্রশ্নগুলি এড়াতে চান), এবং ব্রাউজারের ইতিহাসের পরিবর্তে আপনার ব্যবহারের প্রয়োজন রউটারহাইস্টরি (ক্রিয়েটহিশার ইতিহাস) ( {ক্যোয়ারীকি: ভুয়া})। এটি পোস্ট করার মূল কারণ এটি। আমি দেখিয়েছি কীভাবে হ্যাশের ইতিহাস নিয়ে নেভিগেট করা যায়।
অ্যালেক্সি ভোলডকো

1
ওহ, আমি দেখছি, আপনি ঠিক বলেছেন। আমি আর এই প্রকল্পে নেই তবে আমার মনে হয় পছন্দের history
জর্জ মাউয়ার

4
কেন এই উত্তর সেরা হয় না? কনটেক্সট বা এইচওসি বা ইভেন্ট প্রোটোটাইপগুলিতে কেন সমস্ত সমস্যায় পড়েন, কেন কেবল ইতিহাস আমদানি করবেন না এবং যেখানে খুশি সেখানেই ব্যবহার করবেন না কেন? শুধু
ট্রেড অফ

@storm_buster- এর কোনও বাণিজ্য নেই। আমাদের ES6 মডিউল রয়েছে এবং সেগুলি আমাদের ব্যবহার করা উচিত! এটি হ'ল আপনার সরঞ্জাম (এই ক্ষেত্রে প্রতিক্রিয়া) সকল কিছুর জন্য এমনকি এমন জিনিসগুলির জন্য যা আপনি সত্যিই সেগুলি ব্যবহার করতে চান না তার জন্য এটি ব্যবহার করার সাধারণ বৈশিষ্ট্য।
কপাজ

40

প্রতিক্রিয়া রাউটার ভি 4

TL: DR;

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 + সম্পত্তি প্রারম্ভিক ব্যবহার করে । দেখুন এখানেআগ্রহী হলে ।


এটি আমি খুঁজে পেয়েছি সেরা উত্তর। withRouterইতিমধ্যে পুনরায় লোড হওয়া রুটে যখন ব্যবহার করা হয়নি তখনই কাজ করে। আমাদের ক্ষেত্রে, ইতিমধ্যে রুটে বা অন্য কোথাও থেকে আমাদের বেছে বেছে বেছে setState(কারণ return <Redirect>) তৈরি করতে history.push()হয়েছিল।
কর্মকাজে

খুব, খুব চালাক। এবং এখনও খুব সহজ। Tks। আমি পুরো লাইনে ক্লিকটি পরিচালনা করতে চেয়েছি তাই আমি এটি রিঅ্যাক্টরউটারট্যাবেলে ব্যবহার করেছি। রাজ্য সেট করতে অনরউ ক্লিক ক্লিক করুন। সেটস্টেট (ig নেভিগেটটো: "/ পথ /" + সারি ;uuid});
লোভাটো

এটি বুলেট প্রুফ উত্তর।
নীতিন যাদব

31

সতর্কতা: এই জবাবটি 1.0 এর আগে কেবল রিঅ্যাক্টরউটার সংস্করণগুলিকে কভার করে

আমি এই উত্তরটি পরে 1.0.0-rc1 ব্যবহারের ক্ষেত্রে আপডেট করব!

আপনি খুব মিশ্রণ ছাড়াই এটি করতে পারেন।

let Authentication = React.createClass({
  contextTypes: {
    router: React.PropTypes.func
  },
  handleClick(e) {
    e.preventDefault();
    this.context.router.transitionTo('/');
  },
  render(){
    return (<div onClick={this.handleClick}>Click me!</div>);
  }
});

প্রসঙ্গের সাথে গ্যাচা হ'ল আপনি ক্লাসটির contextTypesউপর সংজ্ঞা না দিলে এটি অ্যাক্সেসযোগ্য নয় ।

প্রসঙ্গ কী, প্রপসের মতো এটি একটি বস্তু যা পিতা বা মাতার কাছ থেকে সন্তানের কাছে চলে যায়, তবে প্রতিটি বার প্রপসকে পুনরায় ঘোষনা না করেই তা স্পষ্টভাবে নিচে চলে যায়। Https://www.tildedave.com/2014/11/15/intr پيداوار- to- contexts- in- react- js.html দেখুন


26

কিছু কাজ করার আগে আমি এটি করার কমপক্ষে 10 টি উপায় চেষ্টা করেছি!

@ ফিলিপ স্কিনারের withRouterউত্তরটি আমার কাছে কিছুটা অভিভূত হয়েছিল এবং আমি নিশ্চিত নই যে আমি নতুন "এক্সপোর্টড উইথরোউটার" শ্রেণীর নাম বানাতে চাইছি ।

এটি করার সবচেয়ে সহজ এবং পরিষ্কার উপায়টি এখানে বর্তমান প্রতিক্রিয়া-রাউটার 3.0.0 এবং ES6 এর সাথে সম্পর্কিত:

প্রতিক্রিয়া-রাউটার EX6 সহ 3.XX:

import { withRouter } from 'react-router';

class Example extends React.Component {
   // use `this.props.router.push('/some/path')` here
};

// Export the decorated class
export default withRouter(Example);

বা, এটি যদি আপনার ডিফল্ট শ্রেণি না হয় তবে রফতানি করুন:

withRouter(Example);
export { Example };

নোট করুন যে ৩.৫ এক্সএক্স-তে, <Link>উপাদানটি নিজেই ব্যবহার করছে router.push, তাই আপনি <Link to=ট্যাগটি যে কোনও কিছুতে পাস করতে পারেন , যেমন:

   this.props.router.push({pathname: '/some/path', query: {key1: 'val1', key2: 'val2'})'

1
এটি সম্পূর্ণ সূক্ষ্ম কাজ করে। কিন্তু কোডের 200 OKপরিবর্তে প্রতিক্রিয়া জানায় 30x। আমি কীভাবে এই সমস্যাটি সমাধান করতে পারি?
মুহাম্মদ আতিক আযম

1
নিশ্চিত না. এটি আমার পক্ষে কখনই আসে নি কারণ এটি কোনও বাহ্যিক অনুরোধ নয় - এটি পৃষ্ঠায় যা রয়েছে তা পরিবর্তন করতে পৃষ্ঠার নিজস্ব কোড ব্যবহার করে এটি আপনার ব্রাউজার। আপনি যদি পছন্দ করেন তবে সর্বদা একটি ম্যানুয়াল জাভাস্ক্রিপ্ট পুনর্নির্দেশ করতে পারেন।
বেন হুইলার

1
এটি ক্লাস ডেকরেটর হিসাবে @ উইথরোউটারের সাথেও ব্যবহার করা যেতে পারে ... মবক্সের সাথে দুর্দান্ত যায়
ড্যান

21

গৌণ প্রোগ্রামেটিক্যালি কাজের জন্য, আপনি একটি নতুন ধাক্কা প্রয়োজন ইতিহাস থেকে props.history আপনার componentতাই ভালো কিছু আপনার জন্য কাজ করতে পারি না:

//using ES6
import React from 'react';

class App extends React.Component {

  constructor(props) {
    super(props)
    this.handleClick = this.handleClick.bind(this)
  }

  handleClick(e) {
    e.preventDefault()
    /* Look at here, you can add it here */
    this.props.history.push('/redirected');
  }

  render() {
    return (
      <div>
        <button onClick={this.handleClick}>
          Redirect!!!
        </button>
      </div>
    )
  }
}

export default App;

দয়া করে প্রতিক্রিয়া-রাউটারের সংস্করণটি লিখুন
অ্যাশ

19

ES6 + প্রতিক্রিয়া উপাদানগুলির জন্য, নিম্নলিখিত সমাধানটি আমার পক্ষে কাজ করেছিল।

আমি ফিলিপ স্কিনারকে অনুসরণ করেছিলাম, তবে আমার মতো নতুনদের সাহায্য করার জন্য সমাধানের শেষের যোগ করেছি।

নীচে আমি ব্যবহার করা সংস্করণ রয়েছে:

"প্রতিক্রিয়া-রাউটার": "^ 2.7.0"

"প্রতিক্রিয়া": "^ 15.3.1"

নীচে আমার প্রতিক্রিয়া উপাদানটি যেখানে আমি প্রতিক্রিয়া-রাউটার ব্যবহার করে প্রোগ্রাম্যাটিক নেভিগেশন ব্যবহার করেছি:

import React from 'react';

class loginComp extends React.Component {
   constructor( context) {
    super(context);
    this.state = {
      uname: '',
      pwd: ''
    };
  }

  redirectToMainPage(){
        this.context.router.replace('/home');
  }

  render(){
    return <div>
           // skipping html code 
             <button onClick={this.redirectToMainPage.bind(this)}>Redirect</button>
    </div>;
  }
};

 loginComp.contextTypes = {
    router: React.PropTypes.object.isRequired
 }

 module.exports = loginComp;

নীচে আমার রাউটারের জন্য কনফিগারেশন রয়েছে:

 import { Router, Route, IndexRedirect, browserHistory } from 'react-router'

 render(<Router history={browserHistory}>
          <Route path='/' component={ParentComp}>
            <IndexRedirect to = "/login"/>
            <Route path='/login' component={LoginComp}/>
            <Route path='/home' component={HomeComp}/>
            <Route path='/repair' component={RepairJobComp} />
            <Route path='/service' component={ServiceJobComp} />
          </Route>
        </Router>, document.getElementById('root'));

19

সেরা পদ্ধতির নাও হতে পারে তবে ... রিঅ্যাক্ট-রাউটার ভি 4 ব্যবহার করে, নিম্নলিখিত টাইপস্ক্রিপ্ট কিছুটির জন্য ধারণা দিতে পারে।

নীচে রেন্ডার করা উপাদানগুলিতে যেমন LoginPage, routerবস্তুটি অ্যাক্সেসযোগ্য এবং কেবল কল callrouter.transitionTo('/homepage') জন্য করুন।

নেভিগেশন কোড নেওয়া হয়েছিল

"react-router": "^4.0.0-2", "react": "^15.3.1",

import Router from 'react-router/BrowserRouter';
import { History } from 'react-history/BrowserHistory';
import createHistory from 'history/createBrowserHistory';
const history = createHistory();

interface MatchWithPropsInterface {
  component: typeof React.Component,
  router: Router,
  history: History,
  exactly?: any,
  pattern: string
}

class MatchWithProps extends React.Component<MatchWithPropsInterface,any> {
  render() {
    return(
      <Match {...this.props} render={(matchProps) => (
             React.createElement(this.props.component, this.props)

        )}
       />
    )
  }
}

ReactDOM.render(
    <Router>
      {({ router }) => (
        <div>
          <MatchWithProps exactly pattern="/" component={LoginPage} router={router} history={history} />
          <MatchWithProps pattern="/login" component={LoginPage} router={router} history={history} />
          <MatchWithProps pattern="/homepage" component={HomePage} router={router} history={history} />
          <Miss component={NotFoundView} />
        </div>
      )}
    </Router>,

   document.getElementById('app')
);


1
আপনি কেন রাউটার এবং ব্রাউজারের ইতিহাস ব্যবহার করবেন না?
এরউইন মায়ার

1
@ আরউইন এপিআই ভি 4-তে আলাদা। এই github.com/ReactTraining/react-router/issues/3847 দেখুন ।
এমকিউ

1
@ এমকু আপনি বিক্রিয়া-রাউটার ভি 4 এর জন্য আপনার টাইপ স্ক্রিপ্ট ডিটিএস ফাইলটি কোথায় পেয়েছেন?
জামাতেজে

1
@ জ্যামতাহে আমার রিঅ্যাক্ট-রাউটার ভি 4 এর জন্য কোনও ধরণের সংজ্ঞা নেই
ম্যাকু

16

ইন প্রতিক্রিয়া-রাউটার V4 এবং ES6

আপনি ব্যবহার করতে পারেন withRouterএবং this.props.history.push

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

class Home extends Component {

    componentDidMount() {
        this.props.history.push('/redirect-to');
    }
}

export default withRouter(Home);

2
ইতিমধ্যে বেশ কয়েকটি অন্যান্য উত্তরে (শীর্ষ উত্তরের দৈর্ঘ্য সহ) উল্লেখ করা হয়েছে
জর্জ মাউয়ার

13

withRouterশ্রেণিভিত্তিক উপাদান ব্যবহার করতে , নীচের মতো কিছু চেষ্টা করুন। ব্যবহারের জন্য রফতানি বিবৃতি পরিবর্তন করতে ভুলবেন না withRouter:

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

class YourClass extends React.Component {
  yourFunction = () => {
    doSomeAsyncAction(() =>
      this.props.history.push('/other_location')
    )
  }

  render() {
    return (
      <div>
        <Form onSubmit={ this.yourFunction } />
      </div>
    )
  }
}

export default withRouter(YourClass);

11


জোসে আন্তোনিও পোস্তিগো এবং বেন হুইলারের
অভিনবত্বের পূর্ববর্তী উত্তরের ভিত্তিতে ? টাইপস্ক্রিপ্ট
এবং সজ্জা ব্যবহারকারী
বা স্থিতিশীল ব্যবহার লিখতে হয় সম্পত্তি / ক্ষেত্রের

import * as React from "react";
import Component = React.Component;
import { withRouter } from "react-router";

export interface INavigatorProps {
    router?: ReactRouter.History.History;
}

/**
 * Note: goes great with mobx 
 * @inject("something") @withRouter @observer
 */
@withRouter
export class Navigator extends Component<INavigatorProps, {}>{
    navigate: (to: string) => void;
    constructor(props: INavigatorProps) {
        super(props);
        let self = this;
        this.navigate = (to) => self.props.router.push(to);
    }
    render() {
        return (
            <ul>
                <li onClick={() => this.navigate("/home")}>
                    Home
                </li>
                <li onClick={() => this.navigate("/about")}>
                    About
                </li>
            </ul>
        )
    }
}

/**
 * Non decorated 
 */
export class Navigator2 extends Component<INavigatorProps, {}> {

    static contextTypes = {
        router: React.PropTypes.object.isRequired,
    };

    navigate: (to: string) => void;
    constructor(props: INavigatorProps, context: any) {
        super(props, context);
        let s = this;
        this.navigate = (to) =>
            s.context.router.push(to);
    }
    render() {
        return (
            <ul>
                <li onClick={() => this.navigate("/home")}>
                    Home
                </li>
                <li onClick={() => this.navigate("/about")}>
                    About
                </li>
            </ul>
        )
    }
}

আজ যে এনপিএম ইনস্টল করা আছে। "প্রতিক্রিয়া-রাউটার": "^ 3.0.0" এবং
"@ প্রকার / প্রতিক্রিয়া-রাউটার": "^ 2.0.41"


11

দিগন্তে প্রতিক্রিয়া-রাউটার ভি 4 সহ, এখন এটি করার একটি নতুন উপায় রয়েছে।

import { MemoryRouter, BrowserRouter } from 'react-router';

const navigator = global && global.navigator && global.navigator.userAgent;
const hasWindow = typeof window !== 'undefined';
const isBrowser = typeof navigator !== 'undefined' && navigator.indexOf('Node.js') === -1;
const Router = isBrowser ? BrowserRouter : MemoryRouter;

<Router location="/page-to-go-to"/>

রিএ্যাক্ট-লেগো এমন একটি অ্যাপ্লিকেশন যা দেখায় কীভাবে রিঅ্যাক্ট-রাউটার ব্যবহার / আপডেট করতে হয় এবং এতে অ্যাপ্লিকেশন নেভিগেট করে এমন কার্যকরী পরীক্ষার উদাহরণ অন্তর্ভুক্ত থাকে।


5
রেন্ডার ফাংশনটি থেকে নেভিগেট করার জন্য এটি দুর্দান্ত, যদিও আমি আশ্চর্য হয়েছি কীভাবে একটি লাইফসাইকেল হুক বা রিডুএক্সের মতো কিছু থেকে নেভিগেট করতে হয়?
রুবেন মার্টিনেজ জুনিয়র

11

বিক্রিয়া রাউটারে v4। আমি এই দুটি উপায় প্রোগ্রামগতভাবে রুট অনুসরণ করি।

1. this.props.history.push("/something/something")
2. this.props.history.replace("/something/something")

নাম্বার দুই

ইতিহাস স্ট্যাকের বর্তমান এন্ট্রি প্রতিস্থাপন করে

প্রপসে ইতিহাস পেতে আপনাকে নিজের উপাদানটি মোড়াতে হতে পারে

withRouter


ধন্যবাদ !! সেরা উত্তর
তাহা ফারুকী

9

আপনি যদি হ্যাশ বা ব্রাউজারের ইতিহাস ব্যবহার করেন তবে আপনি এটি করতে পারেন

hashHistory.push('/login');
browserHistory.push('/login');

2
hashHistory.push, অপরিজ্ঞাপিত সম্পত্তি "পুশ" পড়তে পারে না। এগুলি আপনি কোথা থেকে আমদানি করবেন?
আর্নুব

"রিএ্যাক্ট-রাউটার" থেকে import হ্যাশহিসটরি import আমদানি করুন; আপনি এটিকে শীর্ষে আমদানি করতে পারেন।
জামান আফজাল

আমি আমার কোড রিডেক্স সাগা ফাইল থেকে আপনার কোডের নমুনাটি ব্যবহার করছি, আপনি কীভাবে বলেছেন এবং এটি কীভাবে ব্যবহার করেন ঠিক তেমনভাবে আমদানি করে যাচ্ছি তবে আমি সেই টাইপরর পেতে থাকি।
আর্চনুব

8

বর্তমান প্রতিক্রিয়া সংস্করণ (15.3) দিয়ে this.props.history.push('/location');আমার পক্ষে কাজ করেছে তবে এটি নিম্নলিখিত সতর্কতাটি দেখিয়েছে:

browser.js: 49 সতর্কতা: [প্রতিক্রিয়া-রাউটার] props.historyএবং context.historyহ্রাস করা হয়েছে। দয়া করে ব্যবহার করুন context.router

এবং আমি এটি এর context.routerমতো ব্যবহার করে এটি সমাধান করেছি :

import React from 'react';

class MyComponent extends React.Component {

    constructor(props) {
        super(props);
        this.backPressed = this.backPressed.bind(this);
    }

    backPressed() {
        this.context.router.push('/back-location');
    }

    ...
}

MyComponent.contextTypes = {
    router: React.PropTypes.object.isRequired
};

export default MyComponent;

1
এটি ভি 4 এর জন্য কাজ করছে। আচ্ছা ... বন্ধ ... এটি আসলে এটিরকম হওয়া দরকার .c কন্টেক্সট.রোটার হিস্টরি.পুশ ('/ পিছনে অবস্থান');
velohomme

7

প্রতিক্রিয়া-রাউটার ভি 4

আপনি যদি সংস্করণ 4 ব্যবহার করছেন তবে আপনি আমার লাইব্রেরি (লজ্জাবিহীন প্লাগ) ব্যবহার করতে পারেন যেখানে আপনি কেবল কোনও ক্রিয়া প্রেরণ করেন এবং সবকিছু ঠিক কাজ করে!

dispatch(navigateTo("/aboutUs"));

trippler


5

যারা এটিকে বাস্তবায়নের ক্ষেত্রে সমস্যায় পড়ছেন তারা প্রতিক্রিয়া-রাউটার ভি 4 এ।

রিডাক্স ক্রিয়া থেকে প্রতিক্রিয়া অ্যাপের মাধ্যমে নেভিগেট করার জন্য এখানে একটি কার্যকারী সমাধান রয়েছে।

history.js

import createHistory from 'history/createBrowserHistory'

export default createHistory()

App.js / Route.jsx

import { Router, Route } from 'react-router-dom'
import history from './history'
...
<Router history={history}>
 <Route path="/test" component={Test}/>
</Router>

another_file.js বা রিডেক্স ফাইল

import history from './history' 

history.push('/test') // this should change the url and re-render Test component

এই মন্তব্যে সমস্ত ধন্যবাদ: প্রতিক্রিয়া ট্রেনিং মন্তব্যসমূহ


4

যদি রিঅ্যাক্ট -রাউটার- রিডাক্সের মাধ্যমে আরআর 4 ডাব্লু / রিডুএক্স যুক্ত করতে হয় তবে এর থেকে রাউটিং অ্যাকশন নির্মাতাদেরও ব্যবহার করুন react-router-reduxবিকল্প।

import { push, replace, ... } from 'react-router-redux'

class WrappedComponent extends React.Component {
  handleRedirect(url, replaceState = true) { 
    replaceState 
      ? this.props.dispatch(replace(url)) 
      : this.props.dispatch(push(url)) 
  }
  render() { ... }
}

export default connect(null)(WrappedComponent)

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


1
react-router-reduxএকটি দীর্ঘ সময়ের জন্য অবচিত / আর্কাইভ করা হয়েছে
অলিগোফ্রেন

4

আপনি useHistoryরাজ্যহীন উপাদানটিতে হুকটিও ব্যবহার করতে পারেন । দস্তাবেজ থেকে উদাহরণ।

import { useHistory } from "react-router"

function HomeButton() {
  const history = useHistory()

  return (
    <button type="button" onClick={() => history.push("/home")}>
      Go home
    </button>
  )
}

দ্রষ্টব্য: হুকগুলি এতে যুক্ত react-router@5.1.0এবং প্রয়োজনীয় ছিলreact@>=16.8


1
শুভ কল, আপনি কি প্রতিক্রিয়া-রাউটারের সংস্করণটি উল্লেখ করতে পারেন এবং এর সাথে প্রতিক্রিয়া দেখায়? এটি একটি নতুন পরিবর্তন যা সর্বদা উপলভ্য ছিল না
জর্জ মাউর

3

লেখার সময় সঠিক উত্তরটি আমার কাছে ছিল

this.context.router.history.push('/');

তবে আপনাকে নিজের উপাদানগুলিতে প্রোপটাইপগুলি যুক্ত করতে হবে

Header.contextTypes = {
  router: PropTypes.object.isRequired
}
export default Header;

প্রোপটাইপগুলি আমদানি করতে ভুলবেন না

import PropTypes from 'prop-types';

দয়া করে প্রতিক্রিয়া-রাউটারের সংস্করণটি লিখুন এবং আপনি কী প্রতিক্রিয়া রাউটার থেকে আমদানি করেছেন
অ্যাশ

আমদানির জন্য কিছুই নেই এবং এটি সংস্করণটি "প্রতিক্রিয়া-রাউটার": "^ 4.2.0"
ওয়েবমাস্টার

3

সম্ভবত সেরা সমাধান না হলেও এটি কাজটি করে:

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

// create functional component Post
export default Post = () => (
    <div className="component post">

        <button className="button delete-post" onClick={() => {
            // ... delete post
            // then redirect, without page reload, by triggering a hidden Link
            document.querySelector('.trigger.go-home').click();
        }}>Delete Post</button>

        <Link to="/" className="trigger go-home hidden"></Link>

    </div>
);

মূলত, একটি ক্রিয়ায় আবদ্ধ একটি যুক্তি (এই ক্ষেত্রে একটি পোস্ট মুছে ফেলা) পুনঃনির্দেশের জন্য ট্রিগার কল করবে। এটি আদর্শ নয় কারণ আপনি আপনার মার্কআপে একটি ডোম নোড 'ট্রিগার' যুক্ত করবেন যাতে প্রয়োজনের সময় আপনি সহজেই এটিকে কল করতে পারেন। এছাড়াও, আপনি সরাসরি ডওমের সাথে আলাপচারিতা করবেন, যা প্রতিক্রিয়া উপাদানগুলির মধ্যে পছন্দসই নয়।

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


আপনি কখনই গ্রহণযোগ্য সমাধানের মাধ্যমে এটি ব্যবহার করবেন তা ব্যাখ্যা করতে পারেন?
জর্জ

এটি কেবল আলোচিত সমস্যার বিকল্প সমাধান। যেমন ইতিমধ্যে বলা হয়েছে, আদর্শ নয় তবে এটি প্রোগ্রাম্যাটিক পুনঃনির্দেশগুলির জন্য ঠিক কাজ করে।
neatsu

2

এটি আমার পক্ষে কাজ করেছে, বিশেষ কোনও আমদানির দরকার নেই:

<input 
  type="button" 
  name="back" 
  id="back" 
  class="btn btn-primary" 
  value="Back" 
  onClick={() => { this.props.history.goBack() }} 
/>

অবশ্যই এই বিশেষ আমদানির প্রয়োজন - আপনার উপাদান আছে না historyযোগ করা propsনিজে মাত্র। এটি এমন একটি এইচওসি থেকে আসে যা আপনাকে ব্যবহারের জন্য আমদানি করতে হবে (সরাসরি প্রেরিত উপাদানগুলি Routeস্বয়ংক্রিয়ভাবে সেই হওক দ্বারা আবৃত হয়ে যায় তবে তার জন্য আপনার একটি আমদানি প্রয়োজন Route...)
জর্জ মাউয়ার

2

পরিবর্তে হুকরোউটার ব্যবহার করুন, প্রতিক্রিয়া রাউটারের আধুনিক বিকল্প

https://www.npmjs.com/package/hookrouter

import { useRoutes, usePath, A} from "hookrouter";

নির্বাচন বাক্সের সাথে লিঙ্কিং সম্পর্কিত ওপি প্রশ্নের উত্তর দেওয়ার জন্য আপনি এটি করতে পারেন:

navigate('/about');

অবগতির জন্য। লেখক নিজেই এই গ্রন্থাগারটিকে "ধারণার প্রমাণ" হিসাবে অভিহিত করেছেন এবং এটির প্রায় এক বছর ধরে (জুন 2019) কোনও কার্যক্রম ছিল না।
মেমার্ক

@ মেমার্ক এর কারণ এটি ইতিমধ্যে নিখুঁত
স্টেফানবোজ

ঠিক আছে, 38 টি ওপেন ইস্যুগুলি একসাথে সত্যতা অনুসারে সংস্করণ ২.০ সম্পূর্ণ পুনরায় লেখা হবে, অন্যথায় বলে।
এমেমার্ক

1

প্রতিক্রিয়া রাউটার ভি 4 + এর জন্য

ধরে নিই যে প্রাথমিক রেন্ডার চলাকালীন আপনাকে নিজে নেভিগেট করার দরকার হবে না (যার জন্য আপনি <Redirect>উপাদান ব্যবহার করতে পারেন ), আমরা আমাদের অ্যাপ্লিকেশনটিতে এটি করছি।

একটি শূন্য রুট নির্ধারণ করুন যা শূন্য ফিরে আসে, এটি আপনাকে ইতিহাসের অবজেক্টে অ্যাক্সেস পেতে দেয়। আপনার শীর্ষ স্তরে এটি করা দরকার যেখানে আপনারRouter সংজ্ঞায়িত এটি হবে।

এখন আপনি সব বিষয় আছে যা করা যাবে কি করতে পারেন ইতিহাস মত history.push(), history.replace(), history.go(-1)ইত্যাদি!

import React from 'react';
import { HashRouter, Route } from 'react-router-dom';

let routeHistory = null;

export function navigateTo(path) {
  if(routeHistory !== null) {
    routeHistory.push(path);
  }
}

export default function App(props) {
  return (
    <HashRouter hashType="noslash">
      <Route
        render={({ history }) => {
          routeHistory = history;
          return null;
        }}
      />
      {/* Rest of the App */}
    </HashRouter>
  );
}

1

প্রতিক্রিয়া-রাউটার-ডোম: 5.1.2

  • এই সাইটটিতে 3 টি পৃষ্ঠা রয়েছে, যার সবগুলিই ব্রাউজারে গতিশীলভাবে রেন্ডার করা হয়।

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

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

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



export default function BasicExample() {
  return (
    <Router>
      <div>
        <ul>
          <li>
            <Link to="/">Home</Link>
          </li>
          <li>
            <Link to="/about">About</Link>
          </li>
          <li>
            <Link to="/dashboard">Dashboard</Link>
          </li>
        </ul>

        <hr />

        <Switch>
          <Route exact path="/">
            <Home />
          </Route>
          <Route path="/about">
            <About />
          </Route>
          <Route path="/dashboard">
            <Dashboard />
          </Route>
        </Switch>
      </div>
    </Router>
  );
}

// You can think of these components as "pages"
// in your app.

function Home() {
  return (
    <div>
      <h2>Home</h2>
    </div>
  );
}

function About() {
  return (
    <div>
      <h2>About</h2>
    </div>
  );
}

function Dashboard() {
  return (
    <div>
      <h2>Dashboard</h2>
    </div>
  );
}```

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

এটি মার্কআপ দিয়ে নয়, জরুরী জেএস থেকে প্রোগ্রামগতভাবে কীভাবে করা যায় সেই প্রশ্নেরও উত্তর দেয় না।
জর্জ মাউয়ার

1

সুতরাং আমার উত্তরে প্রোগ্রামে কোনও রুটে পুনঃনির্দেশ করার জন্য 3 টি ভিন্ন উপায় রয়েছে। কিছু সমাধান ইতিমধ্যে উপস্থাপন করা হয়েছে তবে নিম্নলিখিতগুলি কেবল কার্যকরী উপাদানগুলির জন্য ফোকাস করেছে অতিরিক্ত ডেমো অ্যাপ্লিকেশন সহ করে।

নিম্নলিখিত সংস্করণ ব্যবহার করে:

প্রতিক্রিয়া: 16.13.1

প্রতিক্রিয়া-ডোম: 16.13.1

প্রতিক্রিয়া-রাউটার: 5.2.0

প্রতিক্রিয়া-রাউটার-ডোম: 5.2.0

ধরণ: 3.7.2

কনফিগারেশন:

সুতরাং প্রথমে সমাধানটি HashRouterনিম্নরূপে কনফিগার করা হচ্ছে:

<HashRouter>
    // ... buttons for redirect

    <Switch>
      <Route exact path="/(|home)" children={Home} />
      <Route exact path="/usehistory" children={UseHistoryResult} />
      <Route exact path="/withrouter" children={WithRouterResult} />
      <Route exact path="/redirectpush" children={RedirectPushResult} />
      <Route children={Home} />
    </Switch>
</HashRouter>

সম্পর্কে ডকুমেন্টেশন থেকে <HashRouter>:

আপনার URL টি ইউআরএল-এর সাথে সিঙ্ক রাখতে <Router>URL এর হ্যাশ অংশটি ব্যবহার করে (যেমন window.location.hash) A

সলিউশন:

  1. ব্যবহার <Redirect>ব্যবহার ধাক্কা useState:

ফাংশনাল উপাদান ব্যবহার করে ( RedirectPushActionআমার সংগ্রহশালা থেকে উপাদান) আমরা useStateপুনঃনির্দেশ পরিচালনা করতে ব্যবহার করতে পারি । কৌশলযুক্ত অংশটি একবারে পুনঃনির্দেশটি ঘটে গেলে আমাদের redirectরাষ্ট্রটিকে আবার সেট করতে হবে false। দেরি setTimeOutসহ ব্যবহার করে 0আমরা প্রতিক্রিয়া স্বীকার না করা পর্যন্ত অপেক্ষা করছিRedirect DOM এ দেয় তারপরে পরবর্তী সময় ব্যবহারের জন্য বোতামটি ফিরে পেয়ে যায়।

দয়া করে নীচে আমার উদাহরণটি সন্ধান করুন:

const [redirect, setRedirect] = useState(false);
const handleRedirect = useCallback(() => {
    let render = null;
    if (redirect) {
        render = <Redirect to="/redirectpush" push={true} />

        // in order wait until commiting to the DOM
        // and get back the button for clicking next time
        setTimeout(() => setRedirect(false), 0);
    }
    return render;
}, [redirect]);

return <>
    {handleRedirect()}
    <button onClick={() => setRedirect(true)}>
        Redirect push
    </button>
</>

<Redirect>ডকুমেন্টেশন থেকে :

একটি রেন্ডারিং একটি <Redirect>নতুন স্থানে নেভিগেট করবে। নতুন অবস্থান ইতিহাসের স্ট্যাকের বর্তমান অবস্থানটিকে ওভাররাইড করবে যেমন সার্ভার-সাইড রিডাইরেক্টস (এইচটিটিপি 3xx) করবে।

  1. useHistoryহুক ব্যবহার :

আমার সমাধানে একটি উপাদান বলা হয় UseHistoryActionযা নিম্নলিখিতগুলি উপস্থাপন করে:

let history = useHistory();

return <button onClick={() => { history.push('/usehistory') }}>
    useHistory redirect
</button>

useHistoryহুক আমাদের ইতিহাস বস্তুর যা আমাদের প্রোগ্রামের মাধ্যমে নেভিগেট বা পরিবর্তন যাত্রাপথ সাহায্য করে অ্যাক্সেস দেয়।

  1. ব্যবহার করে withRouter, এগুলি historyথেকে পান props:

নামে পরিচিত একটি উপাদান তৈরি করা হয়েছে WithRouterAction, নীচের মত প্রদর্শন করে:

const WithRouterAction = (props:any) => {
    const { history } = props;

    return <button onClick={() => { history.push('/withrouter') }}>
        withRouter redirect
    </button>
}

export default withRouter(WithRouterAction);

withRouterডকুমেন্টেশন থেকে পড়া :

আপনি উচ্চতর অর্ডার উপাদানটির মাধ্যমে historyঅবজেক্টের বৈশিষ্ট্য এবং নিকটতমের <Route>ম্যাচে অ্যাক্সেস পেতে পারেন withRouterwithRouterআপডেট হওয়া match, locationএবং historyমোড়ানো উপাদানগুলিতে প্রপসগুলি যখনই রেন্ডার করে pass

ডেমো:

আরও ভাল উপস্থাপনের জন্য আমি এই উদাহরণগুলির সাথে একটি গিটহাবের সংগ্রহশালা তৈরি করেছি, দয়া করে নীচে এটি সন্ধান করুন:

https://github.com/norbitrial/react-router-programmatically-redirect-examples

আশা করি এটা কাজে লাগবে!

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