2017-12-06 2 views
6

Ich versuche, ein Prozentzeichen in einer React-Router-ID zu verwenden. Da die Verwendung von % in URI verboten ist, muss ich meinen URI manuell codieren, um dieses Prozentzeichen verwenden zu können. Mit einem Link ich daher die encodeURI Funktion verwenden, um die URI zu kodieren:Mit Prozent (%) anmelden react-router: ID

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

Im Quellcode meiner Seite, ich kann sehen, dass der Link verwendet %25 und nicht %.

Immer noch, wenn ich auf den Link klicke, bekomme ich den Fehler "URIEfehler: fehlerhafte URI-Sequenz" (in einem anderen Teil meines Codes habe ich eine <Match pattern="/r/:id" …).

Was habe ich falsch gemacht? Es scheint, dass die URL vor decodiert wird, die an die parseParams-Funktion von react-router übergeben wird, die versucht, es ein zweites Mal zu decodieren, was zu diesem Fehler führt.

Ich habe Probleme wie https://github.com/ReactTraining/history/issues/461 oder https://github.com/ReactTraining/history/issues/461 gefunden, aber ich habe keine Lösung für dieses Problem gefunden: Wie kann ich ein Prozentzeichen in einem React-Router verwenden: ID?

Antwort

1

Hier ist eine funktionierende modifizierte Version des Beispiels URL Parameters von Recat-Training zur Verfügung gestellt.

Kopieren Sie die folgenden in Ihre index.js und testen Sie es, um zu sehen, wie es funktioniert. Ich wollte eine Codesandbox für Sie bereitstellen, aber ihr internes Routing hat Probleme, die dazu führen, dass der Bildschirm schwarz wird, sogar mit uri-codierten% -Zeichen ... Ich habe das lokal getestet und funktioniert wie ein Zauber.

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

Hallo. Vielen Dank für Ihre Antwort. Ihre Lösung funktioniert zwar, wenn ich auf die auf der Seite angezeigten Links klicke, funktioniert aber beim Aktualisieren der Seite nicht: Wenn ich auf den Link «Netflix» klicke, wird die ID wie erwartet korrekt angezeigt und die URL wird geändert in meinem Web-Navigator zu "http: //domain.tld/%netflix". Wenn ich mit F5 oder Strg + R auffrische, bekomme ich immer noch den gleichen Fehler. Wird das erwartet? Test-Code ist hier (nur hier für den einfachen Zip-Download, wie Sie gesagt haben, Codesandbox ist kaputt und zeigt eine Webseite): https://codesandbox.io/s/zj7ok3l5x –

+0

Sie erhalten einen Fehler 'missformed url' vom Versuch, direkt zu einer URL zu navigieren, die ein '%' oder eine URL enthält, die ein '% 'verschlüsselt enthält? –

+0

Nun, die URL enthält% (nicht codiert, in der URL-Leiste), während es eine codierte% enthalten sollte, da ich die encodeURI-Funktion verwende. Dennoch, react-router versteht die Verschlüsselung, da das Klicken auf die Links auf die richtige Route umleitet. –