从旧的 Context API 提供程序实现中获取 React Context

问题描述 投票:0回答:1

我在 React 中使用一个 library,它使用 legacy context API 实现了一个提供者。

这是实现:

import { Component, Children } from "react";
import PropTypes from "prop-types";
import Registry from "./registry";

class ConduitProvider extends Component {
  constructor(props) {
    super(props);
    const { registry } = this.props;

    this.registry = registry ? registry : new Registry();
  }

  getChildContext() {
    return { registry: this.registry };
  }

  render() {
    return Children.only(this.props.children);
  }
}

ConduitProvider.childContextTypes = {
  registry: PropTypes.object.isRequired,
};

export default ConduitProvider;

有没有一种方法可以将提供者转换为您可以通过 React 中的 nowadays context 挂钩获得的上下文?你会得到的那个

const MyContext = React.createContext(defaultValue);

我有一个组件需要转发内部使用的所有上下文,我正在尝试使用内部使用该库的不同组件。

我已经尝试过将组件的内容包装在

Provider
中,但这行不通,因为组件需要上下文。 我还尝试以多种方式创建上下文。最乐观的是使用库中的
Registry
创建一个新的提供者,但我无法让它工作。

reactjs typescript react-hooks react-context legacy
1个回答
1
投票

Edit:我没有意识到 transform 你不是指代码,而是消费和重新提供。从理论上讲,您只需执行以下操作,但您的

ConduitProvider
也会采用遗留的
context
参数。通常情况下,分叉和升级库是一个更好的主意,这样你就不会被 React 的过时版本所束缚,但是由于这个特性是 React (Portals) 的原生特性,所以你根本不需要库。


上下文本身没有太多要重写的,但是您必须更新所有孩子以现代方式使用上下文(理想情况下

useContext
)。

export const ConduitContext = React.createContext({})

export const ConduitProvider = ({ registry, ...rest }) => {
  const [registry, setRegistry] = useState(registry || new Registry())

  return (
    <ConduitContext.Provider value={registry} {...rest} />
  )
}

export const useRegistry = () => React.useContext(RegistryContext)

然后您将使用提供者组件包装您的组件:

() => (
  <ConduitProvider registry={someValueIfAvailable}>
    {/* Your components */}
  </ConduitProvider>
)

然后你的组件会做这样的事情:

const Foo = () => {
  const registry = useRegistry()

  // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.