【问题标题】:Access React Context via function通过函数访问 React Context
【发布时间】:2019-07-08 23:52:05
【问题描述】:

我目前正在开发一个包,它可以提供我的 React-widget 响应能力。问题是,响应不取决于视口宽度,而是取决于小部件容器元素的宽度。

目前我正在用<ResponsiveProvider> 包裹我的<App>。此提供程序订阅windows.resize 事件并将格式存储到上下文的值中。

如果格式发生变化,所有子元素都会重新渲染。没关系。

现在,对于基于当前小部件格式的显示/隐藏组件,我只需实现一个组件,该组件使用contextType 访问此上下文。

但我需要一个可以在应用程序的任何位置使用的函数,例如:ResponsiveUtil.isSmall()ResponsiveUtil.getCurrentFormat()

使信息(格式)可通过函数访问的最佳方法是什么?

谢谢

【问题讨论】:

  • 我不确定这是否可行,但我想到了 useContext 钩子。我什至不知道钩子是否在 RN 中。

标签: javascript reactjs react-native react-context


【解决方案1】:

我不确定这是否是最好的方法,但它会起作用。您可以设置一个全局事件侦听器,该事件侦听器将在每次组件中的格式更改时被调度。我为全球事件找到了一个包here,但编写自己的包也不难。使用react-native-event-listeners,它看起来像:

ResponsiveUtil.js

import { EventRegister } from 'react-native-event-listeners';

let format = {};

EventRegister.addEventListener('responsive-format-changed', data => {
    format = data;
});

const ResponsiveUtils = {
    getCurrentFormat() {
        return Object.assign({}, format);
    },
    isSmall() {
        //isSmall logic
    }
};

export default ResponsiveUtils;

然后,在您的 <ResponsiveProvider> 中,在 resize 事件期间,在您更新上下文时调度新格式

ResponsiveProvider.js

import { EventRegister } from 'react-native-event-listeners';
//...Other component code
window.resize = () => {
    let format = calculateNewFormat();
    //update context...
    //dispatch new format
    EventRegister.emit('responsive-format-changed', format);
};

【讨论】:

  • 嗨!我有一个类似的方法:我将 ResponsiveUtil 设置为 Singleton,并从 ResponsiveProvider 和我的组件中使用它。这很好用,但是:如果组件不使用 ResponsiveContext,它们不会重新渲染。因此,如果在组件中设置静态 contextType(我想避免),如果格式更改,组件将重新渲染,并且可以通过 ResponsiveUtil.xy() 访问格式。但是如果我删除 contextType,组件不会重新渲染。
猜你喜欢
  • 2018-09-23
  • 1970-01-01
  • 2021-08-22
  • 2011-09-06
  • 2014-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多