【问题标题】:What is the corrct way of running useEffect hook depending on state variable?根据状态变量运行 useEffect 钩子的正确方法是什么?
【发布时间】:2021-08-30 16:03:42
【问题描述】:

我正在编写一个相机应用程序。因此,当用户进入相机页面时,他们可以选择是否授予相机权限。我将他们的决定保存在变量 const [hasPermission, setHasPermission] = useState(null);我当前的使用效果函数中:

useEffect(() => {
    (async () => {
      const { status } = await Camera.requestPermissionsAsync();
      const audioPermissions = await Audio.requestPermissionsAsync();
      if (
        cameraPermissions.status === "granted" &&
        audioPermissions.status === "granted"
      ) {
        setHasPermission(true);
      }
    })();
  }, []);

当用户第一次运行应用程序时,这目前可以正常工作 - 他们授予权限,就是这样 - 我可以使用相机!

但是.....如果他们不授予许可怎么办。他们决定不使用相机,他们拒绝访问,后来他们改变了主意。例如 5 分钟后,他们再次打开“相机”页面并想要授予权限。这是我的问题。在当前情况下useEffect,即当您最初加载页面时,使用相机的请求将只显示一次。如果用户还没有授予权限,我如何强制它再次弹出?

我尝试了以下方法:

useEffect(() => {
    (async () => {
      const { status } = await Camera.requestPermissionsAsync();
      const audioPermissions = await Audio.requestPermissionsAsync();
      if (
        cameraPermissions.status === "granted" &&
        audioPermissions.status === "granted"
      ) {
        setHasPermission(true);
      }
    })();
  }, [hasPermission === null]);

但它没有工作。有什么建议吗?

【问题讨论】:

  • 如果该组件在 5 分钟后导航到它时没有重新安装,那么您需要找到一种方法来挂钩到导航事件,无论您使用什么导航,而不是简单的useEffect.

标签: javascript reactjs react-native use-effect


【解决方案1】:

您只需要传递重要的变量。无需检查其他任何内容。

  }, [hasPermission]);

【讨论】:

  • 初始权限为空;如果我没有设置它,它仍然是null,所以变量没有改变,因此它不会重新渲染
  • 而您要更改的唯一地方是在您的 useEffect 中?
  • 是的;我想在该页面的初始渲染中设置它 - 如果它是虚假的,我根本不显示 camrea,但如果用户稍后返回该页面,他们应该可以选择重置他们的权限
  • 从另一个页面返回该页面后,钩子不是再次运行吗?或者你的意思是在最小化他们的浏览器之后?
  • 你是对的。问题出在其他地方-出于某种原因,它不再要求许可。我授予了相机权限,而不是 audioPermissions,因此它搞砸了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多