【问题标题】:React Native sharing constants and hooks between functional componentsReact Native 在功能组件之间共享常量和钩子
【发布时间】:2021-07-29 14:36:26
【问题描述】:

我的问题在标题中:在 react native 中,是否可以在多个功能组件之间共享 hooks?例如,如果我想在功能组件之间共享函数和常量,我可以这样做:

文件1.tsx:

//outside the functional component
export const _file1function = function(){
   return "This came from file1" ;
}
export default function File1 () {
  ....
}

文件2.tsx:

import * as f1 from './File1'
export default function File2 () {
...
    f1._file1function() //is valid
...
}

但是,如果我尝试复制类似的行为,并使用挂钩导出常量:

export const [test, setTest] = React.useState(0);
export const _hookfunction = function(){
   setTest(1);
   return true;
}

我收到以下错误:

Error: Invalid hook call. Hooks can only be called inside of the body of a function component.

因此,我似乎只需将这些常量和函数放在一个函数组件中,如下所示:

export default function HookTest() {
  const [test, setTest] = React.useState(0);
   const _hookfunction = function(){
       setTest(1);
       return true;
   }
}

现在这看起来像是一个使用钩子的普通反应原生应用程序。如何从另一个脚本访问这些函数和常量?功能组件和屏幕之间可以共享钩子吗?如果没有,是否有其他方法可以获得这种行为,或者这是否完全违背了 React 的基本原理?

【问题讨论】:

  • 你可以编写一个自定义钩子,但是你希望每个组件共享相同的test 值吗?如果一个组件更新了该值,其他组件需要接收更新的值吗?
  • 是的,我希望在访问它的所有组件之间共享该值

标签: reactjs react-native react-hooks


【解决方案1】:

如果您需要每个组件访问对相同值的相同引用,那么您需要使用React Context

如果你想看一些例子,这里有一些链接:

【讨论】:

  • 据我所知,值是直接更改的,而不是通过设置常量的新状态,然后调用重新渲染来获取新值。这是真的? React context 如何影响应用的渲染周期?
  • @figbar 一个反应上下文本质上是一个值的容器,它可以是一切(对象等)。每次上下文中的值发生变化时,订阅该上下文的每个组件都会收到通知,因此会重新渲染。当然这是一个非常基本的解释,如果您阅读答案中发布的链接,您会更好地理解。
  • 好的,我正在尝试使用 Context,但在更改存储值时遇到了一些问题。 stackoverflow.com/questions/68583648/…。你有什么可以帮忙的机会吗?
  • @figbar 这个问题有一个答案,我认为是正确的。您需要包装所有需要访问上下文的组件,因此您必须将 Provider 在层次结构中向上移动。
【解决方案2】:

您将编写一个自定义钩子以在功能组件之间共享逻辑

export default function useMyHook() {
   const [test, setTest] = React.useState(0);

   const _hookfunction = function(){
       setTest(1);
       return true;
   };

   // Then you can return anything you want
   return [test, _hookfunction];
}

在你的组件中

export default function HookTest() {
   const [test, setTest] = useMyHook();
}

【讨论】:

  • 抱歉,我忘记指定我希望所有访问它的组件共享并能够更改相同的值
猜你喜欢
  • 2016-03-22
  • 2020-10-04
  • 2018-09-07
  • 2022-10-06
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
  • 2022-10-12
  • 2020-02-13
相关资源
最近更新 更多