Programação Funcional
Como desenvolver componentes funcionais?
Requisitos
- Possuir arquivos .(js)x .(js)
- Exportar função no seguinte padrão somente:
- Uso e recebimento de props somente no formato igual acima
- Providers (hooks) personalizados somente na pasta
/providers/*
e obrigatoriamente precisa exportar como default um provider
Como utilizar
Para utilizar componentes funcionais basta seguir os seguintes formatos:
export default function Products(props) {
const [products, setProducts] = useState([]);
const { location } = props;
useEffect(() => {
console.log(location.state);
getProducts();
}, []);
const getProducts = async () => {
const response = await fetch(
"https://calindra.tech/eitri/product_list.json"
);
const data = await response.json();
setProducts(data.resultItems);
};
}
<Window>
{products?.map((product) => (
<View key={product.id} display="flex" direction="column" marginTop="big">
<Image src={product.imageUrl} width={320} height={320} />
<Text fontSize="large">{product.title}</Text>
<Text>{product.description}</Text>
</View>
))}
</Window>
Acima o arquivo .jsx|.tsx identifica como se os estados e métodos estivesse no mesmo nível, diferente do formato de classe que é necessário usar o this
para acessar uma propriedade ou método daquele componente.
Provider(Hook) com contexto global
Para ter um provider(Hook) customizado com estado global, basta ter dentro de src
a pasta providers
com o arquivo do provider com o nome começando com letra maiúscula e extensão .jsx|.tsx, exemplo: User.jsx
.
const UserContext = createContext({});
export default function UserProvider({ children }) {
const [user, setUser] = useState({});
const login = async (data) => {
setUser(data);
console.log({ user, data });
};
return (
<UserContext.Provider value={{ login, user }}>
{children}
</UserContext.Provider>
);
}
export function useAuth() {
const context = useContext(UserContext);
return context;
}
Como mostrado acima, nos criamos um contexto de usuário, a partir desse contexto geramos a função UserProvider
que é exportada como default, e um hook que utiliza esse contexto e podemos acessar o estado gerado no provider.
Para utilizar esse hook basta importar o provider, da seguinte forma:
// Da forma abaixo podemos utilizar o @ para entrar dentro da src independente do nível que você esteja
import { useAuth } from "@/providers/User";
// Ou no formato padrão, caso esteja em /view/Login.js
import { useAuth } from "../providers/User";
const { login, user } = useAuth();
Dessa forma podemos acessar o método login e o estado de usuário criado no provider de forma global.