2017-12-06 20 views
6

Tôi đang cố sử dụng dấu phần trăm trong id bộ định tuyến phản ứng. Khi sử dụng % trong URI bị cấm, tôi phải mã hóa URI theo cách thủ công để có thể sử dụng dấu phần trăm này. Sử dụng một liên kết, tôi do đó sử dụng chức năng encodeURI để mã hóa URI:Sử dụng phần trăm (%) đăng nhập bộ phản ứng-bộ định tuyến: id

<Link to={`/r/${encodeURI(my_str_with_unencoded_percent_sign)}`} > 

Trong mã nguồn của trang web của tôi, tôi có thể thấy rằng các liên kết sử dụng %25 và không %.

Tuy nhiên, khi nhấp vào liên kết, tôi gặp lỗi "URIError: chuỗi URI không đúng định dạng" (trong một phần khác của mã của tôi, tôi có <Match pattern="/r/:id" …).

Tôi đã làm gì sai? Dường như url được giải mã trước khi được chuyển tới hàm parseParams của bộ phản ứng-bộ định tuyến, cố gắng giải mã nó lần thứ hai, dẫn đến lỗi này.

Tôi tìm thấy các vấn đề như https://github.com/ReactTraining/history/issues/461 hoặc https://github.com/ReactTraining/history/issues/461, nhưng tôi không tìm thấy giải pháp nào cho vấn đề này: làm cách nào tôi có thể sử dụng dấu phần trăm trong bộ định tuyến phản hồi: id?

Trả lời

1

Đây là phiên bản sửa đổi hoạt động của ví dụ URL Parameters do Recat-Training cung cấp.

Sao chép dán phần dưới đây vào tệp index.js của bạn và kiểm tra để xem nó hoạt động. Tôi sẽ cung cấp một codesandbox cho bạn, nhưng định tuyến nội bộ của họ có vấn đề khiến cho màn hình chuyển sang màu đen ngay cả với mã hóa uri% dấu ... Tôi đã thử nghiệm cục bộ này và hoạt động như một nét duyên dáng.

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

const ParamsExample =() => (
    <Router> 
    <div> 
     <h2>Accounts</h2> 
     <ul> 
     <li><Link to={`/${encodeURI("%netflix")}`}>Netflix</Link></li> 
     <li><Link to="/zillow-group">Zillow Group</Link></li> 
     <li><Link to="/yahoo">Yahoo</Link></li> 
     <li><Link to="/modus-create">Modus Create</Link></li> 
     </ul> 

     <Route path="/:id" component={Child} /> 
    </div> 
    </Router> 
) 

const Child = ({ match }) => (
    <div> 
    <h3>ID: {match.params.id}</h3> 
    </div> 
) 

render(<ParamsExample />, document.getElementById("react")); 
+0

Xin chào. Cảm ơn bạn vì câu trả lời. Thật vậy, giải pháp của bạn hoạt động khi tôi nhấp vào các liên kết được hiển thị trên trang, nhưng nó không hoạt động khi làm mới trang: nếu tôi nhấp vào liên kết «Netflix», nó hiển thị chính xác ID của tôi như mong đợi và thay đổi URL trong điều hướng trang web của tôi tới "http: //domain.tld/%netflix". Khi làm mới bằng F5 hoặc ctrl + R, tôi vẫn gặp lỗi tương tự. Điều đó có được mong đợi không? Mã kiểm tra ở đây (chỉ ở đây để tải xuống zip dễ dàng, như bạn đã nói, codesandbox bị hỏng và hiển thị trang web): https://codesandbox.io/s/zj7ok3l5x –

+0

Bạn đang gặp phải lỗi url không đúng định dạng từ cố gắng điều hướng trực tiếp đến url chứa '%' hoặc url chứa '%' được mã hóa? –

+0

Vâng, url chứa một% (không được mã hóa, trong thanh url), trong khi nó phải chứa một% được mã hóa khi tôi sử dụng hàm encodeURI. Tuy nhiên, router phản ứng hiểu mã hóa, khi nhấp vào các liên kết chuyển hướng đến đúng Tuyến đường. –

Các vấn đề liên quan