প্রতিক্রিয়া-রাউটার: কীভাবে লিঙ্কটিকে ম্যানুয়ালি আহ্বান করবেন?


131

আমি রিএ্যাকটিজেএস এবং প্রতিক্রিয়া-রাউটারে নতুন। আমার কাছে এমন একটি উপাদান রয়েছে যা প্রোপসের মাধ্যমে রিঅ্যাক্ট -রাউটার<Link/> থেকে কোনও বস্তু গ্রহণ করে । যখনই ব্যবহারকারী এই উপাদানটির ভিতরে একটি 'পরবর্তী' বোতামে ক্লিক করেন আমি নিজেই বস্তুটি আহ্বান করতে চাই ।<Link/>

এখনই, আমি ব্যাকিং ইনস্ট্যান্স অ্যাক্সেস করতে রেফ ব্যবহার করছি এবং ম্যানুয়ালি জেনারেট হওয়া 'এ' ট্যাগটিতে ক্লিক করছি ।<Link/>

প্রশ্ন: লিঙ্কটিকে ম্যানুয়ালি আহ্বান করার কোনও উপায় আছে (উদাহরণস্বরূপ this.props.next.go)?

এটি আমার কাছে বর্তমান কোড:

//in MasterPage.js
var sampleLink = <Link to="/sample">Go To Sample</Link>
<Document next={sampleLink} />

//in Document.js
...
var Document = React.createClass({
   _onClickNext: function() {
      var next = this.refs.next.getDOMNode();
      next.querySelectorAll('a').item(0).click(); //this sounds like hack to me
   },
   render: function() {
      return (
         ...
         <div ref="next">{this.props.next} <img src="rightArrow.png" onClick={this._onClickNext}/></div>
         ...
      );
   }
});
...

এই কোডটি আমি রাখতে চাই:

//in MasterPage.js
var sampleLink = <Link to="/sample">Go To Sample</Link>
<Document next={sampleLink} />

//in Document.js
...
var Document = React.createClass({
   render: function() {
      return (
         ...
         <div onClick={this.props.next.go}>{this.props.next.label} <img src="rightArrow.png" /> </div>
         ...
      );
   }
});
...

উত্তর:


198

প্রতিক্রিয়া রাউটার ভি 4 - পুনঃনির্দেশ উপাদান (2017/04/15 আপডেট হয়েছে)

ভি 4-র প্রস্তাবিত উপায় হ'ল আপনার রেন্ডার পদ্ধতির পুনর্নির্দেশকে ধরতে দেওয়া। পুনঃনির্দেশিত উপাদানটি দেখানো দরকার কিনা তা নির্ধারণের জন্য রাষ্ট্র বা প্রপস ব্যবহার করুন (যা তখন ট্রিগার একটি পুনর্নির্দেশের)।

import { Redirect } from 'react-router';

// ... your class implementation

handleOnClick = () => {
  // some action...
  // then redirect
  this.setState({redirect: true});
}

render() {
  if (this.state.redirect) {
    return <Redirect push to="/sample" />;
  }

  return <button onClick={this.handleOnClick} type="button">Button</button>;
}

তথ্যসূত্র: https://reacttraining.com/react-router/web/api/Redirect

প্রতিক্রিয়া রাউটার v4 - রেফারেন্স রাউটার প্রসঙ্গ

Routerপ্রতিক্রিয়া উপাদানটির সংস্পর্শে থাকা আপনার প্রসঙ্গেরও আপনি সুবিধা নিতে পারেন ।

static contextTypes = {
  router: PropTypes.shape({
    history: PropTypes.shape({
      push: PropTypes.func.isRequired,
      replace: PropTypes.func.isRequired
    }).isRequired,
    staticContext: PropTypes.object
  }).isRequired
};

handleOnClick = () => {
  this.context.router.push('/sample');
}

এই <Redirect />ফণা অধীনে কাজ করে।

তথ্যসূত্র: https://github.com/ReactTraining/react-router/blob/master/packages/react-router/modules/Redirect.js#L46,L60

প্রতিক্রিয়া রাউটার v4 - বাহ্যিকভাবে মিউটেট ইতিহাসের বিষয়

আপনার যদি এখনও ভি 2 এর বাস্তবায়নের অনুরূপ কিছু করার দরকার হয় তবে আপনি এর অনুলিপিটি এক্সপোর্টযোগ্য ধ্রুবক হিসাবে BrowserRouterপ্রকাশ করতে পারেন history। নীচে একটি মৌলিক উদাহরণ দেওয়া আছে তবে আপনি প্রয়োজনে এটি কাস্টমাইজযোগ্য প্রস দিয়ে ইনজেক্ট করতে এটি রচনা করতে পারেন। লাইফসাইকেলের সাথে উল্লেখযোগ্য ক্যাভ্যাট রয়েছে, তবে এটি সর্বদা রাউটারকে রেন্ডার করা উচিত, ঠিক যেমন v2 এর মতো। এটি কোনও ক্রিয়া ফাংশন থেকে একটি API অনুরোধের পরে পুনঃনির্দেশগুলির জন্য দরকারী হতে পারে।

