在goBack()上刷新上一个屏幕

Adn*_*Ali 15 react-router react-native react-native-android react-native-ios react-native-navigation

我是React Native的新手.如何通过调用返回到它之前刷新/重新加载以前的屏幕goBack()

可以说我们有3个屏幕A,B,C:

A -> B -> C
Run Code Online (Sandbox Code Playgroud)

当我们goBack()从屏幕C 运行时,它返回到屏幕B但是具有旧的状态/数据.我们怎样刷新它?第二次没有调用构造函数.

Onu*_*ker 31

如何使用 useIsFocused 钩子?

https://reactnavigation.org/docs/function-after-focusing-screen/#re-rendering-screen-with-the-useisfocused-hook

const componentB = (props) => { 
  // check if screen is focused
  const isFocused = useIsFocused();

  // listen for isFocused, if useFocused changes 
  // call the function that you use to mount the component.

  useEffect(() => {
    updateSomeFunction()
  },[isFocused]);
}
Run Code Online (Sandbox Code Playgroud)

  • 对于初学者来说这是最简单的方法。我不知道为什么这个答案不在顶部。 (3认同)
  • 对我有用,谢谢。我刚刚添加了 `useEffect(() => {isFocused && updateSomeFunction() },[isFocused]);` 以仅在聚焦时获取数据 (3认同)
  • @rafwell 我不是初学者,但我喜欢答案的简单性。 (2认同)

Muk*_*han 29

在callBack中添加Api调用可以解决问题

componentDidMount() {
    this.props.fetchData();
    this.willFocusSubscription = this.props.navigation.addListener(
      'willFocus',
      () => {
        this.props.fetchData();
      }
    );
  }

  componentWillUnmount() {
    this.willFocusSubscription.remove();
  }
Run Code Online (Sandbox Code Playgroud)

  • 必须仅使用“焦点”才能使其发挥作用。“willFocus”和“didFocus”不起作用 (4认同)
  • `Mukundhan`,`willFocus` 会在 `goBack()` 之后自动启动吗?所有重新获取的数据都进入“fetchData()”吗? (2认同)
  • 是的,带有“willFocus”事件的“navigation”对象上的“addListener”就达到了目的。谢谢你! (2认同)

kva*_*aaz 19

对于 react-navigation 5.x 使用

5.x

componentDidMount() {
  this.loadData();

  this.focusListener = this.props.navigation.addListener('focus', () => {
    this.loadData();
    //Put your Data loading function here instead of my this.loadData()
  });
}
Run Code Online (Sandbox Code Playgroud)

对于功能组件

function Home({ navigation }) {
  React.useEffect(() => {
    const unsubscribe = navigation.addListener('focus', () => {
      loadData();
      //Put your Data loading function here instead of my loadData()
    });

    return unsubscribe;
  }, [navigation]);

  return <HomeContent />;
}
Run Code Online (Sandbox Code Playgroud)


小智 15

在你的屏幕上 B 构造函数会像魔术一样工作:)

    this.props.navigation.addListener(
          'didFocus',
          payload => {
            this.setState({is_updated:true});
          }
    );
Run Code Online (Sandbox Code Playgroud)


Bat*_*Bat 8

是的,构造函数只被第一次调用,你不能调用它两次。

第一:但是您可以将数据 getter/setter 与构造函数分开并将其放入一个函数中,这样您就可以将函数传递给下一个场景,并且无论何时返回,您都可以简单地调用该函数。

更好:您可以在第一个场景中创建返回功能,该功能在返回时也会更新场景并将返回功能向下传递。这样第二个场景就不会知道你的更新功能是合理的。

最佳:您可以使用 redux 并在第二个场景中发送返回动作。然后在您的减速器中,您负责返回并刷新您的场景。

  • 可能当你写这个答案时,reactn 不存在。帮自己一个忙:放弃 redux(永远)并切换到 [reactn](https://www.npmjs.com/package/reactn)。 (2认同)
  • 我指的不是这个具体问题,而是对 redux 的热情,它应该被称为软件历史上最复杂的方法之一(来源:25 年的软件开发)。正如您从下面的答案中看到的,其他人已经找到了 2-3 行解决方案来解决同样的问题。 (2认同)

小智 5

React-Navigation附带的内置侦听器功能将是最简单的解决方案。每当通过向后导航将某个组件再次“聚焦”到该组件时,侦听器就会触发。通过编写一个loadData函数,该函数在加载组件时和通知侦听器时均可以调用,您可以在向后导航时轻松地重新加载数据。

   componentWillMount(){
    this._subscribe = this.props.navigation.addListener('didFocus', () => {
     this.LoadData();
     //Put your Data loading function here instead of my this.LoadData()
    });}
Run Code Online (Sandbox Code Playgroud)


小智 5

简单的!将函数插入到里面useFocusEffect(func)

import { useFocusEffect } from '@react-navigation/native' 
Run Code Online (Sandbox Code Playgroud)