Liên kết ngoài React-Router


113

Vì tôi đang sử dụng bộ định tuyến phản ứng để xử lý các tuyến đường của mình trong ứng dụng phản ứng, tôi tò mò liệu có cách nào để chuyển hướng đến tài nguyên bên ngoài không.

Giả sử ai đó đánh:

example.com/privacy-policy

Tôi muốn nó chuyển hướng đến:

example.zendesk.com/hc/en-us/articles/123456789-Privacy-Policies

Tôi không tìm thấy sự trợ giúp chính xác nào trong việc tránh viết nó bằng JS thuần túy khi tải index.html của tôi với một cái gì đó như:

if ( window.location.path === "privacy-policy" ){
  window.location = "example.zendesk.com/hc/en-us/articles/123456789-Privacy-Policies"
}

Bạn đang sử dụng React Router nào?
Tyler McGinnis

Tôi đang sử dụng phiên bản 3.x
Eric Hodonsky

1
Đơn giản chỉ cần thay đổi window.location.hrefđể có một chuyển hướng chính thức.
Amirhossein Mehrvarzi

2
@AmirhosseinMehrvarzi điều đó không thực sự có nghĩa. Bạn có thể cụ thể hơn hoặc đưa ra một ví dụ? Ngoài ra, tôi không chắc bạn có để ý không nhưng câu hỏi này đã có một câu trả lời được chấp nhận liên quan đến React & React Router, đó là câu hỏi về cái gì.
Eric Hodonsky

1
@Relic Bạn cần sử dụng nó làm url trong điều kiện if của bạn. Tôi đã gặp vấn đề tương tự cách đây vài ngày và thấy cách này đơn giản và hiệu quả. Nó chuyển hướng ngay lập tức. Câu trả lời được chấp nhận là một giải pháp định tuyến (Trong khi nó vi phạm nguyên tắc Route, xem xét rằng Route kiến trúc là để chuyển hướng bên trong App không cho bên ngoài) mà không làm việc cho bất kỳ môi trường như tôi
Amirhossein Mehrvarzi

Câu trả lời:


170

Đây là một phần mềm để sử dụng React Router để chuyển hướng đến một liên kết bên ngoài:

<Route path='/privacy-policy' component={() => { 
     window.location.href = 'https://example.com/1234'; 
     return null;
}}/>

Nó sử dụng khái niệm thành phần thuần túy của React để giảm mã của thành phần thành một chức năng duy nhất, thay vì hiển thị bất kỳ thứ gì, chuyển hướng trình duyệt đến một URL bên ngoài.

Hoạt động trên cả React Router 3 và 4.


2
Điều này hoạt động nhưng tôi đang tìm kiếm một giải pháp có thể mở rộng thanh lịch hơn. Hãy xem những gì tôi đã nghĩ ra vì nó cho phép tôi tiến xa hơn nữa với các chuyển hướng cho MobileApps, v.v. (Không phải ReactNative, ứng dụng gốc thực sự). Bây giờ những gì tôi đang làm không phải là cách đúng đắn để giải quyết vấn đề của tôi, nhưng để giải quyết vấn đề này, tôi khuyên bạn nên điều tra giải pháp của tôi nếu không có gì khác hơn là một góc nhìn khác.
Eric Hodonsky

1
Điều này không thực sự sạch sẽ trong tâm trí của tôi. Tôi muốn sử dụng một thẻ liên kết một cách trung thực. Thứ hai, nhấn nút quay lại trên lợi nhuận duyệt bạn con đường mà sau đó chuyển hướng trở lại example.zendesk.com/hc/en-us/articles/...
Jonathan RYS

11
Để có hành vi nút quay lại tốt hơn (xác minh cho ứng dụng của bạn), hãy sử dụng window.location.replace (' example.com' )
MattC 17/07/18

1
Không có câu trả lời nào đúng, bài đăng ban đầu chỉ hỏi về chuyển hướng ứng dụng khách, KHI biết rằng không có hỗ trợ chuyển hướng thực sự loại 301 hoặc 302.
Eric Hodonsky

