最佳方法从 JSON API 中附加数据 React Native

huangapple go评论107阅读模式
英文:

Best Way to Append data from json api React Native

问题

在主屏幕上,我从JSON API获取数据并附加到数据状态变量。每次API调用都会提供10次。但问题是,在达到50-60个项目之后,应用程序变得非常慢(甚至在移动设备上冻结1-2分钟)。当我尝试找出问题时,对每个项目的迭代进行了控制,我发现在将数据附加到“setData”状态时发生了不必要的重新渲染。请查看下面的详细问题:

  1. import React, { useState, useEffect } from 'react';
  2. import { View, Text, Button, FlatList } from 'react-native';
  3. const API_URL = 'https://my-api-url.com/data';
  4. const App = () => {
  5. const [data, setData] = useState([]);
  6. useEffect(() => {
  7. fetchData();
  8. }, []);
  9. const fetchData = async () => {
  10. try {
  11. const response = await fetch(API_URL);
  12. const jsonData = await response.json();
  13. setData(jsonData);
  14. } catch (error) {
  15. console.error(error);
  16. }
  17. };
  18. const loadMoreData = async () => {
  19. try {
  20. const response = await fetch(API_URL);
  21. const jsonData = await response.json();
  22. setData([...data, ...jsonData]);
  23. } catch (error) {
  24. console.error(error);
  25. }
  26. };
  27. return (
  28. <View>
  29. <FlatList
  30. data={data}
  31. renderItem={({ item }) => <Text>{item.name}</Text>}
  32. keyExtractor={(item) => item.id.toString()}
  33. />
  34. <Button title="Load more" onPress={loadMoreData} />
  35. </View>
  36. );
  37. };
  38. export default App;
英文:

In Homescreen, I am fetching data from json api and appending to data state variable. Each api call give 10 times. But the problem is, After 50 - 60 items app becomes very slow (even mobile freeze for 1-2 minutes). When I try to figure out the problem, and consoling each iterating of items, I seen the unnecessary re-renders while fetching to appending data to "setData" state. Look at the detailed problem below:

  1. import React, { useState, useEffect } from &#39;react&#39;;
  2. import { View, Text, Button, FlatList } from &#39;react-native&#39;;
  3. const API_URL = &#39;https://my-api-url.com/data&#39;;
  4. const App = () =&gt; {
  5. const [data, setData] = useState([]);
  6. useEffect(() =&gt; {
  7. fetchData();
  8. }, []);
  9. const fetchData = async () =&gt; {
  10. try {
  11. const response = await fetch(API_URL);
  12. const jsonData = await response.json();
  13. setData(jsonData);
  14. } catch (error) {
  15. console.error(error);
  16. }
  17. };
  18. const loadMoreData = async () =&gt; {
  19. try {
  20. const response = await fetch(API_URL);
  21. const jsonData = await response.json();
  22. setData([...data, ...jsonData]);
  23. } catch (error) {
  24. console.error(error);
  25. }
  26. };
  27. return (
  28. &lt;View&gt;
  29. &lt;FlatList
  30. data={data}
  31. renderItem={({ item }) =&gt; &lt;Text&gt;{item.name}&lt;/Text&gt;}
  32. keyExtractor={(item) =&gt; item.id.toString()}
  33. /&gt;
  34. &lt;Button title=&quot;Load more&quot; onPress={loadMoreData} /&gt;
  35. &lt;/View&gt;
  36. );
  37. };
  38. export default App;

答案1

得分: 1

Sure, here's the translated code:

  1. const App = () => {
  2. const [data, dispatchData] = useReducer((state, actionData) => ([...state, ...actionData]), []);
  3. useEffect(() => {
  4. fetchData();
  5. }, []);
  6. const fetchData = async () => {
  7. try {
  8. const response = await fetch(API_URL);
  9. const jsonData = await response.json();
  10. dispatchData(jsonData);
  11. } catch (error) {
  12. console.error(error);
  13. }
  14. };
  15. const loadMoreData = async () => {
  16. try {
  17. const response = await fetch(API_URL);
  18. const jsonData = await response.json();
  19. dispatchData(jsonData);
  20. } catch (error) {
  21. console.error(error);
  22. }
  23. };
  24. const renderItem = useCallback(({ item }) => <Text>{item.name}</Text>, []);
  25. return (
  26. <View>
  27. <FlatList
  28. data={data}
  29. renderItem={renderItem}
  30. keyExtractor={(item) => item.id.toString()}
  31. />
  32. <Button title="Load more" onPress={loadMoreData} />
  33. </View>
  34. );
  35. };
  36. export default App;
英文:
  1. const App = () =&gt; {
  2. const [data, dispatchData] = useReducer((state, actionData) =&gt; ([...state, ...actionData]), []);
  3. useEffect(() =&gt; {
  4. fetchData();
  5. }, []);
  6. const fetchData = async () =&gt; {
  7. try {
  8. const response = await fetch(API_URL);
  9. const jsonData = await response.json();
  10. dispatchData(jsonData);
  11. } catch (error) {
  12. console.error(error);
  13. }
  14. };
  15. const loadMoreData = async () =&gt; {
  16. try {
  17. const response = await fetch(API_URL);
  18. const jsonData = await response.json();
  19. dispatchData(jsonData);
  20. } catch (error) {
  21. console.error(error);
  22. }
  23. };
  24. const renderItem = useCallback(({ item }) =&gt; &lt;Text&gt;{item.name}&lt;/Text&gt;, []);
  25. return (
  26. &lt;View&gt;
  27. &lt;FlatList
  28. data={data}
  29. renderItem={renderItem}
  30. keyExtractor={(item) =&gt; item.id.toString()}
  31. /&gt;
  32. &lt;Button title=&quot;Load more&quot; onPress={loadMoreData} /&gt;
  33. &lt;/View&gt;
  34. );
  35. };
  36. export default App;

That should be enough.

huangapple
  • 本文由 发表于 2023年3月9日 14:24:53
  • 转载请务必保留本文链接:https://go.coder-hub.com/75681075.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定