Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在react中获取数据的最佳方法是什么? 我目前使用contentful进行数据管理,因此这次不是通常的axios/fetch方法。_Javascript_Reactjs - Fatal编程技术网

Javascript 在react中获取数据的最佳方法是什么? 我目前使用contentful进行数据管理,因此这次不是通常的axios/fetch方法。

Javascript 在react中获取数据的最佳方法是什么? 我目前使用contentful进行数据管理,因此这次不是通常的axios/fetch方法。,javascript,reactjs,Javascript,Reactjs,我使用useContext将数据共享给我的组件,并使用useEffect设置新数据的状态。你问什么问题丑陋的语法。当我在第二个重新渲染器中传递数据时,我无法立即访问数据,数据[0][0]还不存在,因此它会抛出一个错误。这导致了这种令人厌恶的语法:{data?data[0].sys.contentType.sys.id:“}它可能“很好”,而且“有效”。但在我看来,这简直太残忍了 App.jsx const-App=()=>{ const contentfulHook=useState(null)

我使用useContext将数据共享给我的组件,并使用useEffect设置新数据的状态。你问什么问题丑陋的语法。当我在第二个重新渲染器中传递数据时,我无法立即访问数据,
数据[0][0]
还不存在,因此它会抛出一个错误。这导致了这种令人厌恶的语法:
{data?data[0].sys.contentType.sys.id:“}
它可能“很好”,而且“有效”。但在我看来,这简直太残忍了

App.jsx

const-App=()=>{
const contentfulHook=useState(null);
使用效果((e)=>{
然后((res)=>contentfulHook[1](res.items));
/*
或-相同的结果
(异步()=>{
const data=wait client.getEntries()。然后((res)=>res.items);
contentfulHook[1](等待数据);
})();
*/
//加载内容时移除预加载程序
设置超时(()=>{
const preload=document.getElementById(“预加载程序”);
preload.style.opacity=0;
Preload.addEventListener(“transitionend”,(e)=>{
预加载。移除();
});
}, 0);
}, []);
console.log(contentfulHook[0]);
返回(
);
};
render(,document.getElementById(“根”));

关于这个问题,我有两个建议:

  • 将该请求逻辑封装在自定义挂钩中,以便可以从组件中删除该代码
  • 使用
    数据
    加载
    错误
    模式(Apollo和其他库可能使用)
  • 结果是:

    const-App=()=>{
    const{data,loading,error}=useRequest();
    返回(
    );
    };
    常量useRequest=()=>{
    const[data,setData]=useState(null)
    常量[loading,setLoading]=useState(false)
    const[error,setError]=useState(null)
    useffect(()=>{
    设置加载(真)
    client.getEntries()
    .然后((res)=>setData(res.items))
    .catch((e)=>setError(e))
    .最后(()=>{
    移除预加载程序();
    设置加载(假);
    });
    }, []);
    返回{数据,加载,错误};
    }
    常量RemovePreload=()=>{
    设置超时(()=>{
    const preload=document.getElementById(“预加载程序”);
    preload.style.opacity=0;
    Preload.addEventListener(“transitionend”,(e)=>{
    预加载。移除();
    });
    }, 0);
    }
    render(,document.getElementById(“根”));
    
    无论哪种方式,在渲染时访问
    数据
    属性之前,仍然需要检查数据。即使它处于顶级状态,如:

    const-App=()=>{
    const{data,loading,error}=useRequest();
    返回(
    {data&&{data[0].sys.contentType}
    );
    };
    
    关于这个问题,我有两个建议:

  • 将该请求逻辑封装在自定义挂钩中,以便可以从组件中删除该代码
  • 使用
    数据
    加载
    错误
    模式(Apollo和其他库可能使用)
  • 结果是:

    const-App=()=>{
    const{data,loading,error}=useRequest();
    返回(
    );
    };
    常量useRequest=()=>{
    const[data,setData]=useState(null)
    常量[loading,setLoading]=useState(false)
    const[error,setError]=useState(null)
    useffect(()=>{
    设置加载(真)
    client.getEntries()
    .然后((res)=>setData(res.items))
    .catch((e)=>setError(e))
    .最后(()=>{
    移除预加载程序();
    设置加载(假);
    });
    }, []);
    返回{数据,加载,错误};
    }
    常量RemovePreload=()=>{
    设置超时(()=>{
    const preload=document.getElementById(“预加载程序”);
    preload.style.opacity=0;
    Preload.addEventListener(“transitionend”,(e)=>{
    预加载。移除();
    });
    }, 0);
    }
    render(,document.getElementById(“根”));
    
    无论哪种方式,在渲染时访问
    数据
    属性之前,仍然需要检查数据。即使它处于顶级状态,如:

    const-App=()=>{
    const{data,loading,error}=useRequest();
    返回(
    {data&&{data[0].sys.contentType}
    );
    };
    
    您可以使用数组分解吗?这就是通常使用的:
    const[value,setValue]=contentfulHook
    我想在provider中同时传递readState和setState,语法与App.jsx中的语法类似,因此如果需要,我可以同时使用这两种语法是的,这就是我在示例中分解
    contentfulHook
    的原因。问题更多的是必须检查undefined/null,而不是索引到useState返回的内容吗?是的,我发现语法难看且令人不快。我希望能够使用数据,而不必有条件地检查数据是否存在嗯,是的,我理解。这是可以解决的问题。我想已经可以用悬念了。你能用数组解构吗?这就是通常使用的:
    const[value,setValue]=contentfulHook
    我想在provider中同时传递readState和setState,语法与App.jsx中的语法类似,因此如果需要,我可以同时使用这两种语法是的,这就是我在示例中分解
    contentfulHook
    的原因。问题更多的是必须检查undefined/null,而不是索引到useState返回的内容吗?是的,我发现语法难看且令人不快。我希望能够使用数据,而不必有条件地检查数据是否存在嗯,是的,我理解。这是可以解决的问题。我想已经有悬念了。