50

Không cần sử dụng <Link />thành phần từ bộ định tuyến phản ứng.

Nếu bạn muốn truy cập liên kết bên ngoài, hãy sử dụng thẻ liên kết.

<a target="_blank" href="https://meetflo.zendesk.com/hc/en-us/articles/230425728-Privacy-Policies">Policies</a>

20
OP được hỏi làm thế nào để làm điều đó theo chương trình, không khai báo
Eric Hodonsky

13
Câu trả lời không liên quan và gây hiểu lầm.
Priya Ranjan Singh

1
Nếu bạn sử dụng cái này, hãy thêm rel="noopener noreferrer"vào<a>
S ..

5
Câu trả lời hay, không phải ai cũng sẽ quan tâm miễn là họ làm được.
FrankByte.com

39

Tôi thực sự đã xây dựng Thành phần của riêng mình. <Redirect> Nó lấy thông tin từ react-routerphần tử để tôi có thể giữ nó trong các tuyến đường của mình. Nhu la:

<Route
  path="/privacy-policy"
  component={ Redirect }
  loc="https://meetflo.zendesk.com/hc/en-us/articles/230425728-Privacy-Policies"
  />

Đây là thành phần của tôi trong trường hợp bất kỳ ai tò mò:

import React, { Component } from "react";

export class Redirect extends Component {
  constructor( props ){
    super();
    this.state = { ...props };
  }
  componentWillMount(){
    window.location = this.state.route.loc;
  }
  render(){
    return (<section>Redirecting...</section>);
  }
}

export default Redirect;

CHỈNH SỬA - LƯU Ý: Điều này với react-router: 3.0.5, nó không đơn giản như vậy trong 4.x


bạn không PHẢI làm bất cứ điều gì, phản ứng là một khuôn khổ và có rất nhiều giá trị trong một khuôn khổ. Đây là cách thực hiện điều đó trong khung phản ứng. Tuy nhiên, nó KHÔNG tính đến mô-đun lịch sử trình duyệt có thể được đưa vào đây, làm cho điều này thậm chí còn hữu ích hơn. Cũng xin lưu ý "window.location" là cách nó được thực hiện vào năm 1999. Đây chỉ là một cách để thêm nó vào bảng định tuyến của bạn để định tuyến phía máy khách. Nó không phải là một giải pháp "tốt".
Eric Hodonsky

trong react -router v4, bạn có thể sử dụng render thay vì component
Irrech 22/02

3
@Irrech "render thay component" không có nghĩa là gì. Nếu bạn có câu trả lời cho câu hỏi, vui lòng thêm nó và cung cấp một số chi tiết về cách bạn sẽ triển khai.
Eric Hodonsky

3
@MuhammadUmer hoặc bạn chỉ sử dụng thẻ liên kết. react-router có nghĩa là khá chặt chẽ để định tuyến ngay trong ứng dụng của bạn. bạn có thể không đồng ý với quyết định thiết kế đó (tôi biết là tôi làm), nhưng nó không phải là "hoàn thành tốt hơn vào năm 1999", nó chỉ được thực hiện như vậy.
worc

21

Nó không cần phải yêu cầu bộ định tuyến phản ứng. Hành động này có thể được thực hiện tự nhiên và nó được cung cấp bởi trình duyệt.

chỉ dùng window.location

class RedirectPage extends React.Component {
  componentDidMount(){
    window.location.replace('http://www.google.com')
  }
}

1
Câu trả lời này là không đầy đủ, không cho phép trừu tượng hoặc nó liên quan đến các bộ định tuyến
Eric Hodonsky

8
Đây là mục tiêu. Nó không cần phải yêu cầu bộ định tuyến phản ứng. Hành động này có thể được thực hiện tự nhiên và nó được cung cấp bởi trình duyệt.
Alan

10