// browser router file...
import createHistory from 'history/createBrowserHistory';
import { Router } from 'react-router';

export const history = createHistory();

export default class BrowserRouter extends Component {
  render() {
    return <Router history={history} children={this.props.children} />
  }
}

// your main file...
import BrowserRouter from './relative/path/to/BrowserRouter';
import { render } from 'react-dom';

render(
  <BrowserRouter>
    <App/>
  </BrowserRouter>
);

// some file... where you don't have React instance references
import { history } from './relative/path/to/BrowserRouter';

history.push('/sample');

সর্বশেষ BrowserRouterপ্রসারিত: https://github.com/ReactTraining/react-router/blob/master/packages/react-router-dom/modules/BrowserRouter.js

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

browserHistoryউদাহরণটিতে একটি নতুন রাষ্ট্র চাপুন:

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

তথ্যসূত্র: https://github.com/reactjs/react-router/blob/master/docs/guides/NavigatingO outideOfCompferences.md


7
hashHistory.push ( '/ নমুনা'); আপনি যদি ব্রাউজারের পরিবর্তে হ্যাশ ইতিহাস ব্যবহার করছেন ইতিহাস
সনথ_পি

1
এটি উপাদান-ইউআই লাইব্রেরিতে বিশেষত উপকারী যেমন
এলিমেট

2
পুনঃনির্দেশ বিকল্পের সাথে নোট করুন আপনাকে অবশ্যই ধাক্কা নির্দিষ্ট করতে হবে (যেমন <পুনঃনির্দেশ পুশ />)। ডিফল্টরূপে এটি এমন একটি প্রতিস্থাপন করবে যা ম্যানুয়ালি কোনও লিঙ্কের অনুরোধ করার মতো নয়
aw04

1
@ জোকাব আপনি <লিঙ্ক /> গিথুব
ম্যাট লো

1
পুনঃনির্দেশ আমার পক্ষে কাজ করছে না, তবে রাউটারের সাথে aw04 সমাধান আরও সহজ এবং কাজ করছে
স্ট্যাকডেভ

90

প্রতিক্রিয়া রাউটার 4 একটি অন্তর্ভুক্ত withRouter পরিকল্পিত যাতে আপনি অ্যাক্সেস দেয় historyমাধ্যমে বস্তুর this.props:

import React, {Component} from 'react'
import {withRouter} from 'react-router-dom'

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

    this.goHome = this.goHome.bind(this)
  }

  goHome() {
    this.props.history.push('/')
  }

  render() {
    <div className="foo">
      <button onClick={this.goHome} />
    </div>
  }
}

export default withRouter(Foo)

9
এটি আমার পক্ষে কাজ করেছে এবং এটি দেখতে সবচেয়ে সহজ সমাধান বলে মনে হচ্ছে।
রুবিকুট

5
এটিই সেরা সমাধান। কেন এত কম ভোট আছে আমি তা বুঝতে পারি না।
বেনোইট

1
হ্যাঁ, আপনি কয়েকবার লিঙ্কে ক্লিক করতে পারেন এবং ব্রাউজার পিছনে কাজ করবে না। সত্যিই ফিরে যেতে আপনাকে কয়েকবার ব্রাউজারে ক্লিক করতে হবে
ভ্লাদিস্লাভ টেরশায়ান

@ ভ্ল্যাডিস্লাভ টেরশায়ান আপনি কিছু শর্তযুক্ত যুক্তি যুক্ত করতে পারেন: যদি (এটি (এই.প্রপস.লোকেশন.প্যাথনাম + এটি.প্রোপস.লোকেশন.সর্চ)! == নেভিগেট টোপ্যাথ) {...}
ম্যাটওয়াইলার

15

ইন সংস্করণ 5.x , আপনি ব্যবহার করতে পারেন useHistoryএর হুক react-router-dom:

// Sample extracted from https://reacttraining.com/react-router/core/api/Hooks/usehistory
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>
  );
}

এটিই সেরা সমাধান। আপনি যদি কিছু শর্তযুক্ত যুক্তি যুক্ত করেন তবে কোনও ব্যবহারকারী একই বোতামটি একাধিকবার ক্লিক করলে আপনি ইতিহাসে সদৃশ এন্ট্রিগুলি এড়াতে পারবেন:if ((routerHistory.location.pathname + routerHistory.location.search) !== navigateToPath) { routerHistory.push(navigateToPath); }
ম্যাটওয়েলার

আমার historyপরিবর্তনশীল ঘোষণার দরকার ছিল , ডিরেক্টরি useHistory().push
চালনার

এটি সর্বাধিক আধুনিক প্রতিক্রিয়া-ইশ্মির সমাধান বলে মনে হচ্ছে।
ইয়াংজে

8

https://github.com/rackt/react-router/blob/bf89168acb30b6dc9b0244360bcbac5081cf6b38/examples/transitions/app.js#L50

অথবা আপনি অন ক্লিক করে এটি প্রয়োগ করতে পারেন (আরও সহিংস সমাধান):

window.location.assign("/sample");

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

