React Native - 重新安装/重置/重新加载屏幕的最佳方式是什么?

React Native - Whats the best way to remount / reset / reload a screen?

在 React-Native 中,有没有一种方法(或多种方法)可以重新挂载或重新加载整个屏幕?

我正在构建一个计算器,如果我按照以下步骤操作: https://facebook.github.io/react-native/docs/refreshcontrol.html

它仍然没有重置输入字段。当然,我可以编写代码来重置屏幕上的每个字段,但是是否有一种通用的方法来刷新屏幕?

例如,如果我只是转到另一个屏幕并返回到此屏幕,则使用导航器,数据从字段中消失,并且再次全部为 0.0。如何实现?

这里是组件的第一个节点,所有东西都在里面

<ScrollView refreshControl={<RefreshControl
refreshing={this.state.refreshing} onRefresh={this.refreshMe.bind(this)} />}
>
.
.
.
.
.
.
</ScrollView>

谢谢

React 中一个经常使用的 hack 是更改组件的 key 道具以强制重新安装视图:

class Thing extends React.Component {
  state = {
    uniqueValue: 1
  }
  forceRemount = () => {
    this.setState(({ uniqueValue }) => ({
      uniqueValue: uniqueValue + 1
    });
  }
  render() {
    return (
      <View key={this.state.uniqueValue}>
        <Button onPress={this.forceRemount} />
      </View>
    )
  }
}

React 使用元素键来跟踪要更新的元素,如果键被更改,React 将断定先前的元素不再存在,因此将删除它并创建 "new" 元素。

也就是说,只有当您要清除的状态存储在子组件树中的有状态组件中时(例如 uncontrolled TextInput 没有其 value 道具组).

一个更简洁的解决方案是让你所有的子组件 controlled 这样你的组件的 UI 是它的 props 和状态的纯函数,并且简单地重置组件状态:

const initialState = {
  //...
}

class Thing extends React.Component {
  state = initialState;
  resetState = () => {
    this.setState(initialState);
  }
  render() {
    return (
      <View}>
        <Button onPress={this.resetState} />
      </View>
    )
  }
}

我的方案是用redux让第二个页面刷新全局状态。然后在第一页(当你返回时),根据全局状态中元素的变化,使用 useEffect 刷新想要的数据。 来自父(第一)页:

import { useSelector } from 'react-redux';
const contacts_update = useSelector( state => state.contact.profile)

useEffect(() => {
  loadContacts();
}, [contacts_update]);

您可以添加 // @refresh reset => https://reactnative.dev/docs/fast-refresh#tips