为什么React-router在url改变时不重新渲染页面也不更新数据?

2023-12-12

我正在 React 中构建一个项目,该项目通过自定义挂钩从 API 检索数据,一旦检索到数据,它就会显示卡片,通过单击它们可以打开描述性页面。到这里一切都好。

// App.js
<Routes>
   <Route path="/" element={<Home />} /> // cards list
   <Route path="/:eleId" element={<Details />} /> // description page 
</Routes>

// Home.jsx with single card
<div className="container">
   <Link to={`/${eleId}`}>
      <Card />
   </Link>
</div>

我的问题来了: 在描述页面内,我有相关链接,单击时会打开同一页面,但会更改数据:

// Details.jsx description page 
import { useParams, Link } from 'react-router-dom';
import useData from '../hooks/useData';

const Details = () => {
   const { eleId } = useParams(),
         [data] = useData(`alpha/${eleId}`); // call API with url of eleId

   return(
      <div className="description">
         <p>BLa bla bla</p>
         <Link to={`/${data.id}`}> Related </Link>
      </div>
   );
}

export default Details;
// useData.jsx custom hook
import { useState, useEffect } from 'react';

const useData = (param = 'all') => {
   const [data, setData] = useState([]),
         [error, setError] = useState(null),
         [isLoading, setIsLoading] = useState(true);
    
    const url = 'https://restcountries.com/v2/'+param;

    useEffect(() => {
        const fetchAPI = async () => {
            setIsLoading(true);
            try {
                const response = await fetch(url),
                        json = await response.json();
                setData(json);
                setError(false);
            } catch(err) {
                setError(err.message);
                setData(null);
                console.log(err);
            }
            setIsLoading(false);
        };
        fetchAPI(); 
    }, []);

   return [data, error, isLoading];
}

export default useData;

网址更改正确,但数据未更新...但如果我刷新它就会更新。

我不明白为什么 React 无法重新渲染页面。有人可以给我一些建议吗?

谢谢 :)


// Details.jsx description page 
<div className="description">
  <p>BLa bla bla</p>
  <Link to={`/${eleId}`}>Related</Link>
<div>

If Details组件正在链接到其自身,即渲染它的路由,这意味着路由路径已经匹配并正在渲染Details. Details可能需要“监听”上的更改eleId路由匹配参数使用useParamsReact hook 来访问eleId参数和一个useEffect钩与eleId作为参数更新时运行任何必要的副作用的依赖项。

Example:

import { useParams } from 'react-router-dom';

...

