reactjs - 如何让组件知道哪个上下文调用该组件?

标签 reactjs react-context

假设我有一个组件和两个上下文。两种上下文都可以使用该组件。当 context1 使用它时,组件应该自己执行 const context=useContext(Context1) 。当 context2 使用它时,组件本身应该执行 const context=useContext(Context2) 。但是这个组件如何知道现在哪个上下文正在使用它并执行指令呢?

好吧,我会给出一个简单的例子,但实际情况比它更复杂,例如,Common 被包装了很多次,并且两个组件看起来不同。

通用组件

export default function Common(){
  const context=useContext(/*one of the context*/);
  context.setData(newData);
  return (
     <div>{context.data}</div>
  )
}

组件1

export const Context1 = createContext({ data, setData });

export default function Component1() {
  <Context1.Provider value={{data, setData }}>
     <Common />
  </Context1.Provider>
}

组件2

export const Context2 = createContext({ data, setData  });

export default function Component2() {
  <Context2.Provider value={{data, setData }}>
     <Common />
  </Context2.Provider>
}

最佳答案

如果您有一个组件必须选择要使用的上下文,我认为您应该重新考虑您的设计。如果您能解释这两个上下文是什么以及组件如何处理它们,那么帮助会更容易,但您似乎不愿意详细说明。

是否有理由不能使用一个发生变化的上下文,而不是完全独立的上下文?我想我永远不会知道。

如果您坚持拥有两个上下文并让您的组件在它们之间进行选择,您可以拥有一个指定要使用哪个上下文的上下文。

const Context1 = React.createContext("I'm context one!");
const Context2 = React.createContext("I'm context two!");

const WhichContext = React.createContext(Context1);

function MyComponent() {
  const which = React.useContext(WhichContext);
  const context = React.useContext(which);
  
  return (
    <div>{context}</div>
  );
}

function App () {
  return (
    <WhichContext.Provider value={Context2}>
      <MyComponent />
    </WhichContext.Provider>
  );
}

const root = ReactDOM.createRoot(document.getElementById('app'));
root.render(<App />);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/18.2.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.2.0/umd/react-dom.production.min.js"></script>


<div id="app"></div>

您也可以将其作为 Prop 传递:

const Context1 = React.createContext("I'm context one!");
const Context2 = React.createContext("I'm context two!");

const WhichContext = React.createContext(Context1);

function MyComponent(props) {
  const context = React.useContext(props.context);
  
  return (
    <div>{context}</div>
  );
}

function App () {
  return (
      <MyComponent context={Context2} />
  );
}

const root = ReactDOM.createRoot(document.getElementById('app'));
root.render(<App />);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/18.2.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.2.0/umd/react-dom.production.min.js"></script>


<div id="app"></div>

关于reactjs - 如何让组件知道哪个上下文调用该组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76387176/

相关文章:

javascript - React hooks 使用相同的原始值调用 setState 仍然会导致重新渲染

reactjs - 使用 React Router v4 有条件地渲染 404 路由

javascript - 如何防止用户在 react 日期中选择高于结束日期的日期

javascript - 尝试在 React 中渲染 Context Provider,收到错误消息 "Element type is invalid..."

reactjs - 更干净的 React 上下文

javascript - NextJS Link 组件到底触发什么以及如何捕获该事件

reactjs - 使用 useContext useReducer 基本示例 react 登录

javascript - 有条件地检查上下文中的值,然后在 React 中的同一函数调用中登录后导航

javascript - 如何通过 Context API 使全局可访问的信息保存在本地以便在刷新时持续存在?

javascript - 为什么 JSON.parse(JSON.stringify(obj)) 删除 obj 的属性