Next.js: Router.push mit Status

Lesezeit: 4 Minuten

Ich verwende next.js zum Neuaufbau einer App für das serverseitige Rendering. Ich habe eine Schaltfläche, die eine Suchanfrage bearbeitet.

In der alten App war der Handler dieser:

search = (event) => {
    event.preventDefault();
    history.push({
        pathname: '/results',
        state: {
            pattern: this.state.searchText,
        }
    });
}

In der Ergebnisklasse konnte ich das Bundesstaatsdatum mit this.props.location.state.pattern abrufen.

Jetzt verwende ich next.js:

import Router, { withRouter } from 'next/router'

performSearch = (event) => {
    event.preventDefault();
    Router.push({ pathname: '/results', state: { pattern: this.state.searchText } });
};

In der Ergebnisklasse verwende ich

static async getInitialProps({req}) {
    return req.params;
}

Ich bin nicht sicher, ob ich dies zu meiner server.js hinzufügen muss:

server.get('/results', (req, res) => {
    return app.render(req, res, '/results', req.params)
})

Die Funktion getInitialProps löst jedoch einen Fehler aus, da req nicht definiert ist. Langer Text, kurze Frage: Wie übergebe ich Status oder Parameter an eine andere Seite, ohne GET-Parameter zu verwenden?

Benutzeravatar von Prithwee Das
Prithwee Das

In next.js Sie können Abfrageparameter wie diesen übergeben

Router.push({
    pathname: '/about',
    query: { name: 'Someone' }
})

und dann auf Ihrer nächsten Seite (hier in /about Seite), rufen Sie die ab query über die router Requisiten, die injiziert werden müssen Component durch die Nutzung withRouter.

import { withRouter } from 'next/router'

class About extends React.Component {
  // your Component implementation
  // retrieve them like this
  // this.props.router.query.name
}

export default withRouter(About)

  • js this.props.router.query.name Es wird angezeigt – Typfehler – Eigenschaft „Abfrage“ von undefiniert kann nicht gelesen werden

    – Hossain Misho

    2. Okt. 2019 um 7:08


  • @ggnoredo Ich vermute, dass du es verwendest req.user In getInitialProps Wenn das Routing jedoch auf der Clientseite erfolgt, ist dies nicht der Fall req Objekt. req.user Existiert nur, wenn Next.js auf dem Server gerendert wird.

    – Prithwee Das

    18. November 2019 um 17:10 Uhr

  • Dies verschmutzt die UR. Gibt es nicht eine Funktion wie React Router?

    – Umakant Patil

    6. Mai 2020 um 7:04

  • Eine solche Funktion gibt es nicht. Mehr dazu finden Sie hier github.com/zeit/next.js/issues/771 @UmakantPatil

    – Prithwee Das

    6. Mai 2020 um 7:27 Uhr

  • @ZenVentzi Ich kann eine solche Funktion nicht finden, ich weiß nicht, ob ein Paket das simuliert. Im Allgemeinen verwende ich lokalen Speicher, um die Objekte zu speichern und bei Bedarf abzurufen. Achte nur darauf, dass ich die Dinge regelmäßig reinige und nicht den ganzen Platz verschlinge. Ich hoffe, dass zukünftige Versionen den Status setzen, wenn der Seitenwechsel clientseitig erfolgt.

    – KeitelDOG

    13. Mai 2020 um 10:53

Wenn Sie möchten, dass Ihre URL sauber bleibt, ergänzen Sie die Antwort von Prithwee Das wie folgt.

Router.push({
    pathname: '/about',
    query: { name: 'Someone' }
}, '/about');

Jetzt können Sie über Requisiten auf Requisiten in Ihrer Komponente zugreifen

...

const YourComponent = (props) => {
    useEffect(() => {
        console.log(props.router.query.name);
    }, [props.router.query]);

    return (
        <React.Fragment>
            ...
        </React.Fragment>
    );
};

...

  • Das funktioniert bei mir! Wenn ich jedoch ein verschachteltes Objekt übergebe, werden alle untergeordneten Elemente leer (“”), keine Ahnung warum …

    – Nasrul Arif

    10. April 2022 um 16:46 Uhr

  • Probieren Sie JSON.stringify(obj) im Router-Push und dann JSON.parse(obj) im useEffect-Hook aus

    – Ahmet Firat Keler

    10. April 2022 um 19:53 Uhr

  • Tolle Ergänzung!

    – Gabriel Arghire

    20. Okt. 2022 um 15:45 Uhr

Ich weiß nicht, ob dies SSR unterstützt, aber ich musste es wie folgt tun, um den Fehler zu vermeiden cannot read property 'query' of undefined.

Dies nutzt useRouter Hook, um Zugriff auf die URL zu erhalten, importiert wie unten.

import { useRouter } from 'next/router'

Angenommen, Sie möchten Daten übergeben {name:'Someone'} aus Component A Zu Component B.

In Component A,

const router = useRouter();

router.push(
  { pathname: "/path_of_component_b", query: { name: "Someone" } },
  "path_of_component_b"
);

In Component B,

const router = useRouter();

useEffect(() => {
  alert(router.query.name); // Alerts 'Someone'
}, [router.query]);

Wenn Sie „saubere“ URLs wünschen, besteht eine Möglichkeit darin, den onClick-Handler zu Ihrem Link hinzuzufügen und die erforderlichen Informationen im Kontext-/Redux-Store zu speichern. Es ist einfach zu implementieren, wenn Sie bereits eines haben.

<Link href="https://stackoverflow.com/questions/55182529/...">
  <a onClick={()=>{dispatch(....)}}>Link<a/>
<Link>

Ich möchte die Antwort von @Ahmet Firat Keler hinzufügen. Wenn Sie möchten, dass Ihre URL sauber bleibt und auch die Daten weitergibt, können wir dies mit tun "next/link".

as Requisiten funktionieren gut mit next/link und Sie können Abfrageparameter mit ausblenden next/link sowie.

<Link href={`/blogs/${item.slug}?id=${item.id}`} as={`/blogs/${item.slug}`} passHref>
    <a href="" className="hover:text-cyanBlue">
        Read More
    </a>
</Link>

Beachten Sie jedoch, dass dies nicht funktioniert, wenn Sie es festlegen target="_blank" um ein Ankertag zu erstellen oder einen Link zum nächsten Tab des Browsers zu öffnen

1453370cookie-checkNext.js: Router.push mit Status

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy