使用 UseEffect() 时显示不更新

Display Not Updating when using UseEffect()

在将每个 IP 推送到一个空数组后,我正在尝试呈现一个 IP 地址数组。一旦阵列被填充,我就可以在控制台中正确地看到它,但由于某种原因,它拒绝显示在屏幕上,尽管它已映射。

变量:

var ipList = [];
let key = 0;
const [subnet, setSubnet]  = useState("");

这是第一个应该在组件挂载时立即触发的useEffect。这工作正常。

useEffect(() =>  {
    const callNativeCode = async () => {
      await ConnectedDevices.displayConnectedDevices( (arrayResponse) => {setArray(arrayResponse), console.log("FIRST NATIVE CALL" + arr)}, (error) => {console.log(error)}  );
  }
  callNativeCode();
  },[]) 

这是第二个 useEffect,一旦我们从本机 java 代码中获取子网,它就会用可 ping IP 填充空数组。也工作正常,我得到了我需要的数组。

useEffect(() => {
      const ipLoop = async () => {

      if( subnet != "")
      {
        for(let i = 1; i<=254; i++)
        {
          let ipAddress = subnet + "." + i;
          try{
            const ip = await Ping.start(ipAddress, {timeout: 100});  
            const { receivedNetworkSpeed,sendNetworkSpeed,receivedNetworkTotal,sendNetworkTotal } = await Ping.getTrafficStats(ipAddress, {timeout:1000});
            console.log(ipAddress + " Network Stats: " + receivedNetworkSpeed,sendNetworkSpeed,receivedNetworkTotal,sendNetworkTotal);
            key = i;
            ipList.push(key , ipAddress);
          }
          catch(error) 
          {
            console.log(i + " Error Code:  " + error.code + " ," + error.message)
          }
        }
        renderIPList();
      }
    }
    ipLoop();

  },[subnet]);

这是应该在屏幕上显示数组的渲染函数。日志工作正常,我可以按预期看到数组。它只是拒绝渲染。

  const renderIPList = () => {
    console.log("RENDERING IPS: ", ipList);
    return ipList.map((items,index) => {
      return (
        <View key={index}>
          <Text>{items}</Text>
        </View>
      );    
    });
  };

预先感谢您的帮助。

将您的 ipList 更改为从 useState 派生,如下所示:

const [ipList, setIpList] = useState([]);

并在 useEffect

中使用 setIpList

并且不要将 renderIpList() 作为来自 useEffect 的函数调用,它应该在组件 return 语句中。

因此,useEffect 应该更新状态,然后组件呈现状态。