【问题标题】:Re-rendering the page when an element in the 2D array changes in react native expo当 2D 数组中的元素在 react native expo 中发生变化时重新渲染页面
【发布时间】:2020-07-03 10:18:50
【问题描述】:

每当邀请 [1] [1] 中的值发生更改时,我想重新运行以下代码以重新加载页面,我在另一个页面中使用 AsyncStorage 更新这些数组值,当我尝试以下操作时,我得到了下面的错误。 还有其他方法吗?

const [invitation, setInvitation] = React.useState(Array.from({length: 2},()=> Array.from({length: 2})));

  React.useEffect(()=>
  {
     getUserId();

  },invitation[1][1]);

    async function getUserId() {
      var keys = ["invitationFromURL","Alert"]
      try {
        await AsyncStorage.multiGet(keys , (err, item) => 
        {
          setInvitation(item);
        });
      } catch (error) {
        // Error retrieving data
        console.log(error.message);
      }
    }  


  console.log(invitation);
  console.log(invitation[1][1]);

我得到的错误 警告:%s 在此渲染期间收到了最后一个参数,但在上一次渲染期间未收到。即使最后一个参数是可选的,它的类型也不能在渲染之间改变。%s,useEffect

【问题讨论】:

  • 如果有人遇到我遇到的问题。我忘了把被监视的对象放在一个数组中,把它放在一个数组中消除了错误。

标签: javascript react-native expo use-effect use-state


【解决方案1】:

我猜你有类似的东西

const [invitation, setInvitation] = useState([[], []]);

在组件的顶部。这意味着在第一次 useEffect 运行时,invitation[1][1] 将为空。在第二次运行时,它将有一个值。这在 React Native 中是不洁的。当您调用useEffect 时,每次组件呈现时,最终参数都必须具有相同的类型

应该是一个简单的修复——而不是

useEffect(() => {
    getUserId();
  }, invitation[1][1]);

useEffect(() => {
    getUserId();
  }, invitation);

【讨论】:

  • 您建议的解决方案导致无限循环。
  • 啊,在这种情况下,我认为您实际上并不想在每次invitation 更改时重新触发 useEffect。只需从useEffect 中删除最后一个参数,看看是否可行。你在这里得到一个无限循环,因为每次组件呈现时你都在改变 invitation,并且每次 invitation 发生变异时组件都会呈现。
  • 如果我删除它,页面将永远不会刷新,为了更清楚,我在另一个页面中使用 AsyncStorage 保存一个变量,然后我导航到这个页面但是当我尝试读取和使用变量时我得到了以前保存的值,因为更改尚未反映,所以我需要重新渲染页面以重新运行代码,以便我可以使用新的保存值。我希望这很清楚。谢谢。
  • 即使没有最后一个参数,页面仍然可以从响应式更改中刷新。最后一个参数将专门重新触发 useEffect,而不是完整的重新渲染。您的用例听起来更像是您想要 redux、apollo 或任何其他反应式缓存。完成任务的另一种方法是将变量作为道具传递。
猜你喜欢
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
  • 2021-07-26
  • 2022-06-30
  • 1970-01-01
相关资源
最近更新 更多