当前位置: 首页 > 面试题库 >

反应多个上下文

公冶谦
2023-03-14
问题内容

我正在使用通过上下文传递的函数。

ChildComponent.contextType = SomeContext;

现在我用this.context.someFunction();。这可行。

如果我需要来自两个不同父组件的函数,该怎么办?


问题答案:

您仍然可以通过16.3 Context
API来使用子级功能消费者节点,这是React文档建议的做法:

// Theme context, default to light theme
const ThemeContext = React.createContext('light');

// Signed-in user context
const UserContext = React.createContext({
  name: 'Guest',
});

class App extends React.Component {
  render() {
    const {signedInUser, theme} = this.props;

    // App component that provides initial context values
    return (
      <ThemeContext.Provider value={theme}>
        <UserContext.Provider value={signedInUser}>
          <Layout />
        </UserContext.Provider>
      </ThemeContext.Provider>
    );
  }
}

function Layout() {
  return (
    <div>
      <Sidebar />
      <Content />
    </div>
  );
}

// A component may consume multiple contexts
function Content() {
  return (
    <ThemeContext.Consumer>
      {theme => (
        <UserContext.Consumer>
          {user => (
            <ProfilePage user={user} theme={theme} />
          )}
        </UserContext.Consumer>
      )}
    </ThemeContext.Consumer>
  );
}

要在组件的上下文中使用函数,通常将组件包装在HOC中,以便将上下文作为prop传递:

export const withThemeContext = Component => (
  props => (
    <ThemeContext.Consumer>
      {context => <Component themeContext={context} {...props} />}
    </ThemeContext.Consumer>
  )
)

const YourComponent = ({ themeContext, ...props }) => {
  themeContext.someFunction()
  return (<div>Hi Mom!</div>)
}

export default withThemeContext(YourComponent)

如果您正在运行React 16.8+,则还可以使用钩子更干净地执行此操作,而无需使用HOC:

import React, { useContext } from "react"

const YourComponent = props => {
  const theme = useContext(ThemeContext)
  const user = useContext(UserContext)
}

或者,如果您大量使用这些上下文,则可以制作一个自定义钩子以进一步简化操作:

const useTheme = () => useContext(ThemeContext)
const useUser = () => useContext(UserContext)

const YourComponent = props => {
  const theme = useTheme()
  const user = useUser()
}


 类似资料:
  • 问题内容: 到目前为止,我以前一直认为Web应用程序只能具有我们在 我这样想对吗? 我可以在一个Web应用程序中拥有多个调度程序Servlet吗?如果是,如何? 在什么情况下我们可能需要这样做? 整个Web应用程序中只能有一个应用程序上下文吗? 我们如何定义多个应用程序上下文? 非Spring应用程序中可以存在吗? 问题答案: 一个Web应用程序中可以有多个调度程序servlet吗? Web应用程

  • 我在Spring Boot应用程序中使用React Axios进行API调用。 我的应用程序上下文路径是test 当我在浏览器中启动应用程序时,http://localhost:8080/test,反应页面呈现。在页面呈现中,我正在调用服务 因此,预期调用应为http://localhost:8080/test/api/events,因为test是上下文根。但是,API调用中添加了测试。 只是打电

  • 我用的是Spring项目Reactor堆芯3.1.8。释放我正在为我的微服务实现一个日志框架,使其具有JSON审计日志,因此使用上下文来存储某些字段,如userID、collaboration ID、component Name和其他几个在请求生命周期中常见的字段。由于不能在反应式服务中用于存储这些元素,因此我必须使用上下文。但是,要了解上下文显然非常困难。我可以通过函数调用从信号中获取对上下文的

  • 问题内容: 试图使用es6在没有多个处理程序的情况下创建动态状态,但我陷入了困境。我不知道下面的代码有什么问题 我检查了我的其他函数,handleAdvancePrice是罪魁祸首,但是出了什么问题? 问题答案: 罪魁祸首是后面的多余迹象。另外,也不需要使用单独的; y,因为您可以直接使用

  • 问题内容: 在我的React应用程序中,我有一个网格。用户可以一次选择许多网格行,然后单击按钮以对选定的网格行执行批量操作。 在服务器端,单击批量操作后,我有一个脚本要针对每个选定的行执行(为了简化问题,我在下面的示例中为每个选定的行调用“ jsonplaceholder.typicode.com”)按钮。单击批量操作按钮时,将在操作创建器中获得selectedRows,在该操作器上遍历selec

  • 我有一个带有主窗口的应用程序。它有自己的线程和opengl上下文。这个应用程序每个处理器还有一个工作线程来创建和上传软件渲染的纹理。这工作得非常好。 我担心的是工作线程opengl上下文是使用主窗口的device_context创建的。因此,在双处理器系统的情况下,这意味着3个opengl上下文被绑定到同一个window device_context。它们都是在主窗口线程中创建的,然后调用shar