首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >钩子useFetch改进机四次

钩子useFetch改进机四次
EN

Stack Overflow用户
提问于 2022-03-31 00:37:48
回答 1查看 174关注 0票数 1

Reactjs v17,axios,react-路由器-dom v6.

钩子useFetchAndLoad执行4次渲染。

我知道有两种呈现,第一种是加载组件,然后是useEffect。但另外两个人呢?然后我读到让渲染它四次。删除StricMode,但它仍然呈现4次。

我想我有它:加载组件、useEffect、response.data、setLoading(false)。这里有4幅渲染图。这是对的?

问:渲染四次可以吗?

代码语言:javascript
复制
    import axios from "axios";
    import { useEffect, useState } from "react";
  
    export function useFetchAndLoad(id) {

      const [response, setResponse] = useState({});
      const [error, setError] = useState(null);
      const [loading, setLoading] = useState(false);     
      
      useEffect(() => {
        const controller = new AbortController();

        const llamarEndPoint = async () => {
          setLoading(true);     
          try {
            const response = await axios.get(`https://rickandmortyapi.com/api/character/${id}`, { signal: controller.signal });
            setResponse(response.data);
          } catch (error) {
            setError(error.message);        
          } finally {
            setLoading(false);
          }      
        }

        llamarEndPoint();

        return () => {
          setLoading(false);
          controller.abort();
        }
      }, [id]);
      console.log(response) 
      if (response ) {
        
      }

      return { loading, response, error };
    }
代码语言:javascript
复制
    import React, { 
    } from 'react'
    import { 
      Link,
      Outlet, 
      useLocation,
    } from 'react-router-dom';


    const RickAndMorty = () => {

      const location = useLocation();
      console.log(location);
      // console.log("4 Links")
      return (
        <div>
          <h1>Rick and Morty</h1>
        
          <ul>
            <li><Link to="1">Rick</Link></li>
            <li><Link to="2">Morty</Link></li>
            <li><Link to="3">3otro</Link></li>
            <li><Link to="4">4otro</Link></li>
          </ul>
          
          <article>
            <Outlet />
          </article>

        </div>
      )
    }

    export default RickAndMorty
代码语言:javascript
复制
    import {useParams} from 'react-router-dom';
    import { useFetchAndLoad } from '../../hook/useFetchAndLoad';

    const Api = () => {

      const params = useParams();
      const id = parseInt(params.id);
      
      const { loading, response, error } = useFetchAndLoad(id);
     
      return (
        <article>
          <h1>Api</h1>
          {loading ? <p>Loading...</p> : response.name ?? error}
     
        </article>
      )
    }

    export default Api; 
代码语言:javascript
复制
useFetchAndLoad.js:36 {}
useFetchAndLoad.js:36 {}
useFetchAndLoad.js:36 {id: 2, name: 'Morty Smith'}
useFetchAndLoad.js:36 {id: 2, name: 'Morty Smith'}
EN

回答 1

Stack Overflow用户

发布于 2022-03-31 06:01:17

你没有记录loading,但我最好的猜测是,如果你是,你会看到

代码语言:javascript
复制
useFetchAndLoad.js:36 loading = false {}
useFetchAndLoad.js:36 loading = true {}
useFetchAndLoad.js:36 loading = true {id: 2, name: 'Morty Smith'}
useFetchAndLoad.js:36 loading = false {id: 2, name: 'Morty Smith'}

所以是的,一切都很正确。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71685619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档