Evitando o Prop Drilling no React - Um Guia Prático

2025-06-07

Evitando o Prop Drilling no React - Um Guia Prático

React 没有生态系统,可以通过多种组件来实现模块化和重复利用。与“螺旋桨钻井”相关的各个组件等级的增加、增加和所有组件的状态的变化,与“螺旋桨钻井”相关。这是一个解决问题、复杂性和操作困难的问题。

接下来,我们讨论了如何使用 React 的有效方式:使用 useContext,这是一个组件组合,也是一个先进的图书馆。

例如,使用示例时,我们通常会在登录页面中输入信息,并在登录时提供信息。 Esse bados precisam ser consumidos apenas pelo componente perfil que se encontra dentro da página de painel.

使用道具无反应

// LoginPage.jsx 
import { useState } from "react";
import PainelPage from './PainelPage'

export default function LoginPage() {
    const [login, setLogin] = useState({username: 'admin123', password: '12345'});  
    
    // ...

    return (
        <>
            <PainelPage login={login} />
        </>
    );
}

// PainelPage.jsx
import ProfilePage from './ProfilePage'

export default function PainelPage(props) {
    
    // ...

    return (
        <>
            <ProfilePage login={props.login} />
        </>
    );
}

// ProfilePage.jsx
export default function ProfilePage(props) {
    return (
        <div classname='profile'>
            <p> Welcome {props.login.username} </p>
        </div>
    )
}
Enter fullscreen mode Exit fullscreen mode

没有任何示例,可以观察或使用传送道具作为登录组件的信息。没有任何问题,所有组件都必须精确地完成直接发送、螺旋桨钻探、直接使用各种中间组件的操作。这就是渲染数量的必要性,以及组件的可重用性的最终结果。

useContext 的使用

使用 React 的原生方式来比较各个组件,这也是在层次结构中传递 props 手册的必要条件。特别是在所有频率中都需要传输各种组件。

使用 useContext、primero、criamos 和 Armazena 的上下文或登录状态并允许访问应用程序的某些状态。 Podemos fazer isso da seguinte maneira:

// LoginContext.jsx
import { createContext, useState } from 'react';

export const LoginContext = createContext();

export const LoginProvider = ({ children }) => {
  const [login, setLogin] = useState();

  return (
    <LoginContext.Provider value={{ login, setLogin }}>
      {children}
    </LoginContext.Provider>
  );
};
Enter fullscreen mode Exit fullscreen mode

没有código acima,criamos um contexto chamado LoginContextusando a função createContext()do React。接下来,证明者 ( LoginProvider) 的定义涉及到 filhos ( children) 组件。 O provor fornece o valor do contexto, que inclui o estado de loginea função setLoginpara atualizá-lo.

使用应用上下文时,需要注意以下组件LoginProvider

import React from 'react';
import { LoginProvider } from './LoginContext';

const App = () => {

...

  return (
    <LoginProvider>
      {/* Resto da sua aplicação */}
    </LoginProvider>
  );
};

export default App;
Enter fullscreen mode Exit fullscreen mode

Agora 的登录上下文显示的是该组件的所有内容LoginProvider。访问上下文或使用钩子useContext组件以进行登录:

// LoginPage.jsx
import { useState, useContext } from 'react';
import { LoginContext } from './LoginContext';

export default function LoginPage() {
  const [username, setUsername] = useState("");
  const [password, setPassword] = useState("");

  const { setLogin } = useContext(LoginContext);

  // ...

  return (
    <>
      <div>
        <form
          onSubmit={(e) => {
            e.preventDefault();
            setLogin({ username, password });
          }}
        >
          <input
            value={username}
            onChange={(e) => setUsername(e.target.value)}
          />
          <input
            value={password}
            onChange={(e) => setPassword(e.target.value)}
          />
          <button>Login</button>
        </form>
      </div>
    </>
  );
}
Enter fullscreen mode Exit fullscreen mode

没有任何示例,无法使用登录上下文的useContext功能。setLogin使用环境登录公式,可以使用setLogin用户名和密码信息。

继续登录并退出组件,然后ProfilePage继续以下操作:

// ProfilePage.jsx
import { useContext } from 'react';
import { LoginContext } from './LoginContext';

