我想制作可重复使用的左箭头和右箭头按钮,单击它们可以导航到不同的组件/页面.我正在制作一个日历,我想实现的是,只要按下这些箭头按钮,我就可以导航到不同的月份. 我可以在每个组件上使用<Link to="/path">Link标签来做到这一点,但这将违反103原则.有没有办法通过制作可重用的按钮来实现这一功能,这样我就不必在每个组件中都超过<Link to="/path">个?

这些是App.jsx上的路由

<Routes>
  <Route exact path='/' element={<HomePage />} />
  <Route exact path='/home' element={<HomePage />} />
  <Route path='nov2023' element={<SinglePage title='November 2023' />} />
  <Route path='dec2023' element={<SinglePage title='December 2023' />} />
  <Route path='jan' element={<SinglePage title='January 2024' />} />
  <Route path='feb' element={<SinglePage title='Febuary 2024' />} />
  <Route path='mar' element={<SinglePage title='March 2024' />} />
  <Route path='apr' element={<SinglePage title='April 2024' />} />
  <Route path='may' element={<SinglePage title='May 2024' />} />
  <Route path='jun' element={<SinglePage title='June 2024' />} />
  <Route path='jul' element={<SinglePage title='July 2024' />} />
  <Route path='aug' element={<SinglePage title='August 2024' />} />
  <Route path='sep' element={<SinglePage title='September 2024' />} />
  <Route path='oct' element={<SinglePage title='October 2024' />} />
  <Route path='nov' element={<SinglePage title='November 2024' />} />
  <Route path='dec' element={<SinglePage title='December 2024' />} />
  <Route path='*' element={<NotFoundPage />} />
</Routes>
import { useNavigate, useNavigation } from "react-router-dom";

const SinglePage = ({ title }) => {
  const navigation = useNavigate();
  return (
    <div className='h-screen px-2 bg-cyan-200'>
      <div className='flex flex-col items-center pt-20 space-y-5 text-center space-between'>
        <Logo />
        <MonthTitle title={title} />
        <SootheSensesPara />
      </div>
      <div className='flex justify-end space-x-2 items-center sm:px-[50px] md:px-[100px]'>
        <p onClick={() => navigation(-1)} className='flex-0'>
          **LA**
        </p>
        <div className='flex-1'>
          <BirdCard />
        </div>
        <p onClick={() => navigation(+1)} className='flex-0'>
          **RA**
        </p>
      </div>
    </div>
  );
};

export default SinglePage;
const HomePage = () => {
  return (
    <div className='bg-green-100 px-10 sm:px-[50px] md:px-[100px]'>
      <div className='pt-20 space-y-5 text-center '>
        <LogoSafex />
        <SootheSensesPara />
      </div>
      <div className='flex flex-col items-center justify-center space-y-5 '>
        <CalenderCard month='November' path='/nov2023' />
        <CalenderCard month='December' path='/dec2023' />
        <CalenderCard month='January' path='/jan' />
        <CalenderCard month='Febuary' path='/feb' />
        <CalenderCard month='March' path='/mar' />
        <CalenderCard month='April' path='/apr' />
        <CalenderCard month='May' path='/may' />
        <CalenderCard month='June' path='/jun' />
        <CalenderCard month='July' path='/jul' />
        <CalenderCard month='August' path='/aug' />
        <CalenderCard month='September' path='/sep' />
        <CalenderCard month='October' path='/oct' />
        <CalenderCard month='November' path='/nov' />
        <CalenderCard month='December' path='/dec' />
      </div>
    </div>
  );
};

export default HomePage;

在点击LA和RA时,我想导航到上一个和下一个组件/页面,即从2023年11月到2023年12月点击RA

推荐答案

我的建议是将所有月份数据加载到一个可搜索的数组中.

const months = [
  {
    id: "nov2023",
    month: "November",
    path: "/nov2023",
    title: "November 2023"
  },
  {
    id: "dec2023",
    month: "December",
    path: "/dec2023",
    title: "December 2023"
  },
  ....
  {
    id: "nov",
    month: "November",
    path: "/nov",
    title: "November 2024"
  },
  {
    id: "dec",
    month: "December",
    path: "/dec",
    title: "December 2024"
  }
];

该数组将被用来映射到HomePage 102中的CalendarCard个分量,作为查找实用函数来计算当前以及下个月和上个月的数据.

const HomePage = () => {
  return (
    <div className="bg-green-100 px-10 sm:px-[50px] md:px-[100px]">
      <div className="pt-20 space-y-5 text-center ">
        <LogoSafex />
        <SootheSensesPara />
      </div>
      <div className="flex flex-col items-center justify-center space-y-5 ">
        {months.map((month) => (
          <CalenderCard month={month} key={month.id} />
        ))}
      </div>
    </div>
  );
};
const getMonthData = (current) => {
  const index = months.findIndex((month) => month.id === current);

  return {
    current: months[index],
    previous: months[index - 1],
    next: months[index + 1]
  };
};

SinglePage组件将读取新的month路由路径参数并计算currentnextprevious

const SinglePage = () => {
  const navigation = useNavigate();
  const { month } = useParams();

  const { current, next, previous } = getMonthData(month);

  return (
    <div className="h-screen px-2 bg-cyan-200">
      <div className="flex flex-col items-center pt-20 space-y-5 text-center space-between">
        <Logo />
        <MonthTitle title={current?.title} />
        <SootheSensesPara />
      </div>
      <div className="flex justify-end space-x-2 items-center sm:px-[50px] md:px-[100px]">
        <button
          type="button"
          onClick={() => navigation(previous?.path)}
          className="flex-0"
        >
          {"<<"}
        </button>
        <div className="flex-1">
          <BirdCard />
        </div>
        <button
          type="button"
          onClick={() => navigation(next?.path)}
          className="flex-0"
        >
          {">>"}
        </button>
      </div>
    </div>
  );
};
<Routes>
  <Route path="/" element={<Navigate to="/home" replace />} />
  <Route path="/home" element={<HomePage />} />
  <Route path="/:month" element={<SinglePage />} />
  <Route path="*" element={<NotFoundPage />} />
</Routes>

演示

Edit how-to-navigate-to-different-components-in-react-js

Javascript相关问答推荐

阻止iOS浏览器在传输摄像机视频时启用全屏摄像机模式

为什么剧作家在导航时会超时?

如果被1个Phaser JS抵消,我的倾斜碰撞

想要检测字符串中的所有单词

如何解决这个未能在响应上执行json:body stream已读问题?

仅圆角的甜甜圈图表

如何从html元素创建树 struct ?

显示图—如何在图例项上添加删除线效果?

如何根据当前打开的BottomTab Screeb动态加载React组件?

JSDoc创建并从另一个文件导入类型

我正在建立一个基于文本的游戏在react ,我是从JS转换.我怎样才能使变量变呢?

当id匹配时对属性值求和并使用JavaScript返回结果

是什么导致了这种奇怪的水平间距错误(?)当通过JavaScript将列表项元素追加到无序列表时,是否在按钮之间?

NG/Express API路由处理程序停止工作

在画布中调整边上反弹框的大小失败

如何在我的Next.js项目中.blob()我的图像文件?

Phaserjs-创建带有层纹理的精灵层以自定义外观

使用Document.Evaluate() Select 一个包含撇号的HTML元素

使用线性插值法旋转直线以查看鼠标会导致 skip

如何修复错误&语法错误:不能在纯react 项目中JEST引发的模块&之外使用导入语句?