除非刷新应用程序,否则 SET 方法第一次不起作用 - React Native

Posted

技术标签:

【中文标题】除非刷新应用程序,否则 SET 方法第一次不起作用 - React Native【英文标题】:SET method is not working the first time unless app is refreshed - React Native 【发布时间】:2021-11-21 05:34:59 【问题描述】:

我正在尝试 setPackages 中的 useEffect 一切正常,除了 setPackages 方法。它第一次不起作用,但是当我通过从 VS Code 中保存 CTRL+S 来刷新应用程序时,它起作用了,setPackages 起作用了。

以下是代码。

const [packages, setPackages] = useState([]);

useEffect(() => 
   const getPackages = async () => 
      Purchases.setDebugLogsEnabled(true);
      Purchases.setup("MY_KEY_HERE");
      try 
        const offerings = await Purchases.getOfferings();
        if (offerings.current !== null)     
           console.log(offerings.current.availablePackages); //This displays the data (works)
           setPackages(offerings.current.availablePackages); //This do not set the data in packages unless app refreshed
        else
            console.log("No offerings found");
        
       catch (e) 
         console.log("Error => " + e);
      
   
   getPackages();
,[])

我每次都需要刷新应用程序才能使这条线正常工作。这里可能有什么问题?

【问题讨论】:

你在useEffect中不调用getPackages,只是声明函数? 我叫它,让我更新代码。忘了说。 由于结果的 console.log() 有效,这意味着您实际上确实收到了预期的数据。我很好奇;您当前如何显示 packages 变量? 你可以试试这个setPackages([...offerings.current.availablePackages]); 吗? 【参考方案1】:

您正在声明该函数,但没有调用它。如果您希望在启动时调用一次而不是一遍又一遍地调用,则应该在 useEffect 中包含一个空的 deps 数组。

const [packages, setPackages] = useState([]);

useEffect(() => 
   const getPackages = async () => 
      Purchases.setDebugLogsEnabled(true);
      Purchases.setup("MY_KEY_HERE");
      try 
        const offerings = await Purchases.getOfferings();
        if (offerings.current !== null)     
           console.log(offerings.current.availablePackages); //This displays the data (works)
           setPackages(offerings.current.availablePackages); //This do not set the data in packages unless app refreshed
        else
            console.log("No offerings found");
        
       catch (e) 
         console.log("Error => " + e);
      
   ;
   getPackages();
,[])

【讨论】:

抱歉,我忘了添加我的代码,但我正在调用 getPackages 函数,这就是该函数中其他所有内容都有效的原因。 你还有包含空依赖数组的问题吗? 是的,先生。仍然是同样的问题,即使是空数组。【参考方案2】:

我可以建议this hook 处理您的packages-state 吗?

像这样使用它:

function MyComponent() 
  // Load packages (will be undefined while loading or updating)
  const packages = usePromiseMemo(() => 
    Purchases.setDebugLogsEnabled(true);
    Purchases.setup('MY_KEY_HERE');
    return Purchases.getOfferings().then(offerings => 
      if (offerings.current) 
        console.log(offerings.current.availablePackages); //This displays the data (works)
        return offerings.current.availablePackages;
       else 
        console.log('No offerings found');
      
      return undefined;
    );
  , []); // Alternatively: Replace [] with [Purchases]

  // Render
  return <div>More stuff here</div>;

我不知道Purchases来自哪里,但是如果它可能会发生变化,请将其添加到依赖数组中。

另外,如果 'MY_KEY_HERE' 存储在某个变量中,也将其添加到依赖数组中。

【讨论】:

以上是关于除非刷新应用程序,否则 SET 方法第一次不起作用 - React Native的主要内容,如果未能解决你的问题,请参考以下文章

除非我刷新页面,否则 Vue data() 对象输入 v-model 不起作用

除非应用程序已经在运行,否则 URL 方案侦听器不起作用

除非您离开应用程序并返回,否则按钮 onclick 事件在 iOS 中不起作用,然后它就起作用了

除非模拟器是 XS 类型,否则屏幕上的按钮不起作用

除非它等于0,否则声明一个变量不起作用[重复]

除非经过开发人员工具检查,否则 jCarousel 下一个按钮不起作用