Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Arquitetura para a nova geração de aplicações
Search
Charbel
October 19, 2019
Programming
0
130
Arquitetura para a nova geração de aplicações
Talk @ React Conf Brasil. Logic Hooks, Interfaces, Pure Components
Charbel
October 19, 2019
Tweet
Share
Other Decks in Programming
See All in Programming
ボトムアップの生成AI活用を推進する社内AIエージェント開発
aku11i
0
1.5k
釣り地図SNSにおける有料機能の実装
nokonoko1203
0
200
What’s Fair is FAIR: A Decentralised Future for WordPress Distribution
rmccue
0
110
CSC509 Lecture 11
javiergs
PRO
0
290
Temporal Knowledge Graphで作る! 時間変化するナレッジを扱うAI Agentの世界
po3rin
5
1.2k
Blazing Fast UI Development with Compose Hot Reload (Bangladesh KUG, October 2025)
zsmb
2
470
Reactive Thinking with Signals and the Resource API
manfredsteyer
PRO
0
120
Kotlinで実装するCPU/GPU 「協調的」パフォーマンス管理
matuyuhi
0
290
自動テストのアーキテクチャとその理由ー大規模ゲーム開発の場合ー
segadevtech
1
620
Vue 3.6 時代のリアクティビティ最前線 〜Vapor/alien-signals の実践とパフォーマンス最適化〜
hiranuma
2
390
ドメイン駆動設計のエッセンス
masuda220
PRO
15
7.5k
外接に惑わされない自システムの処理時間SLIをOpenTelemetryで実現した話
kotaro7750
0
200
Featured
See All Featured
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.7k
Building Adaptive Systems
keathley
44
2.8k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
2.9k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
34
2.3k
Context Engineering - Making Every Token Count
addyosmani
8
350
Code Review Best Practice
trishagee
72
19k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.7k
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
Building Applications with DynamoDB
mza
96
6.7k
Code Reviewing Like a Champion
maltzj
526
40k
Balancing Empowerment & Direction
lara
5
720
Transcript
Arquitetura para a nova geração de aplicações com React e
React Native Charbel Rami @charbelrami HOOKS :)
Charbel Rami - Faço coisas com código desde os 13
(comecei com RGSS no RPG Maker); - Gosto de trabalhar com acessibilidade e performance; - Fui colaborador no início do Brave; - Trabalho na VAGAS.
Um dia normal em um chat qualquer:
Cliente: — Sabe o que seria legal? Front:
Cliente: ▶ ──────── 2:59:03 Front:
Cliente: — Resumindo: um Todo List para web e mobile
;) Front:
Front:
Front: if (React && React Native && React Native Web)
SUCESSO!
Como o Front imagina:
None
None
Como realmente é:
None
None
Front:
None
Hooks - São funções com suporte para as principais funcionalidades
do React, como state, lifecycle e context; - Não renderizam nada;
Hooks - Possuem estado local isolado no componente em que
se encontram; - Permitem reutilizar lógica de estado.
Coooode
export function Todos() { const [title, setTitle] = useState(""); const
todos = useContext(TodoStateContext); … useEffect(() => { … }, [todos, id]); function addTodo() { … } function handleTitleChange() { … } … return ( <> <input value={title} onChange={handleTitleChange} … /> … <button onClick={addTodo}>Add Todo</button> <ol> {todos.map(({ id, title }) => ( …
export function Todos() { const [title, setTitle] = useState(""); const
todos = useContext(TodoStateContext); … useEffect(() => { … }, [todos, id]); function addTodo() { … } function handleTitleChange() { … } … return ( <> <input value={title} onChange={handleTitleChange} … /> … <button onClick={addTodo}>Add Todo</button> <ol> {todos.map(({ id, title }) => ( …
// pure-components/TodoInput.js export function TodoInput({ value, setValue, … }) {
function handleChange(e) { setValue(e.target.value); } return ( <input value={value} onChange={handleChange} … /> ); }
// pure-components/TodoInput.js export function TodoInput({ value, setValue, … }) {
function handleChange(e) { setValue(e.target.value); } return ( <input value={value} onChange={handleChange} … /> ); }
// pure-components/TodoInput.js export function TodoInput({ value, setValue, … }) {
function handleChange(e) { setValue(e.target.value); } return ( <input value={value} onChange={handleChange} … /> ); }
// pure-components/TodoList.js export function TodoList({ todos }) { return (
<ol> {todos.map(({ id, title }) => ( <TodoListItem id={id}>{title}</TodoListItem> ))} </ol> ); }
Pure components - São componentes funcionais: dadas as mesmas props,
a renderização é a mesma (se a = b, então f(a) = f(b));
Pure components - Recebem, exclusivamente via props, valores de estado
e callbacks para atualizar esse estado; - Podem ter sua performance otimizada com React.memo.
export function Todos() { const [title, setTitle] = useState(""); const
todos = useContext(TodoStateContext); … useEffect(() => { … }, [todos, id]); function addTodo() { … } function handleTitleChange() { … } … return ( <> <input value={title} onChange={handleTitleChange} … /> … <button onClick={addTodo}>Add Todo</button> <ol> {todos.map(({ id, title }) => ( …
export function Todos() { const [title, setTitle] = useState(""); const
todos = useContext(TodoStateContext); … useEffect(() => { … }, [todos, id]); function addTodo() { … } function handleTitleChange() { … } … return ( <> <input value={title} onChange={handleTitleChange} … /> … <button onClick={addTodo}>Add Todo</button> <ol> {todos.map(({ id, title }) => ( …
// logic-hooks/useTodos export function useTodos() { const [title, setTitle] =
useState(""); const todos = useContext(TodoStateContext); … useEffect(() => { … }, [todos, id]); function addTodo() { … } return { title, setTitle, addTodo, todos, … }; }
// logic-hooks/useTodos export function useTodos() { const [title, setTitle] =
useState(""); const todos = useContext(TodoStateContext); … useEffect(() => { … }, [todos, id]); function addTodo() { … } return { title, setTitle, addTodo, todos, … }; }
// logic-hooks/useTodos export function useTodos() { const [title, setTitle] =
useState(""); const todos = useContext(TodoStateContext); … useEffect(() => { … }, [todos, id]); function addTodo() { … } return { title, setTitle, addTodo, todos, … }; }
// logic-hooks/useTodos export function useTodos() { const [title, setTitle] =
useState(""); const todos = useContext(TodoStateContext); … useEffect(() => { … }, [todos, id]); function addTodo() { … } return { title, setTitle, addTodo, todos, … }; }
Logic hooks - São custom hooks; - Cuidam da lógica
de negócio;
Logic hooks - Se comunicam com contexts, actions, stores, API,
localstorage, etc; - Retornam valores de estado e callbacks para atualizar esse estado.
// interfaces/TodoInterface.js export function TodoInterface() { const { title, setTitle,
addTodo, todos, … } = useTodos(); return ( <> <TodoInput value={title} setValue={setTitle} … /> … <Button onClick={addTodo}>Add Todo</Button> <TodoList todos={todos} /> …
// interfaces/TodoInterface.js export function TodoInterface() { const { title, setTitle,
addTodo, todos, … } = useTodos(); return ( <> <TodoInput value={title} setValue={setTitle} … /> … <Button onClick={addTodo}>Add Todo</Button> <TodoList todos={todos} /> …
// interfaces/TodoInterface.js export function TodoInterface() { const { title, setTitle,
addTodo, todos, … } = useTodos(); return ( <> <TodoInput value={title} setValue={setTitle} … /> … <Button onClick={addTodo}>Add Todo</Button> <TodoList todos={todos} /> …
// interfaces/TodoInterface.js export function TodoInterface() { const { title, setTitle,
addTodo, todos, … } = useTodos(); return ( <> <TodoInput value={title} setValue={setTitle} … /> … <Button onClick={addTodo}>Add Todo</Button> <TodoList todos={todos} /> …
Interfaces - São componentes-função (!== componentes funcionais); - Renderizam pure
components; - Recebem valores fornecidos por Logic Hooks, e os distribuem para pure components.
Logic hook → Interface → Pure component Fluxo de dados
Logic Hooks → LOOKS
E como isso resolve o problema do Todo List na
prática?
None
None
// interfaces/TodoInterface.js export function TodoInterface() { const { title, setTitle,
description, setDescription, addTodo, todos, currentTodo } = useTodos(); return ( <> <TodoInput value={title} setValue={setTitle} /> <TodoInput value={description} setValue={setDescription} /> <Button onClick={addTodo}>Add Todo</Button> <TodoList todos={todos} /> … <TodoTitle>{currentTodo.title}</TodoTitle> <TodoDescription>{currentTodo.description}</TodoDescription> …
// interfaces/TodoInterface.js export function TodoInterface() { const { title, setTitle,
description, setDescription, addTodo, todos, currentTodo } = useTodos(); return ( <> <TodoInput value={title} setValue={setTitle} /> <TodoInput value={description} setValue={setDescription} /> <Button onClick={addTodo}>Add Todo</Button> <TodoList todos={todos} /> … <TodoTitle>{currentTodo.title}</TodoTitle> <TodoDescription>{currentTodo.description}</TodoDescription> …
// interfaces/TodoInterface.js export function TodoInterface() { const { title, setTitle,
description, setDescription, addTodo, todos } = useTodos(); return ( <> <TodoInput value={title} setValue={setTitle} /> <TodoInput value={description} setValue={setDescription} /> <Button onClick={addTodo}>Add Todo</Button> <TodoList todos={todos} /> …
// interfaces/TodoContentInterface.js export function TodoContentInterface() { const { currentTodo }
= useTodos(); return ( <> <TodoTitle>{currentTodo.title}</TodoTitle> <TodoDescription> {currentTodo.description} </TodoDescription> </> ); }
Vantagens - Permite reutilizar a mesma lógica de estado com
diferentes interfaces e vice-versa ; - Componentes que são fracamente acoplados podem ser testados e otimizados com mais facilidade;
Vantagens - Torna mais fácil refatorar e deletar código; -
Logic hooks podem ser consumidos sem conhecimento sobre seu funcionamento interno; - Monorepo: um logic hook pode ser um package.
Desvantagens - Não é ideal para aplicações mais simples, onde
não há necessidade frequente de reutilizar código; - Muitas camadas (lasagna code) se utilizada com Flux; Action → Dispatcher → Store → Logic hook → Interface → Pure component - Pouca documentação.
https:/ /codesandbox.io/s/talk-logic-hooks-ct0jb
Dúvidas?
Para quem quiser entrar em contato: Twitter: @charbelrami GitHub: /charbelrami
Regras para participação no sorteio do DRONE: 1. Seguir o
perfil @VagasTech no Twitter 2. Dar RT no Tweet fixado em nosso perfil 3. Estar presente na hora do sorteio :)
None