export default function ProfilePage() {
  const { login } = useContext(LoginContext);

  // ...

  return (
    <div className="profile">
      <p>Welcome {login.username}</p>
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

准备好这些组件,ProfilePage以登录直接进行上下文、操作或支柱钻井的状态。

组件组成

螺旋桨钻井外的组件组合。 Emvez de passar props ditamente de um componente para outro, os componentes so aninhados hierarquicamente para mar uma uma umaição lógica.

使用以下组件的组合的方法:

// LoginPage.jsx
import { useState } from 'react';
import PainelPage from './PainelPage';
import ProfilePage from './ProfilePage';

export default function LoginPage() {
  const [login, setLogin] = useState({ username: 'admin123', password: '12345' });

  // ...

  return (
    <PainelPage>
        <ProfilePage login={login} />
    </PainelPage>
  );
}
Enter fullscreen mode Exit fullscreen mode

没有示例,没有组件LoginPage,组件和组件都ProfilePage没有PainelPage。 Assim,ProfilePage作为登录方向的属性而接收的组件。

// PainelPage.jsx
export default function PainelPage({ children }) {
  return (
    <div> 
        {children} 
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

没有任何组件PainelPage,请使用特殊的渲染children器或连续组件。设计该组件ProfilePage并渲染它PainelPage

// ProfilePage.jsx
export default function ProfilePage({ login }) {
  // ...

  return (
    <div className="profile">
      <p>Welcome {login.username}</p>
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

没有任何组件ProfilePage可以作为登录方向的属性,login也可以作为信息的正常使用。

此格式作为组件的登录属性和组件的组合LoginPage方式ProfilePage

立场

Além das abordagens mencionadas anteriormente, outra opção para evitar or proprilling no React or uso da biblioteca Zustand. O Zustand é um gerenciador de estado Leve uma maneira simples de compartilhar and atualizar estados entre Componentes.

您可以在全球范围内购买设备或设备,并访问其组件的设备。组件可以自动识别,无需手动操作。

// store.js
import create from 'zustand';

const useStore = create((set) => ({
  login: {},
  setLogin: (newLogin) => set(() => ({ login: newLogin })),
}));

export default useStore;
Enter fullscreen mode Exit fullscreen mode

create没有任何例子,我们可以使用Zustand 的功能。该商店拥有login初始国家的所有权和setLogin允许实际国家的功能。

使用该组件登录时,可能会出现以下问题:

// LoginPage.jsx
import { useState } from 'react';
import useStore from './store';

export default function LoginPage() {
  const [username, setUsername] = useState('');
  const [password, setPassword] = useState('');

  const setLogin = useStore((state) => state.setLogin);

  // ...

  return (
    <>
      <div>
        <form
          onSubmit={(e) => {
            e.preventDefault();
            setLogin({ username, password });
          }}
        >
          <input
            value={username}
            onChange={(e) => setUsername(e.target.value)}
          />
          <input
            value={password}
            onChange={(e) => setPassword(e.target.value)}
          />
          <button>Login</button>
        </form>
      </div>
    </>
  );
}
Enter fullscreen mode Exit fullscreen mode

使用钩子来获得Zustand 的存储useStore功能。setLogin使用环境登录公式,可以使用setLogin用户名和密码信息。

进行以下操作后ProfilePage,您将获得登录权限:

// ProfilePage.jsx
import useStore from './store';

export default function ProfilePage() {
  const login = useStore((state) => state.login);

  // ...

  return (
    <div className="profile">
      <p>Welcome {login.username}</p>
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

ProfilePage完成后,使用钩子组件useStore,进行连接,自动登录,进行支柱钻探。

结论

React 的螺旋桨钻探应用程序具有多种用途。 Neste artigo,探索支柱钻井的各种形式:我们经常使用useContextZustand 的组件组合。

利用这些内容useContext,您可以了解所有组件的上下文,并在层级中使用精确的道具手册。组件组合允许组织层次结构中的组件逻辑,并且需要必要的道具。 O Zustand éuma biblioteca leve que ofere umaeira simples de compartilhar and atualizar estados entre componentes.

Cada abordagem tem suas vantagens e 重要考虑项目的具体性质,以使其更加充分。这是一个技术应用程序,可以提供良好的使用体验,是 React 的可重用手册。

文章来源:https://dev.to/gustavospriebe/evitando-o-prop-drilling-no-react-um-guia-pratico-5f7d
PREV
我从被解雇的经历中学到的 5 个改变人生的教训,让你领先于 97% 的人
NEXT
Flutter GetX 状态管理