React 导航焦点事件侦听器 return 旧状态

React navigation focus event listener return old state

焦点事件侦听器内部返回旧值

如何在我的事件侦听器中获取当前 state/value,因为它当前正在返回旧值

  const [organizationName, setOrganizationName] = React.useState('');

      React.useEffect(() => {
        const unsubscribeNavigationFocus = props.navigation.addListener(
          'focus',
          async () => {
        try {     
          console.log(organizationName, 'OLD VALUE');
        
    
          // }
        } catch (error) {
          console.log('inside error');
          console.log(error);
    
        } finally {
    
        }
      }
        );
    
        return unsubscribeNavigationFocus;
      }, [props.navigation]);

@react-navigation/native: "5.8.10", react": "16.13.1", react-native: "0.63.4",

确保在每次渲染时重新添加事件监听器 useEffect 内部:

  1. 添加事件侦听器
  2. 删除事件侦听器
  3. 重新添加事件侦听器 应始终在每次 setState 调用时应用这些步骤。

例如:

useEffect(() => {focusElement.addEventListener(...);
return () => {
 focusElement.removeEventListener(...)},[dependencies])

所以每次你想要设置状态时,你都应该重新添加事件监听器。 希望这一切都清楚。

事件侦听器只会在初始渲染时了解组件的状态,而无法访问更新后的状态值。我建议您使用 useRef 创建对组件状态或组件状态的一些 属性 的引用:

const [someStateVal, setSomeStateVal] = React.useState("");
  const stateRef = useRef(""); //--> data that you want to use inside the listener

  const updateState = val => {
    stateRef.current = val;
    setSomeStateVal(val);
  };

  React.useEffect(() => {
    const unsubscribeNavigationFocus = props.navigation.addListener(
      "focus",
      async () => {
        try {
          console.log(stateRef.current, "UPDATED VALUE");

        } catch (error) {
          //...
        } finally {
          //...
        }
      }
    );

    return unsubscribeNavigationFocus;
  }, [props.navigation]);

您需要将您的状态添加到依赖数组

const [organizationName, setOrganizationName] = React.useState('');

React.useEffect(() => {
  const unsubscribeNavigationFocus = props.navigation.addListener(
    'focus',
    async () => {
      try {
        console.log(organizationName, 'OLD VALUE');

        // }
      } catch (error) {
        console.log('inside error');
        console.log(error);
      } finally {
      }
    }
  );

  return unsubscribeNavigationFocus;
}, [props.navigation, organizationName]);

使用 React 的官方 ESLint 插件来捕获此类问题https://www.npmjs.com/package/eslint-plugin-react-hooks