Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
React application
#🍦
@keyserfaty
💡 Me llamo Karen
👫 Co-organizo Meetup.js
#🍦
¿De qué vamos a hablar?
#🍦
¿Qué es la arquitectura
de aplicaciones?
#🍦
#🍦
Firmitas
Utilitas
Venustas
#🍦
Firmitas
Durabilidad. Tiene que se robusto
y poder mantenerse en buenas
condiciones a lo largo del tiempo
#🍦
Utilitas
Utilidad. Tiene que poder servir
para el propósito para el que fue
creado
#🍦
Venustas
Belleza. Tiene usar cosas como
proporción, repetición y escala
para ser útil y agradable a la vista
#🍦
¿Cuál sería la
arquitectura ideal?
#🍦
🚨 Disclaimer
#🍦
Tres problemas que
tenés con React
#🍦
Primer problema:
qué state usar para qué cosa
#🍦
State de React,
Redux, ¿otros?
#🍦
import React from 'react';
createTodo () {
const { todos } = this.state
const todo = {
id: 1,
text: '',
status: 'available'
}
this.setState({
todos: todos.push(todo)
})
}
componentWillUnmount() {
// clean state
this.setState(this.initialState)
}
render () {
const { todos } = this.props;
return (
<div>
<TodoList items={todos} />
</div>
#🍦
)
}
}
Container
import TodoList from './components/TodoList'
export default (
mapStateToProps,
mapDispatchToProps
)(withHooks(TodoList))
#🍦
Container
import TodoList from './components/TodoList'
export default (
mapStateToProps,
mapDispatchToProps
)(TodoList)
#🍦
Ventajas
#🍦
¿Cuándo state usar para qué cosa?
React
- Forms
- Components autocontenidos
Redux
- Manejar la data (sync/async)
- Cambios en la UI (excepto que sean parte de
un componente autocontenido) 🤔❓
¿Otros?
- Si no va a cambiar no pertenece al state =>
puede ser una constante
#🍦
Segundo problema:
cómo `queriar` el state
#🍦
¿Dónde poner mapStateToProps?
Components/Container
#🍦
1. ¿Dónde poner mapStateToProps?
Components/Container
- mapStateToProps en Containers
#🍦
const mapStateToProps = state => ({
status: selectors.getStatus(state),
error: selectors.getError(state),
endpoints: selectors.getEndpoints(state),
searchValue: selectors.getSearchValue(state),
isValidating: selectors.getValidationsViewStatus(state),
exportCandidate: selectors.getExportCandidate(state),
importCandidate: selectors.getImportCandidate(state),
validationsErrors: selectors.getValidationErrorsWithRenamingOfStatus(state),
//* Static content
steps,
popoverContent
});
#🍦
El único lugar por el que un component puede
recibir data es por props desde el container
#🍦
Los components no tienen que importar
nada que no sea otros components
#🍦
2. ¿Qué pasa cuando la data del state tiene
que sufrir cambios para matchear con la UI?
#🍦
selectors 🌟🎉
#🍦
import * as selectors from './selectors'
#🍦
import { createSelector } from 'reselect'
return todoList
}
)
#🍦
El state no tiene por qué saber de los
datos que necesita tu UI
#🍦
Ventajas:
1- Mi state está intacto
2- Mis components están intactos
#🍦
#🍦
import { createSelector } from ‘reselect'
import { pipe } from 'ramda'
#🍦
Tercer problema:
cómo manejar la data async
#🍦
¿Qué pasa cuando la data tiene que sufrir
cambios antes de poder mandarla en el request?
#🍦
sagas 🌟🎉
+
selectors🌟🎉
#🍦
export function * saveThingWorker (action) {
yield put(actions.saveThing.start());
if (error) {
return yield put(actions.saveThing.failure({ error }));
}
#🍦
Ventajas:
1- Mis funciones async solo hacen eso y
no hacen handling de la data
2- Mis components están intactos
#🍦
Una propuesta
#🍦
Actions
UI Layer
Data Layer
Container Component
Selectors
Models State
#🍦
Algunos problemas de la
estructura
#🍦
1- La complejidad del stack
2- Sobrecargar el state de redux
3- ¿Otros?
#🍦
Recursos:
https://github.com/reactjs/reselect
https://github.com/redux-saga/redux-saga
https://jaysoo.ca/2016/02/28/applying-code-organization-
rules-to-concrete-redux-code/#model
https://vimeo.com/166790294
#🍦
¡Gracias! 😬
🤔❓
@keyserfaty
#🍦