কীভাবে প্রতিক্রিয়া-রাউটার ভি 4 এ ইতিহাস পাবেন?


106

আমার প্রতিক্রিয়া-রাউটার v3 থেকে v4 এ স্থানান্তরিত করতে কিছুটা সমস্যা হয়েছে। v3 এ আমি যে কোনও জায়গায় এটি করতে সক্ষম হয়েছিল:

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

আমি কীভাবে এটি ভি 4 এ অর্জন করব।

আমি জানি যে আমি এই ব্যবহার করতে পারি withRouter আপনি যখন কোনও কম্পোনেন্টে থাকবেন তখন , প্রতিক্রিয়া প্রসঙ্গে বা ইভেন্ট রাউটার প্রপস। তবে আমার ক্ষেত্রে তা হয় না।

আমি সমানতা খোঁজ করছি NavigatingOutsideOfComponents V4 মধ্যে


4
ধন্যবাদ @ ক্রিস, তবে আমি যেমন বলেছিলাম, আমি কম্পোনেন্টে নেই।
طوفان_বাস্টার

@ ক্রিস কোনও ইউটিলিটি ক্লাসে, দয়া করে github.com/ReactTraining/react-router/blob/master/docs/guides/… দেখুন , এটি একটি রেডুয়াক্স মিডলওয়্যার বা অন্য কিছু হতে পারে
ঝড়_ব্লাস্টার


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

উত্তর:


184

আপনার কেবল এমন একটি মডিউল থাকা দরকার যা কোনও historyবস্তু রফতানি করে । তারপরে আপনি এই প্রকল্পটি আপনার প্রকল্প জুড়ে আমদানি করবেন।

// history.js
import { createBrowserHistory } from 'history'

export default createBrowserHistory({
  /* pass a configuration object here if needed */
})

তারপরে, বিল্ট-ইন রাউটারগুলির মধ্যে একটি ব্যবহার করার পরিবর্তে আপনি <Router>উপাদানটি ব্যবহার করবেন ।

// index.js
import { Router } from 'react-router-dom'
import history from './history'
import App from './App'

ReactDOM.render((
  <Router history={history}>
    <App />
  </Router>
), holder)
// some-other-file.js
import history from './history'
history.push('/go-here')

4
অনেক ধন্যবাদ! এই মুহুর্তে, রিএ্যাক্ট-রাউটার 4 ব্যবহার করে আমাকে এই আমদানিটি ইতিহাসের পরিবর্তে ব্যবহার করতে হয়েছিল।
পিটার.বার্টোজ

4
আমি যখন
নাথ পাইভা

4
আমরা ইতিহাসের সাহায্যে ব্যবহার করতে পারি এবং পৃথক ফাইল তৈরির পরিবর্তে প্রপসগুলিতে ইতিহাস পেতে পারি। এই সমাধানটি আমার সাথে রিডুএক্সের সাথে কাজ করে না।
জিল শাহ

4
createHashHistoryআপনি যদি ব্যবহার করছিলেন তবে আমদানি করুন HashRouter
ডেভিড হার্কনেস

4
@ হাসানআজাম আপনি সম্ভবত রিঅ্যাক্ট-রাউটার ভি 5 ব্যবহার করছেন এবং এই উত্তরটি ভি 5 এর জন্য নয়, ভ 4 এর পক্ষে কাজ করে। আমার এখনই একই চ্যালেঞ্জ রয়েছে এবং আমি সর্বত্র খুঁজছি, তবে এটি কার্যকর করতে অক্ষম। ইতিহাস.পরিষ্কারের বাইরে কাজ করে, তবে লিঙ্কে ক্লিকগুলি আর হয় না।
Waterlink

73

এইটা কাজ করে! https://reacttraining.com/react-router/web/api/withRouter

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

class MyComponent extends React.Component {
  render () {
    this.props.history;
  }
}

withRouter(MyComponent);

27
যতক্ষণ আপনি একটি উপাদান হয়। আমি কোনও উপাদানটিতে নেই
طوفان_বাস্টার

4
আপনাকে ধন্যবাদ, এটি কোনও উপাদান থেকে অন্য রুটের সাথে লিঙ্ক করার সহজতম এবং সর্বাধিক সহজ উপায়। আমি কেবল এটি যুক্ত করব যে this.props.history.push('/some_route');এটি কাজ করার জন্য আপনার প্রয়োজন ।
dannytenaglias