Với thành phần Link của react-router, bạn có thể làm được điều đó. Trong phần hỗ trợ " to ", bạn có thể chỉ định 3 loại dữ liệu:

  • chuỗi : Biểu diễn chuỗi của vị trí Liên kết, được tạo bằng cách nối tên đường dẫn, tìm kiếm và thuộc tính băm của vị trí.
  • một đối tượng : Một đối tượng có thể có bất kỳ thuộc tính nào sau đây:
    • pathname : Một chuỗi đại diện cho đường dẫn để liên kết đến.
    • tìm kiếm : Biểu diễn chuỗi các tham số truy vấn.
    • băm : Một hàm băm để đặt trong URL, ví dụ: # a-hash.
    • trạng thái : Trạng thái kiên trì đến vị trí.
  • một hàm : Một hàm mà vị trí hiện tại được truyền dưới dạng đối số và sẽ trả về biểu diễn vị trí dưới dạng một chuỗi hoặc dưới dạng một đối tượng

Đối với ví dụ của bạn (liên kết bên ngoài):

https://example.zendesk.com/hc/en-us/articles/123456789-Privacy-Policies

Bạn có thể làm như sau:

<Link to={{ pathname: "https://example.zendesk.com/hc/en-us/articles/123456789-Privacy-Policies" }} target="_blank" />

Bạn cũng có thể chuyển các đạo cụ mà bạn muốn có như tiêu đề, id, className, v.v.


1
Đây là giải pháp đơn giản nhất và hoạt động tốt.
hPNJ7MHTyg

5

Sử dụng một số thông tin ở đây, tôi đã đưa ra thành phần sau mà bạn có thể sử dụng trong khai báo tuyến đường của mình. Nó tương thích với React Router v4.

Nó sử dụng typecript, nhưng sẽ khá dễ dàng để chuyển đổi sang javascript gốc:

interface Props {
  exact?: boolean;
  link: string;
  path: string;
  sensitive?: boolean;
  strict?: boolean;
}

const ExternalRedirect: React.FC<Props> = (props: Props) => {
  const { link, ...routeProps } = props;

  return (
    <Route
      {...routeProps}
      render={() => {
        window.location.replace(props.link);
        return null;
      }}
    />
  );
};

Và sử dụng với:

<ExternalRedirect
  exact={true}
  path={'/privacy-policy'}
  link={'https://example.zendesk.com/hc/en-us/articles/123456789-Privacy-Policies'}
/>

2

Tôi đã gặp may với điều này:

  <Route
    path="/example"
    component={() => {
    global.window && (global.window.location.href = 'https://example.com');
    return null;
    }}
/>

1

Tôi không nghĩ rằng React-Router cung cấp hỗ trợ này. Các tài liệu đề cập đến

<Redirect> thiết lập chuyển hướng đến một tuyến đường khác trong ứng dụng của bạn để duy trì các URL cũ.

Bạn có thể thử sử dụng một cái gì đó như React-Redirect để thay thế


1

Để mở rộng câu trả lời của Alan, bạn có thể tạo một câu trả lời <Route/>chuyển hướng tất cả<Link/> thuộc tính "tới" có chứa 'http:' hoặc 'https:' đến đúng tài nguyên bên ngoài.

Dưới đây là một ví dụ hoạt động của điều này có thể được đặt trực tiếp vào của bạn <Router>.

<Route path={['/http:', '/https:']} component={props => {
  window.location.replace(props.location.pathname.substr(1)) // substr(1) removes the preceding '/'
  return null
}}/>

0

CHO V3, mặc dù nó có thể hoạt động cho V4. Ngoài câu trả lời của Eric, tôi cần làm thêm một chút, như xử lý phát triển cục bộ nơi 'http' không có trên url. Tôi cũng đang chuyển hướng đến một ứng dụng khác trên cùng một máy chủ.

Đã thêm vào tệp bộ định tuyến:

import RedirectOnServer from './components/RedirectOnServer';

       <Route path="/somelocalpath"
          component={RedirectOnServer}
          target="/someexternaltargetstring like cnn.com"
        />

Và thành phần:

import React, { Component } from "react";

export class RedirectOnServer extends Component {

