React es como una navaja suiza

Verónica Clavijo Altamirano

veuge.clavijo@gmail.com
Veuge
Veuge_C
¿PUBLICIDAD ENGAÑOSA?
Learn Once, Write Anywhere
#STORYTIME
PUBLICIDAD ENGAÑOSA
⏺ Class / Functional components

⏺ Props / State

⏺ Hooks / Lifecycle methods

⏺ Context API

⏺ key / ref
⏺ Class / Functional components

⏺ Props / State

⏺ Hooks / Lifecycle methods

⏺ Context API

⏺ key / ref

Components for web

Components for apps

⏺ Built-in Components

<div>, <p>, <img>, <button>
⏺ Built-in Components

<View>, <Text>, <Image>, <TouchableOpacity>
A FONDO
Renderer
Renderer
Renderer
react-reconciler

DOM APIs

ReactDOM

Android APIs

ReactNative

iOS APIs

RENDERERS
https://github.com/chentsulin/awesome-react-renderer

{DEMO TIME}

Crear nuestro propio ReactDOM (minimalista)
https://github.com/Veuge/reactbolivia-renderer
  1. Eliminar los rastros de ReactDOM
  2. Crear nuestro propio `render`
render(element, container) {
  const root = reconciler.createContainer(container, 0, null, false, false, '', (error) => console.log(error), null);
  reconciler.updateContainer(element, root, null, null);
}

export default render;

3. Usar `react-reconciler`

const reconciler = ReactReconciler({
    supportsMutation: true,
    isPrimaryRenderer: true,
    supportsPersistence: false,
    supportsHydration: false,

    // Callbacks para nuestro ejemplo simple
    createInstance: (type, props) => null,
    createTextInstance: (text) => null,
    appendChild: (parent, child) => null,
    appendInitialChild: (parent, child) => null,
    appendChildToContainer: (parent, child) => null,

    // Rest....
    finalizeInitialChildren: () => false,
    prepareUpdate: () => null,
    shouldSetTextContent: () => false,
    getRootHostContext: () => null,
    //......
})

3. Create DOM elements

createInstance: (type, props) => {
  console.log('createInstance', { type, props });
  const element = document.createElement(type);
  Object.keys(props).forEach((prop) => {
    if (!["children", "onClick", "key"].includes(prop)) {
      element[prop] = props[prop];
    }
  });
  return element;
},

createTextInstance: (text) => document.createTextNode(text),
   
appendChild: (parent, child) => parent.appendChild(child),

appendInitialChild: (parent, child) => parent.appendChild(child),
    
appendChildToContainer: (parent, child) => parent.appendChild(child),

4. Experimento con webcam

createInstance: (type, props) => {
  console.log('createInstance', { type, props });
  let element;
  if (type === 'webcam') {
    element = document.createElement('video');
    element.autoplay = true;
    element.playsInline = true;
    navigator.mediaDevices.getUserMedia({ video: true })
      .then(stream => element.srcObject = stream);
  } else {
    element = document.createElement(type);
  }
  // ...........
}

ReactBolivia - Por que React es una navaja suiza?

By Veronica Clavijo Altamirano

ReactBolivia - Por que React es una navaja suiza?

  • 115