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>
)
}
没有任何示例,可以观察或使用传送道具作为登录组件的信息。没有任何问题,所有组件都必须精确地完成直接发送、螺旋桨钻探、直接使用各种中间组件的操作。这就是渲染数量的必要性,以及组件的可重用性的最终结果。
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>
);
};
没有código acima,criamos um contexto chamado LoginContext
usando a função createContext()
do React。接下来,证明者 ( LoginProvider
) 的定义涉及到 filhos ( children
) 组件。 O provor fornece o valor do contexto, que inclui o estado de login
ea função setLogin
para atualizá-lo.
使用应用上下文时,需要注意以下组件LoginProvider
:
import React from 'react';
import { LoginProvider } from './LoginContext';
const App = () => {
...
return (
<LoginProvider>
{/* Resto da sua aplicação */}
</LoginProvider>
);
};
export default App;
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>
</>
);
}
没有任何示例,无法使用登录上下文的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>
);
}
准备好这些组件,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>
);
}
没有示例,没有组件LoginPage
,组件和组件都ProfilePage
没有PainelPage
。 Assim,ProfilePage
作为登录方向的属性而接收的组件。
// PainelPage.jsx
export default function PainelPage({ children }) {
return (
<div>
{children}
</div>
);
}
没有任何组件PainelPage
,请使用特殊的渲染children
器或连续组件。设计该组件ProfilePage
并渲染它PainelPage
。
// ProfilePage.jsx
export default function ProfilePage({ login }) {
// ...
return (
<div className="profile">
<p>Welcome {login.username}</p>
</div>
);
}
没有任何组件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;
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>
</>
);
}
使用钩子来获得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>
);
}
ProfilePage
完成后,使用钩子组件useStore
,进行连接,自动登录,进行支柱钻探。
结论
React 的螺旋桨钻探应用程序具有多种用途。 Neste artigo,探索支柱钻井的各种形式:我们经常使用useContext
Zustand 的组件组合。
利用这些内容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