const Details = () => {

  const { eleId } = useParams();
  const [data] = useData(`alpha/${eleId}`);

  ...

  useEffect(() => {
    // Business logic to run when eleId updates
  }, [eleId]);

  ...

For the useData钩住,移动url声明进入useEffect挂钩并添加param参数作为效果的依赖项。当参数改变时,这将重新触发useEffect并重新获取数据。

const useData = (param = 'all') => {
  const [data, setData] = useState([]);
  const [error, setError] = useState(null);
  const [isLoading, setIsLoading] = useState(true);
    
  useEffect(() => {
    const url = 'https://restcountries.com/v2/' + param;

    const fetchAPI = async () => {
      setIsLoading(true);
      try {
        const response = await fetch(url);
        const json = await response.json();
        setData(json);
        setError(false);
      } catch(err) {
        setError(err.message);
        setData(null);
        console.log(err);
      }
      setIsLoading(false);
    };
    fetchAPI(); 
  }, [param]);

  return [data, error, isLoading];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么React-router在url改变时不重新渲染页面也不更新数据? 的相关文章

随机推荐

  • 相互依赖的类声明

    我试图弄清楚这个编译错误意味着什么 我希望我能很好地解释这一点 In file included from sys charon cpp 4 0 接下来 我将转到上面的 文件 并用黄色下划线表示 include headers charon
  • 如何获取可变字符串列表?

    我有下面的代码 List
  • 计算后续位置之间的欧几里德距离

    我有由 X 和 Y 坐标对组成的大型数据框 并希望计算连续坐标之间的欧几里德距离 最小大小约为 2000 对坐标 因此 我想计算第 1 行到第 2 行 第 2 行到第 3 行 第 3 行到第 4 行等的距离 这个问题很好地展示了如何计算轨迹
  • Javascript:提取字符串中以特定字符开头的单词

    我有这个字符串 Hey I love apple and orange and also banana 我想提取以 开头的每个单词 symbol 目前我正在用这段代码实现它 var last 0 var n 0 var str Hey I
  • 无效的元素状态:元素必须是用户可编辑的才能清除尝试使用 Selenium 在下拉切换上单击并插入日期时出现的错误

    我试图单击此日历并使用 selenium 自动插入日期 但出现以下错误 无效的元素状态 元素必须是用户可编辑的 以便 清除它 HTML 片段 a class dropdown toggle p class custom datepicker
  • Cin 在 while 循环中

    因此 我环顾四周 无法弄清楚在 While 循环期间 cin 发生了什么 我正在阅读 C Primer 第 5 版 一书 我注意到在其中一个练习中 我无法使用 cin 来获取字符串 除非它不终止 while 循环 我仅使用 getline
  • 水平和垂直滚动 HTML 表格,同时左列固定

    我正在尝试创建一个HTML表在哪里身高有限水平滚动时左侧保持固定 并且表格主体可水平滚动 但垂直滚动时左侧不固定 左侧将与表格的其余部分一起滚动 fixed scrollable 1 body content 2 body content
  • 在 jquery 中处理 $(window).scroll 函数的更有效方法?

    在下面的代码中 我检查窗口是否滚动超过某个点 如果是 则更改元素以使用固定位置 以便它不会滚动到页面顶部 唯一的问题是 这似乎是高度客户端内存密集型 并且确实降低了滚动速度 因为在每个滚动像素上 我都会一遍又一遍地更新元素上的样式属性 在尝
  • 如何使用 Cognito 身份池生成临时凭证来访问 aws 服务?

    我有一个认知用户池和身份池 我有创建了一个用户在用户池中 我使用 lambda 获取令牌 即访问 刷新 id 令牌对于该用户 现在我想要生成临时凭证即该用户访问 AWS 服务的访问密钥和秘密访问密钥 我怎么能这样做呢 这是我用来生成令牌的代
  • 如何优化这个复杂的EAV MYSQL查询?

    是否可以优化我写的这个查询 我创建了一种动态虚拟数据库 使我的用户能够添加自定义字段而不影响数据库结构 这是迄今为止结构的非常简化的视图 tables columns db cases caseid db structure fieldna
  • R POSIXct 返回 NA 为“03/12/2017 02:17:13”

    我有一个包含以下日期以及其他几个日期的数据集 03 12 2017 02 17 13 我想将整个数据集放入数据表中 所以我使用read csv and as data table创建DT 其中包含date中的日期 时间信息 接下来我用了 D
  • 使用 SSE 将向量乘以常数

    我有一些在 4D 向量上运行的代码 目前我正在尝试将其转换为使用 SSE 我在 64b linux 上同时使用 clang 和 gcc 仅对向量进行操作就可以很好地理解这一点 但现在我必须将整个向量乘以一个常数 像这样 float y 4
  • 如何将 .xls 文件转换为 .csv 文件?

    如何转换 xls to csv在 Perl 中 这个模块是什么 有这方面的例子吗 最好的转换方式是什么 use Spreadsheet ParseExcel my xlsparser Spreadsheet ParseExcel gt ne
  • 使用 jQuery 切换同级元素

    我想切换列表中链接的下一个同级链接 如下所示 ul li a href 1 a li li a href 2 a ul class selected li a href 2 1 a li li a href 2 2 a li li a hr
  • 使用 BULK INSERT 命令将 CSV 文件导入 SQL Server 表

    我有 CSV 文件 其中有几个数据列 CSV 文件看起来像 字段1 测试1字段2 测试2字段3 测试3 测试4 测试5 在这种情况下 我可以使用哪个库作为字段终止符 我的意思是如果我使用此查询将 CSV 文件插入到shopifyitem表
  • 如何覆盖 CSS 类的属性以避免复制和重命名样式

    我对 CSS3 相当陌生 我希望能够执行以下操作 当我将一个类添加到元素中时 它会覆盖该特定元素中使用的另一个类的属性 假设我有 a class left carousel control href carousel 我希望能够添加一个名为
  • UIImageView动画消耗内存太多

    我的记忆和动画图像有问题 首先 我正在使用 ARC 在我的初始屏幕上 我有大约 60 个要制作动画的图像 我正在使用此代码进行动画 NSMutableArray images NSMutableArray alloc init int an
  • 常量文件中的 codeigniter base_url

    目前我通过以下方式显示图像 img src USER UPLOAD URL 在 application config constants php 中定义 define USER UPLOAD URL uploads user uploads
  • 使用 XSLT 将输入 XML 转换为其他 XML

    我是初学者 想学习 XSLT 我遇到了使用 XSLT 将输入 XML 文件转换为另一个 XML 文件的问题 我的输入 XML 文件
  • 为什么React-router在url改变时不重新渲染页面也不更新数据?

    我正在 React 中构建一个项目 该项目通过自定义挂钩从 API 检索数据 一旦检索到数据 它就会显示卡片 通过单击它们可以打开描述性页面 到这里一切都好 App js