Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Arquitetura para a nova geração de aplicações

Avatar for Charbel Charbel
October 19, 2019

Arquitetura para a nova geração de aplicações

Talk @ React Conf Brasil. Logic Hooks, Interfaces, Pure Components

Avatar for Charbel

Charbel

October 19, 2019
Tweet

Other Decks in Programming

Transcript

  1. Arquitetura para a nova geração de aplicações com React e

    React Native Charbel Rami @charbelrami HOOKS :)
  2. 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.
  3. Hooks - São funções com suporte para as principais funcionalidades

    do React, como state, lifecycle e context; - Não renderizam nada;
  4. Hooks - Possuem estado local isolado no componente em que

    se encontram; - Permitem reutilizar lógica de estado.
  5. 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 }) => ( …
  6. 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 }) => ( …
  7. // pure-components/TodoInput.js export function TodoInput({ value, setValue, … }) {

    function handleChange(e) { setValue(e.target.value); } return ( <input value={value} onChange={handleChange} … /> ); }
  8. // pure-components/TodoInput.js export function TodoInput({ value, setValue, … }) {

    function handleChange(e) { setValue(e.target.value); } return ( <input value={value} onChange={handleChange} … /> ); }
  9. // pure-components/TodoInput.js export function TodoInput({ value, setValue, … }) {

    function handleChange(e) { setValue(e.target.value); } return ( <input value={value} onChange={handleChange} … /> ); }
  10. // pure-components/TodoList.js export function TodoList({ todos }) { return (

    <ol> {todos.map(({ id, title }) => ( <TodoListItem id={id}>{title}</TodoListItem> ))} </ol> ); }
  11. Pure components - São componentes funcionais: dadas as mesmas props,

    a renderização é a mesma (se a = b, então f(a) = f(b));
  12. Pure components - Recebem, exclusivamente via props, valores de estado

    e callbacks para atualizar esse estado; - Podem ter sua performance otimizada com React.memo.
  13. 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 }) => ( …
  14. 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 }) => ( …
  15. // logic-hooks/useTodos export function useTodos() { const [title, setTitle] =

    useState(""); const todos = useContext(TodoStateContext); … useEffect(() => { … }, [todos, id]); function addTodo() { … } return { title, setTitle, addTodo, todos, … }; }
  16. // logic-hooks/useTodos export function useTodos() { const [title, setTitle] =

    useState(""); const todos = useContext(TodoStateContext); … useEffect(() => { … }, [todos, id]); function addTodo() { … } return { title, setTitle, addTodo, todos, … }; }
  17. // logic-hooks/useTodos export function useTodos() { const [title, setTitle] =

    useState(""); const todos = useContext(TodoStateContext); … useEffect(() => { … }, [todos, id]); function addTodo() { … } return { title, setTitle, addTodo, todos, … }; }
  18. // logic-hooks/useTodos export function useTodos() { const [title, setTitle] =

    useState(""); const todos = useContext(TodoStateContext); … useEffect(() => { … }, [todos, id]); function addTodo() { … } return { title, setTitle, addTodo, todos, … }; }
  19. Logic hooks - Se comunicam com contexts, actions, stores, API,

    localstorage, etc; - Retornam valores de estado e callbacks para atualizar esse estado.
  20. // 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} /> …
  21. // 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} /> …
  22. // 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} /> …
  23. // 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} /> …
  24. Interfaces - São componentes-função (!== componentes funcionais); - Renderizam pure

    components; - Recebem valores fornecidos por Logic Hooks, e os distribuem para pure components.
  25. // 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> …
  26. // 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> …
  27. // 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} /> …
  28. // interfaces/TodoContentInterface.js export function TodoContentInterface() { const { currentTodo }

    = useTodos(); return ( <> <TodoTitle>{currentTodo.title}</TodoTitle> <TodoDescription> {currentTodo.description} </TodoDescription> </> ); }
  29. 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;
  30. 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.
  31. 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.
  32. 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 :)