当前位置: 首页 > 知识库问答 >
问题:

next.js“比上一次呈现时呈现了更多的钩子”

慕承恩
2023-03-14

我目前正在实现useSWR,以便从我的express和mongo-db后端获取数据。我能够顺利地从数据库中提取数据没有问题。下面是我用来实现这一点的代码:

```//SWR method for hydration
const fetcher = (...args) => fetch(...args).then(res => res.json())
const { data, error } = useSWR('http://localhost:3000/appi/daily', fetcher)
if (error) return <div>failed to load</div>
if (!data) return <div>loading...</div>```

然后通过以下方式访问:

data.currentinfo.username,其中username是集合中的一个字段。

当我尝试将此信息添加到状态钩子中时,问题就出现了,然后状态钩子返回的错误呈现的钩子比上一次呈现的钩子要多。

删除行:const[displayNumber]=useState(data.currentInfo.randomString)和使用状态变量displayNumber的任何行就可以完全修复错误。

我已将有关代码列入以下内容:

    const fetcher = (...args) => fetch(...args).then(res => res.json())
    const { data, error } = useSWR('http://localhost:3000/appi/daily', fetcher)
    if (error) return <div>failed to load</div>
    if (!data) return <div>loading...</div>
    
      
    const[displayNumber] = useState(data.currentInfo.randomString)


    //handler function for changing state variable
    function handleNumChange(event){
        console.log(event.target.value);
        setNumber(event.target.value);
      } 


    
    return(
      <div>
        <div>
            <Navbar className="navbar"/>
            <h2>{data.currentInfo.username}</h2>
            <h2>{displayNumber}</h2>

简而言之,im用swr提取数据,将该信息添加到状态变量中,然后用H2显示它。

谁能告诉我这种方法有什么问题吗?

我已经在网上搜索了这个错误,上面说它可能是由useEffect钩子引起的,但在我的代码中没有任何错误。

共有1个答案

袁亦
2023-03-14

该错误说明u的钩子比以前的呈现多。如果读取react文档,则所有Ustate钩子都应该在每个呈现时调用。当您的代码具有以下额外的useState声明时,您不能具有条件useState

if (error) return <div>failed to load</div>
if (!data) return <div>loading...</div> 

这意味着,如果不存在错误而存在数据,则只会调用行const[displayNumber]=useState(Data.CurrentInfo.RandomString)

编辑:将其移到顶部通常会解决您的问题。

    const fetcher = (...args) => fetch(...args).then(res => res.json())
    const { data, error } = useSWR('http://localhost:3000/appi/daily', fetcher)
    //const[displayNumber] = useState(data.currentInfo.randomString) //Needs null checks ofcourse
    //With null checks
    const[displayNumber] = useState((data && data.currentInfo && data.currentInfo.randomString) || undefined)
    //OR
    //const[displayNumber] = useState(data?.currentInfo?.randomString)
    if (error) return <div>failed to load</div>
    if (!data) return <div>loading...</div>
 类似资料:
  • 一个组件,它呈现已填好的表单的预览,当您单击左侧的表单时,它会在右侧显示它们。 第一个handleSwitchReview向我抛出了React钩子,所呈现的钩子比上一个呈现错误时要多 第二个不是。当我控制台日志道具,例如,我得到他们4-5次时,第一个函数的视图显示,但没有第二次,第二次只显示1次在控制台日志。 尝试移动setState并在控制台中记录父组件,但这个组件是唯一一个启动了很多次并中断的

  • 我有一个组件,我在其中调用我的自定义钩子。 自定义钩子如下所示: 而我在其中使用的导致错误的组件是: 有什么想法吗?

  • 我有一个组件看起来是这样的(非常简化的版本): 加载使用此组件的页面时,出现以下错误:我试图找到此错误的解释,但搜索未返回任何结果。 当我稍微修改组件时: 我再也不知道那个错误了。是因为我在由返回的jsx中包含了函数吗?如果能有一个解释为什么修复是有效的,那就太好了。

  • 我能用钩子解决这个问题吗? 为什么它不能正常工作? 我开始使用REACT DND,在我尝试使用拖放后,所有的事情都出了问题。 我将其用作依赖项: > “@testing-library/jest-dom”:“^4.2.4”, "@testing-library/react":"^9.5.0", 已部署项目-hunger-tree.surge.sh src/components/todos/crea

  • 我正在使用 React 的钩子,我希望有一个从数据库中检索到的值作为初始值。但是,我收到以下错误: 不变冲突:不变冲突:与上一次渲染相比,渲染的钩子更多。 我用的是反应阿波罗钩。 更新

  • 我有一个使用输入钩子组件,其工作原理如下: 它获取一个(input,inputName)并返回一个挂钩的输入组件。当我想动态地改变视图中现有输入的可见性时,我得到一个错误:渲染的钩子比之前渲染的多。