React Native 组件不会在计算后立即更新

用户3701240

我在屏幕上有一个组件列表。每个组件对 useEffect 进行计算。我希望他们在完成每个计算后立即更新,但在所有计算完成后它们都会更新。

我做错了什么?

组件示例:

import React, {useEffect, useState} from 'react';
import {View, Text} from 'react-native';

const Teste = () => {
  const Item = props => {
    const [tempo, setTempo] = useState('calculando...');

    useEffect(() => {
      const inicio = new Date();
      const rdm = Math.random();
      sleep(rdm * 1000 + 2000);
      setTempo(`${new Date() - inicio} millisegundos`);
    }, []);

    const sleep = milliseconds => {
      const date = Date.now();
      let currentDate = null;
      do {
        currentDate = Date.now();
      } while (currentDate - date < milliseconds);
    };

    return (
      <View style={{marginBottom: 20}}>
        <Text>Item {props.nome}</Text>
        <Text>Tempo - {tempo}</Text>
      </View>
    );
  };

  return (
    <View style={{padding: 40}}>
      <Item nome="1" />
      <Item nome="2" />
      <Item nome="3" />
    </View>
  );
};

export default Teste;

菲尔

这里有两个问题...

  1. 那个sleep功能,我真的做不到
  2. 您已经在Item组件内部定义了Teste组件,这意味着每当Teste渲染时,Item都会重新定义

我建议Item搬出Teste并使用基于承诺的睡眠

const sleep = (ms) => {
  let timer;
  const promise = new Promise(r => {
    timer = setTimeout(r, ms);
  });
  return [ promise, () => { clearTimeout(timer); } ];
};

const Item = ({ nome }) => {
  const [tempo, setTempo] = useState('calculando...');

  useEffect(() => {
    const inicio = new Date();
    const rdm = Math.random();
    const [ delay, cancel ] = sleep(rdm * 1000 + 2000);
    delay.then(() => {
      setTempo(`${new Date() - inicio} millisegundos`);
    });

    return cancel; // make sure timeout is cleared on unmount
  }, []);

  return (
    <View style={{marginBottom: 20}}>
      <Text>Item {nome}</Text>
      <Text>Tempo - {tempo}</Text>
    </View>
  );
};

const Teste = () => (
  <View style={{padding: 40}}>
    <Item nome="1" />
    <Item nome="2" />
    <Item nome="3" />
  </View>
);

这里sleep()返回一个在超时到期后解决的承诺,以及一个在卸载组件时取消延迟的函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

组件的 prop 不会在带有 Redux 的 React Native 中更新

React Native:基于Array.map()的渲染组件不会在状态更改时更新

React Native ListView不会在排序时或检索新数据后更新

已解决:React Redux的useSelector不会在expo react-native上更新存储状态

Flex 不会在 React Native 中平均拆分组件

React Native更改let值不会在子组件中作为prop更改

React-native:组件不会在android屏幕下渲染超过特定点

为什么我的Animated API组件不会在React Native中显示?

React Native useState Hook 不会立即更新

State 不会在 react-native 中使用 AsyncStorage 更新其值

React Native ListView不会在数据更改时更新

使用 React Native 和 Hooks 时,状态不会在 Jest 测试期间更新

React 组件不会在更新状态时更新

React Native Firebase onStateChanged不会在卸载时退订

react-native android 不会在设备上运行

React Native 不会在 DOM 更改时重新渲染

React JS组件不会在状态更改时更新

React - 道具不会在整个组件中更新相同

React Native不会更新子组件的道具

React Native - React Hooks - useState 不会立即更新我的状态

如何在React Native中正确使用仅iOS组件而不会在Android中出现错误

Settimer 在延迟后只调用一次,但是,它不会在 React Native 中重复调用

PrevState不会在React JS中立即更新状态值

React Native - 组件回调第一次为视图设置动画,但不会在后续调用中设置动画

React Native 组件不会随着状态变化而更新

React Native WebView App不会在按返回按钮时退出

React Native版本构建不会在启动屏幕之前加载

在React Native中滚动浏览FlatList不会在Android中提供对讲消息

React Native运行无错误不会在设备上启动?