发布于 2026-01-06 0 阅读
0

React Context 与 Hooks 简明指南 DEV 的全球展示与讲述挑战赛,由 Mux 呈现:展示你的项目!

React Context 与 Hooks 简明指南

由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!

我花了好长时间才弄明白如何在 React Hooks 中使用 Context,我读过的所有教程要么解释得不够简单,要么似乎都只关注类语法。类语法很快就要被淘汰了,所以我想试试看。

为什么要使用上下文?

将 props 传递给多个子组件可能会变得难以管理。

const [someState, setSomeState] = useState('cool value');

return <SomeBigDaddyComponent someState={someState} />

现在是实施阶段SomeBigDaddyComponent

const SomeBigDaddyComponent = ({ someState }) = {
  return <SomeMediumDaddyComponent someSate={someState} />
}

现在是实施阶段SomeMediumDaddyComponent

const SomeMediumDaddyComponent = ({ someState }) = {
  return <SomeSmallDaddyComponent someSate={someState} />
}

SomeSmallDaddyComponent现在……的实施情况
越来越糟糕了,对吧?现在正是运用上下文的好时机。

创建和传播语境

上下文本质上是一种无需传递 props 即可将数据逐级传递给子组件的方法。举例说明会更容易理解。让我们创建一个非常简单的上下文。

import React from 'react';

const CoolMessageContext = React.createContext('hello hello hello');

export default CoolMessageContext;

我上面用一个简单的字符串初始化了上下文,但这可以是任何值,通常会使用一个对象。现在让我们看看上下文是如何工作的。考虑一下App.js

import React from 'react';
import CoolMessageContext from './CoolMessageContext';

const App = () => {
  return (
    <CoolMessageContext.Provider value={'bye bye bye'} />
      <SomeBigDaddyComponent />
    </CoolMessageContext.Provider>
  );
}

能够访问上下文值的组件都被包裹在 `<container>` 中Provider。这本质上是在说:“我是值的提供者,我下面的所有组件都可以获取这个值。” 在上面的示例中,` SomeBigDaddyComponent<container>` 及其子组件 `<container>`SomeMediumDaddyComponent和 `<container> ` 都可以获取SomeSmallDaddy该值。提供者之上的任何组件都无法访问该值。

const App = () => {
  return (
    <div>
      <SomeOtherComponent />
      <CoolMessageContext.Provider value={'bye bye bye'} />
        <SomeBigDaddyComponent />
      </CoolMessageContext.Provider>
    </div>
  );
}

SomeOtherComponent由于它位于提供程序之上,因此无法访问该值。请注意,必须提供初始值,这里我提供了'bye bye bye'。虽然已使用 设置了初始值,createContext但这实际上只是一个安全值,以防在设置提供程序时未提供值。

获取上下文值

现在该值已被广播,我们可以从任何子节点访问它。要获取该值,我们将使用钩子函数useContext

import React, { useContext } from 'react';
import CoolMessageContext from './CoolMessageContext';

const SomeSmallDaddyComponent = () => {
  const coolMessage = useContext(CoolMessageContext);
  return <h1>{coolMessage}</h1>
};

export default SomeSmallDaddyComponent;

useContext钩子函数使用上下文对象进行初始化,这样就可以在无需繁琐的 prop 传递的情况下访问该值。您可以将 useContext 理解为提供一个传送门,使该值能够传送到需要它的组件中。

设置上下文的值

如果使用状态,也可以从任何地方以类似的方式更改上下文的值。

import React from 'react';

const ObjectContext = React.createContext({
  object: {
    number: 0,
    word: 'hello'
  },
  setObject: () => {}
});

export default ObjectContext;

上述上下文与我们之前使用的上下文类似,但还具有存储设置函数的属性setState

import React, { useState } from 'react';
import ObjectContext from './ObjectContext';

const App = () => {
  const [object, setObject] = useState({
    number: 1,
    word: 'bye'
  });

  return (
    // ES6 Object Property Value Shorthand 
    <ObjectContext value={{ object, setObject }} />
      <SomeBigDaddyComponent />
    </ObjectContext >
  );
};

上述值是通过状态对象和状态设置函数设置的。现在,从任何地方设置状态都等同于访问该值。

import React, { useContext } from 'react';
import ObjectContext from './ObjectContext';

const SomeSmallDaddyComponent = () => {
  const { object, setObject } = useContext(ObjectContext);
  const clickHandler = () => {
    const objectCopy = {...object};
    objectCopy.title = 'wow new title!';
    setObject(objectCopy);
  }
  return <button onClick={clickHandler}>{object.title}</button>
};

export default SomeSmallDaddyComponent;

以上就是基本情况概述!如果我遗漏了什么或者您有任何疑问,请告诉我。如果您喜欢这篇文章,请在Twitter上关注我@keke_arif。谢谢!

keke

文章来源:https://dev.to/keke_arif/a-simple-guide-to-react-context-with-hooks-34jj