【问题标题】:Dynamic routing issue动态路由问题
【发布时间】:2020-03-02 21:52:09
【问题描述】:

我对动态路由有点困惑,因为我是 NextJS 的新手。我希望它是这样的,如果有人点击我的页面标题,它会将他们带到一个包含相同标题和正文的新页面。为了实现这一目标,我可以做出哪些改变?我检查了许多资源,但它们要么是从 a 到 b,而且数据是硬编码的。

import React from 'react';
import axios from 'axios'
import Link from 'next/link';


class Abc extends React.Component{
    state = {
        title: '',
        body: '',
        posts: []
    };

    componentDidMount=()=>{
        this.getBlogPost();
    };



displayBody=(posts: Array<any>)=>{
 if(!posts.length)
 return null;
 return posts.map((post,index)=>(
<div key={index}>

 <Link href={`/post?title=${this.state.title}`} ><a> 
 {post.title}</a></Link>
    <h2>{post.title}</h2>
    <p>{post.body}</p>

</div>
 ));

};
    render() {
        console.log('state', this.state);
        return (
            <div>
                <h2>Welcome to my app</h2>

            <div className="blog">

                {this.displayBody(this.state.posts)}
            </div>


            </div>
        );
    }
}

export default Abc

【问题讨论】:

    标签: reactjs typescript next.js


    【解决方案1】:

    如果有人点击我帖子的标题,它会将他们带到一个新页面 由相同的标题和正文组成

    你的意思是标题和正文是根据用户点击的参数从 MongoDB 中获取的吗?

    如果是,由于您使用的是 ExpressJS,您可以在 Github 上查看他们的示例:

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

    有一个 API /posts/:id 基本上可以满足您想要实现的目标。这个想法是从用户的请求中获取唯一的参数,然后将此参数转发到您的特定页面,并根据用户的参数调用API以获取到MongoDB。

    更新答案

    这是pages/posts 的样子:

    import React, { Component } from 'react'
    
    export default class extends Component {
      static getInitialProps({ query: { id, title, body } }) {
        return { postId: id, title, body }
      }
    
      render() {
        return (
          <div>
            <h1>My blog post #{this.props.postId}</h1>
            <p>
              Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
              eiusmod tempor incididunt ut labore et dolore magna aliqua.
            </p>
          </div>
        )
      }
    }
    

    您需要做的是添加 getInitialProps 函数,该函数从您的服务器发送的查询中检索 id。

    第二次更新答案

    然后您可以使用next/link 对象网址,如下所示:

    <Link href={{ pathname: `/post?title=${this.state.title}`, query: { title: this.state.title, body: this.state.body } }}>
        <a>{post.title}</a>
    </Link>
    

    如果示例不起作用,您需要将其与来自next/routerwithRouter 结合起来,以从路由器对象访问您的查询。

    完整示例:here

    【讨论】:

    • 我已经添加了我的服务器文件,我可以获取和发布我的请求。我也添加了我的服务器代码。目前我的项目只有两个文件。 Index.ts 和 server.ts。您能否检查一下,因为使用“链接 href”我可以创建指向我的标题的链接,但其中没有任何内容(索引文件)@Darryl RN
    • 您的服务器文件已经正确,可以让 API 监听获取/api 和发布/api/save。现在,您需要做的是再添加一个 API 来侦听以获取 /[your_preference_path]/[unique_id],就像我的答案示例一样。
    • 这正是我的问题所在,我该如何创建该 API? server.get('/posts/:id', (req, res) => {.return app.render(req, res, '/posts', { id: req.params.id }) }) 我已经创建这也在我的 server.js 中,并在那里创建了一个页面文件。我在页面文件(API)中提到了什么来实现这一点?你可以发布一个代码 sn-p 来帮助我吗? @Darryl RN
    • 正文和标题呢?我尝试添加 {this.props.body} 和 {this.props.title} 但它只能显示 id 而不是与 ID @Darryl RN 关联的标题和正文
    • 您不会通过next/router 查询发送标题和正文,不是吗?您的页面中有 API 调用者的原因是根据您从用户请求的查询中获得的 ID 获取标题和正文。
    猜你喜欢
    • 2018-04-18
    • 1970-01-01
    • 2019-12-05
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2021-04-30
    相关资源
    最近更新 更多