首页 > 其他分享 >Next.js dynamic router path bug All In One

Next.js dynamic router path bug All In One

时间:2022-11-30 17:11:37浏览次数:74  
标签:const title await dynamic js return params path id

Next.js dynamic router path bug All In One

markdown

daynamic router

bug

why below code not work at all ?

dynamic router path screenshot

image

// [title].js

export async function getStaticPaths() {
  const ids = await getPostsIds();
//   ids[0] =
//     {
//       id: '/Users/xgqfrms-mm/Documents/github/nextjs-ssr/posts/markdown.md',
//       year: '2022',
//       month: '12',
//       day: '31',
//       title: 'last'
//    }
  const paths = ids.map(({id, year, month, day, title}) => ({
    params: {
      // id can not pass `id` with params ❌
      id,
      year,
      month,
      day,
      title,
    },
    // can not pass `id` by using key out of `params` ❌❌
    id,
  }));
  return {
    paths,
    fallback: false,
  };
}


export async function getStaticProps({ params, id }) {
  console.log(`params without id =`, params);
  // params without id = {
  //   params: { year: '2022', month: '12', day: '31', title: 'last' },
  //   locales: undefined,
  //   locale: undefined,
  //   defaultLocale: undefined
  // }
  // both not work ❌
  // const data = await getPostsData(params.id);
  const data = await getPostsData(id);
  return {
    props: {
      postData: data,
    },
  };
}

hack way find id ✅


// [title].js

export async function getStaticPaths() {
  const ids = await getPostsIds();
  const paths = ids.map(({id, year, month, day, title}) => ({
    params: {
      year,
      month,
      day,
      title,
    },
  }));
  return {
    paths,
    fallback: false,
  };
}


export async function getStaticProps({ params }) {
  // hack way find id ✅ 
  const ids = await getPostsIds();
  const obj = ids.find(obj => {
    if(obj.year === params.year && obj.month === params.month && obj.day === params.day && obj.title === params.title) {
      return obj;
    }
  });
  const data = await getPostsData(obj.id);
  return {
    props: {
      postData: data,
    },
  };
}

solution ???

import type { ParsedUrlQuery } from 'querystring'
import type { GetStaticPaths, GetStaticProps } from 'next'
import type { Product } from '../types'

import { PHASE_PRODUCTION_BUILD } from 'next/constants'
import { Layout, Page, Link } from '@vercel/examples-ui'

import api from '../api'
import ProductCard from '../components/ProductCard'

interface Props {
  product: Product
}

interface Query extends ParsedUrlQuery {
  id: string
}

export const getStaticPaths: GetStaticPaths<Query> = async () => {
  const products = await api.list()

  if (process.env.NEXT_PHASE === PHASE_PRODUCTION_BUILD) {
    await api.cache.set(products)
  }

  return {
    paths: products.map((product) => ({
      params: {
        id: product.id,
      },
    })),
    fallback: 'blocking',
  }
}

export const getStaticProps: GetStaticProps<Props, Query> = async ({
  params,
}) => {
  let product = await api.cache.get(params?.id as string)

  if (!product) {
    product = await api.fetch(params?.id as string)
  }

  if (!product) {
    return {
      notFound: true,
    }
  }

  return {
    props: {
      product,
    },
  }
}

function Home({ product }: Props) {
  return (
    <Page>
      <section className="flex flex-col gap-6 items-center">
        <ProductCard product={product} />
        <Link href="/">Go back to index</Link>
      </section>
    </Page>
  )
}

Home.Layout = Layout

export default Home

https://github.com/vercel/next.js/discussions/11272?sort=top#discussioncomment-4271092

https://github.com/vercel/examples/blob/main/solutions/reuse-responses/pages/[id].tsx

refs

https://nextjs.org/learn/basics/data-fetching/implement-getstaticprops

https://www.cnblogs.com/xgqfrms/p/16934306.html



©xgqfrms 2012-2021

www.cnblogs.com/xgqfrms 发布文章使用:只允许注册用户才可以访问!

原创文章,版权所有©️xgqfrms, 禁止转载

标签:const,title,await,dynamic,js,return,params,path,id
From: https://www.cnblogs.com/xgqfrms/p/16939082.html

相关文章

  • js检测页面性能指标
    检测获取fp、fcp、lcp、cls性能指标:window.monitor={isWinLoad:false,observer:null,sessionValue:0,sessionEntries:[],data:{fp:0,f......
  • 【Jmeter】21天打卡 09取样器之http不同方法Post提交表单和json
    作业要求:取样器之http不同方法post提交表单和json服务器名:httpbin.orgname api methodbodypost提交参数 postpostpost:123post提交JSON数据 postpost{"po......
  • 转 前端前辈 反压缩 js ,我的万花筒写轮眼开了,CV 能力大幅提升
    转 反压缩js,我的万花筒写轮眼开了,CV能力大幅提升摘要:前言因为比较菜,所以经常需要读一些别人的代码学习学习。有源码的代码当然好,但是很多网站不开源。这些网站的......
  • Angularjs的指令学习笔记
    1.指令ng-app ng-controller<scriptsrc="../js/angular.min.js"></script><body><divng-app="myApp"ng-controller="myCtrl">    {{firstName+""+lastName}......
  • Vue.js的学习笔记
    Vue.js1.简介vue介绍:vue是一个兴起的前端js库,是一个精简的MVVM。从技术角度讲,Vue.js专注于MVVM模型的ViewModel层。它通过双向数据绑定把View层和Model层连接了起......
  • js 手写防抖
    使用场景:多次操作只执行第一次操作。可以用于用户点击按钮事件防抖操作。多次操作只执行最后一次操作。可以搜索输入框,输入多个字符进行搜索,当输入停止之后进行搜索......
  • JVM问题诊断常用命令:jinfo,jmap,jstack
    1.jinfo描述:输出给定 java 进程所有的配置信息。包括 java 系统属性和 jvm用法:jinfo[option]pidjinfo[option]executablecorejinfo[option][server-id@]r......
  • js的所有的this指向和节流防抖
    所有的this指向普通函数重的this指向,wind对象中的方法this指向,该对象(是对象中的方法的this指向,不是对象中的this指向,对象是没有this指向的)事件绑定中的this指向,绑定的事......
  • js面向对象,封装构造函数
    面向对象and面向过程面向对象,只关注对象面向对象更适合软件,他不关注步骤,只关注结果面向过程,只关注过程面向过程更适合硬件,它有每一个步骤,而且它更关注每一步的过程构......
  • SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模
    1、创建Maven项目2、填写项目基本信息、完成创建3、导入POM依赖打包方式设置为War包<packaging>war</packaging>依赖、可自行添加需要jar包依赖<dependencies>......