  constructor(props) {
    super();
    //if the prefix is http or https, we add nothing
    let prefix = window.location.host.startsWith("http") ? "" : "http://";
    //using host here, as I'm redirecting to another location on the same host
    this.target = prefix + window.location.host + props.route.target;
  }
  componentDidMount() {
    window.location.replace(this.target);
  }
  render(){
    return (
      <div>
        <br />
        <span>Redirecting to {this.target}</span>
      </div>
    );
  }
}

export default RedirectOnServer;

-1

Sử dụng React với Typescript, bạn sẽ gặp lỗi vì hàm phải trả về phần tử phản ứng chứ không phải void. Vì vậy, tôi đã làm theo cách này bằng cách sử dụng phương pháp kết xuất tuyến đường (và sử dụng bộ định tuyến React v4):

redirectToHomePage = (): null => {
    window.location.reload();
    return null;
  };    
<Route exact path={'/'} render={this.redirectToHomePage} />

Thay vào đó bạn cũng có thể sử dụng ở đâu window.location.assign(), window.location.replace()v.v.


-2

Nếu bạn đang sử dụng kết xuất phía máy chủ, bạn có thể sử dụng StaticRouter. Với contextvai trò của bạn propsvà sau đó thêm <Redirect path="/somewhere" />thành phần trong ứng dụng của bạn. Ý tưởng là mỗi khi react-router khớp với một thành phần chuyển hướng, nó sẽ thêm một cái gì đó vào ngữ cảnh bạn đã chuyển vào bộ định tuyến tĩnh để cho bạn biết đường dẫn của bạn khớp với một thành phần chuyển hướng. bây giờ bạn biết bạn đã nhấn một chuyển hướng, bạn chỉ cần kiểm tra xem đó có phải là chuyển hướng bạn đang tìm kiếm hay không. sau đó chỉ cần chuyển hướng qua máy chủ. ctx.redirect('https://example/com').


Tôi đang yêu cầu một cách để làm điều đó trong ứng dụng khách. Nó thực sự nên được thực hiện ở cấp DNS nếu được thực hiện đúng cách. Thứ hai sẽ là yêu cầu máy chủ ban đầu. Vì tôi đang lưu trữ trên S3 nên không có phía máy chủ. VẬY, tôi đang bị mắc kẹt cho đến khi anh chàng dev-ops của chúng tôi có thể thực hiện chuyển hướng ở Cấp dịch vụ.
Eric Hodonsky

những gì bạn có thể làm là,<Redirect push={ true } to="/pathtoredirect" />
Rei Điện

-4

Tôi có thể đạt được chuyển hướng trong react-router-dom bằng cách sử dụng như sau

<Route exact path="/" component={() => <Redirect to={{ pathname: '/YourRoute' }} />} />

Đối với trường hợp của tôi, tôi đang tìm cách chuyển hướng người dùng bất cứ khi nào họ truy cập URL gốc http://myapp.comđến một nơi khác trong ứng dụng http://myapp.com/newplace. vì vậy ở trên đã giúp.


2
OP tuyên bố rõ ràng rằng anh ấy đang cố gắng chuyển hướng đến một tài nguyên bên ngoài, không phải một tuyến đường bên trong cùng một ứng dụng.
Neets

Rõ ràng, tôi đã nói cụ thể về trường hợp sử dụng của mình và bỏ điều đó nếu anh ấy có thể áp dụng nó cho trường hợp của mình. giải pháp của tôi cho biết trong ứng dụng của tôi, anh ấy có thể lấy đó làm ví dụ.
walecloud

1
Nếu bạn muốn giới thiệu trường hợp sử dụng của mình với mọi người, vui lòng viết một blog về nó. Stackoverflow là để trả lời truy vấn mà mọi người có, không phải trường hợp sử dụng của bạn. Ngoài ra, một cách đúng đắn để thực hiện trường hợp sử dụng của bạn là - <Redirect từ = "/" để = {{tên đường dẫn: '/ YourRoute'}} />
Abhas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.