4
@ স্টর্ম_বাস্টার const Component = props => {... // stuff}এবং export default withRouter(Component)একটি রাষ্ট্রহীন উপাদান নিয়ে আমার জন্য কাজ করে
কার্ল টেলর

11

আপনি যা করতে পারতেন তা গ্রহণযোগ্য উত্তরের সিমিলিরি ব্যবহার is react এবং react-routerনিজেই আপনি প্রদান করতেhistory আপত্তি, যেগুলো তোমরা ও একটি ফাইলে সুযোগ তারপর রপ্তানি করতে পারেন।

ইতিহাস.js

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

// variable which will point to react-router history
let globalHistory = null;

// component which we will mount on top of the app
class Spy extends React.Component {
  constructor(props) {
    super(props)
    globalHistory = props.history; 
  }

  componentDidUpdate() {
    globalHistory = this.props.history;
  }

  render(){
    return null;
  }
}

export const GlobalHistory = withRouter(Spy);

// export react-router history
export default function getHistory() {    
  return globalHistory;
}

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

import { BrowserRouter } from 'react-router-dom';
import { GlobalHistory } from './history';

function render() {
  ReactDOM.render(
    <BrowserRouter>
        <div>
            <GlobalHistory />
            //.....
        </div>
    </BrowserRouter>
    document.getElementById('app'),
  );
}

এবং তারপরে আপনি যখন আপনার অ্যাপ্লিকেশনটি মাউন্ট হয়ে গেছেন তখন তা কেবল আমদানি করতে পারেন:

import getHistory from './history'; 

export const goToPage = () => (dispatch) => {
  dispatch({ type: GO_TO_SUCCESS_PAGE });
  getHistory().push('/success'); // at this point component probably has been mounted and we can safely get `history`
};

আমি এমনকি এনএমপি প্যাকেজ তৈরি করেছিলাম যা কেবল এটি করে।


রিট্যাক্স ১ re.৯ হিসাবে, এই দ্রবণটি কম্পোনেন্টউইলমাউন্ট এবং উপাদানবিট্রিলিপিসিপ্রসগুলিতে অবমূল্যায়নের সতর্কতাটি ছুঁড়ে দেবে।
আইয়ান

4
@ সত্য সত্য, এটি স্থির করেছেন
টমাসজ মুলারসিজিক

5

আপনি যদি রিডেক্স এবং রিডেক্স-থাঙ্ক ব্যবহার করছেন তবে সলিউশন সলিউশনটি রিঅ্যাক্ট -রাউটার-রিডেক্স ব্যবহার করবে

// then, in redux actions for example
import { push } from 'react-router-redux'

dispatch(push('/some/path'))

কিছু কনফিগারেশন করার জন্য ডক্সটি দেখা গুরুত্বপূর্ণ।


4
আমি এই সঠিক সমাধানটি
সন্ধানের

5

এই উত্তরটির উপর ঝাঁকুনি যদি আপনার কেবল অন্য উপাদানটিতে নেভিগেট করার জন্য ইতিহাসের অবজেক্টের প্রয়োজন হয়:

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>
  );
}

ভুল, আপনি একটি উপাদান মধ্যে। স্বীকৃত উত্তর থেকে // কিছু-অন্য-ফাইল.জেএস দেখুন
طوفان_বাস্টার

0

App.js এ

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

 const TheContext = React.createContext(null);

 const App = () => {
   const history = useHistory();

   <TheContext.Provider value={{ history, user }}>

    <Switch>
        <Route exact path="/" render={(props) => <Home {...props} />} />
        <Route
          exact
          path="/sign-up"
          render={(props) => <SignUp {...props} setUser={setUser} />}
        /> ...

তারপরে একটি শিশু উপাদান:

const Welcome = () => {
    
    const {user, history} = React.useContext(TheContext); 
    ....

-2

সুনির্দিষ্ট ক্ষেত্রে react-routerব্যবহার contextকরা একটি বৈধ কেস দৃশ্যের উদাহরণস্বরূপ

class MyComponent extends React.Component {
  props: PropsType;

  static contextTypes = {
    router: PropTypes.object
  };

  render () {
    this.context.router;
  }
}

আপনি রাউটার প্রসঙ্গে যেমন ইতিহাসের কোনও উদাহরণ অ্যাক্সেস করতে পারেন, যেমন this.context.router.history


বিশেষত প্রশ্নটি যখন কোনও উপাদানটির বাইরে রয়েছে তখন এটি সম্পর্কে প্রশ্ন করা হচ্ছে যাতে এই বিকল্পটি বিকল্প হিসাবে উপলভ্য নয়:> "আমি জানি যে আমি কোনও অংশে থাকাকালীন রৌটার, প্রতিক্রিয়ার প্রতিক্রিয়া বা ইভেন্ট রাউটার প্রপসটি ব্যবহার করতে পারি but এটা আমার পক্ষে হয় না। "
সানশিনিডোল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.