(তবে আপনার কাছে এখনও একটি ফাইলের একটি নির্দিষ্ট লাইনের লিঙ্ক রয়েছে)। আপনার উত্তরে নির্দিষ্ট পরামর্শ অন্তর্ভুক্ত করুন, এবং কেবল একটি লিঙ্ক নয়।
ওয়্যার্ডপ্রাইরি

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

আমার প্রতিক্রিয়াটির বাইরে বেশ কয়েকটি পৃষ্ঠাগুলি পরিচালনা করা হয়েছে (এফবি এবং গুগল পুনঃনির্দেশগুলির সাহায্যে লগইন স্ক্রিন) সুতরাং "ব্রাউজারহিসটরি.পশ ('/ হোম') থেকে এই পৃষ্ঠাগুলির জন্য ন্যাভিতে আমার এটির প্রয়োজন ছিল;" শুধুমাত্র ইউআরএল পরিবর্তন করেছে, এটি পৃষ্ঠাগুলি রুট করতে অক্ষম ছিল। ধন্যবাদ.
দেবোরাহ

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

2

ঠিক আছে, আমি মনে করি আমি এটির জন্য একটি উপযুক্ত সমাধান খুঁজতে সক্ষম হয়েছি।

এখন, নথিতে প্রোপ<Link/> হিসাবে প্রেরণের পরিবর্তে , আমি প্রেরণ করি যা প্রতিক্রিয়া-রাউটার লিঙ্কটির জন্য একটি কাস্টম মোড়ক। এটি করার মাধ্যমে, ডকুমেন্ট অবজেক্টের অভ্যন্তরে রাউটিং কোড থাকা এড়াতে আমি লিংক কাঠামোর অংশ হিসাবে ডান তীর রাখতে সক্ষম হয়েছি।<NextLink/>

আপডেট করা কোডটি নীচের মত দেখাচ্ছে:

//in NextLink.js
var React = require('react');
var Right = require('./Right');

var NextLink = React.createClass({
    propTypes: {
        link: React.PropTypes.node.isRequired
    },

    contextTypes: {
        transitionTo: React.PropTypes.func.isRequired
    },

    _onClickRight: function() {
        this.context.transitionTo(this.props.link.props.to);
    },

    render: function() {
        return (
            <div>
                {this.props.link}
                <Right onClick={this._onClickRight} />
            </div>  
        );
    }
});

module.exports = NextLink;

...
//in MasterPage.js
var sampleLink = <Link to="/sample">Go To Sample</Link>
var nextLink = <NextLink link={sampleLink} />
<Document next={nextLink} />

//in Document.js
...
var Document = React.createClass({
   render: function() {
      return (
         ...
         <div>{this.props.next}</div>
         ...
      );
   }
});
...

PS : আপনি যদি প্রতিক্রিয়া-রাউটারের সর্বশেষতম সংস্করণটি ব্যবহার করছেন তবে আপনার this.context.router.transitionToপরিবর্তে এটি ব্যবহারের প্রয়োজন হতে পারে this.context.transitionTo। এই কোডটি বিক্রিয়া-রাউটার সংস্করণ 0.12.X এর জন্য সূক্ষ্মভাবে কাজ করবে


2

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

আপনি ভি 4 তে প্রসঙ্গের মাধ্যমে সহজেই পুশ পদ্ধতিটি শুরু করতে পারেন:

this.context.router.push(this.props.exitPath);

যেখানে প্রসঙ্গ:

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

ব্যবহার করে BrowserRouter, আমার উপাদানগুলির কনটেক্সট অবজেক্টে কোনও routerঅবজেক্ট নেই। আমি কি কিছু ভুল করছি?
পিলাউ

আপনি কি উপাদানটিতে প্রসঙ্গটি সেট করছেন (উপরের দ্বিতীয় ব্লক)?
ক্রিস

চিমিং করার জন্য ধন্যবাদ! অবশেষে এই আমার জন্য কাজ: router: React.PropTypes.object.isRequiredisRequiredচাবি ছাড়া কেন এটি কাজ করল না জানি না । এছাড়াও, প্রসঙ্গটি <Link>পেতে সক্ষম হতে পারে বলে মনে হচ্ছে history, তবে আমি এটির অনুলিপি করতে পারি নি।
পিলাউ

মজাদার একটি - আপনি যদি কোনও কোডেন রাখেন তবে আপনি আটকে থাকলে আমি এটি ডিবাগ করতে সহায়তা করতে পারি
ক্রিস

দেখে মনে হচ্ছে আপনি this.props.history.push()প্রতিক্রিয়া রাউটার v4 এ ব্যবহার করতে পারেন । আমি কেবল প্রতিক্রিয়া রাউটার যদিও এর মধ্যে দিয়ে যায় সেগুলি পরিদর্শন করে এটি পেয়েছি। এটি কাজ করে বলে মনে হচ্ছে তবে আমি এটি নিশ্চিত নই যে এটি একটি ভাল ধারণা।
sean_j_roberts

-1

আবার এটি জেএস :) এটি এখনও কাজ করে ....

var linkToClick = document.getElementById('something');
linkToClick.click();

<Link id="something" to={/somewhaere}> the link </Link>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.