No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Declarar la maquina de estados

5/15
Recursos

Aportes 8

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

npx create-react-app react-state-machines
npm install xstate @xstate/react
.
src/Machines/bookingMachine.js:

import { createMachine } from 'xstate';

const bookingMachine = createMachine({
  id: 'buy plane tickets',
  initial: 'initial',
  states: {
    initial: {
      on: {
        START: 'search'
      }
    },
    search: {
      on: {
        CONTIUNE: 'passengers',
        CANCEL: 'initial'
      }
    },
    passengers: {
      on: {
        DONE: 'tickets',
        CANCEL: 'initial'
      }
    },
    tickets: {
      on: {
        FINISH: 'initial'
      }
    },
  }
})

export default bookingMachine

src/Components/BaseLayout.js:

import React from 'react';
import { useMachine } from '@xstate/react';
import bookingMachine from '../Machines/bookingMachine';

export const BaseLayout = ()=> {
    const [state,send] = useMachine(bookingMachine)

    console.log('machine', state)
    return (
        <div>State Machine</div>
    )
}

src/App.js:

import { BaseLayout } from './Components/BaseLayout';
import './App.css';

function App() {
  return (
    <div className="App">
        <BaseLayout />
    </div>
  );
}

export default App;

les recomiendo que copien el código manualmente en vez de copiar y pegar, ya que es todo nuevo sería mejor familiarizarnos con la sintaxis y aprender el orden de cada cosa. Ya cuando estemos hartos de hacer tantas máquinas de estados haremos Ctrl + V xD

Declarar la maquina de estados

Para comenzar debemos inicializar nuestro proyecto en React.

Luego, vamos a usar el siguiente comando para instalar XState:

npm install xstate @xstate/react

Ahora por convención vanos a crear una nueva carpeta que se va a llamar machines, y dentro crearemos un un archivo llamado bookingMachine.js que será una serie de pasos senciila de la lógica de nuestra aplicación:

import { createMachine } from 'xstate';

const bookingMachine = createMachine({
  id: 'buy plane tickets',
  initial: 'initial',
  states: {
    initial: {
      on: {
        START: 'search'
      }
    },
    search: {
      on: {
        CONTIUNE: 'passengers',
        CANCEL: 'initial'
      }
    },
    passengers: {
      on: {
        DONE: 'tickets',
        CANCEL: 'initial'
      }
    },
    tickets: {
      on: {
        FINISH: 'initial'
      }
    },
  }
})

export default bookingMachine;

Ahora vamos a crear una nueva carpeta llamada components, y dentro crearemos un archivo BaseLayout.jsx.

/* Vamos a hacer import del hooks que necesitamos para inicializar 
la máquina "useMachine" y nuestro bookingMachine */
import { useMachine } from "@xstate/react";
import bookingMachine from "../machines/bookingMachine";

export const BaseLayout = () => {
  // Ahora vamos a inicializar la máquina de la siguiente manera:
  /* Vamoa a destructurar dos cosas del useMachine, la primera es el 
  "state", que nos dá toda la infromación de la máquina en ese 
  momento, y el send me permite transicionar entre distintos pasos,
  para esto, debe recibir la declaración de los estados entre 
  parentesis */
  const [state,send] = useMachine(bookingMachine);

  /* Si vemos en nuestra consola veremos nuestrab máquina de estado 
  inicializada, si vemos en value, si valor será el estado inicial, 
  el cual es "initial", junto con mucha más información */
  console.log('Nuestra máquina', state);

  return (
    <div>Hola :3</div>
  )
}

Ahora solo importamos el componente en App.jsx:

import BaseLayout from './components/BaseLayout';
import './App.css'

function App() {

  return (
    <div className="App">
      <BaseLayout />
    </div>
  )
}

export default App;

Y listo, así de fácil hemos inicializado nuestra máquina de estado 😄.

Si usas yarn:

yarn create react-app my-app

npm me parece super lento.

Vamos a inicializar nuestro proyecto usando `Create-React-App` y se llamará `react-state-machine` . `npx create-react-app react-state-machine` Dentro del proyecto debemos instalar `XState` y el paquete de XState para React. `npm install xstate` `npm install @xstate/react` Solo queda correr el servidor para comenzar a trabajar en el proyecto. `npm run start` Creamos un nuevo folder llamado `Machines` y dentro de este un archivo `bookingMachine.js` . ```js import { createMachine } from 'xstate'; const bookingMachine = createMachine({ id: 'buy plane tickets', initial: 'initial', states: { initial: { on: { START: "search", }, }, search: { on: { CONTINUE: "passengers", CANCEL: "initial", }, }, passengers: { on: { DONE: "tickets", CANCEL: "initial", }, }, tickets: { on: { FINISH: "initial", }, } } }); export default bookingMachine; ``` En otra carpeta llamado `Components` vamos a crear un componente `BaseLayout.js` . ```js import React from "react"; import { useMachine } from "@xstate/react"; import bookingMachine from "../Machines/bookingMachine"; function BaseLayout() { const [state, send] = useMachine(bookingMachine); console.log(state); return
BaseLayout
; } export { BaseLayout }; ``` Importamos el hook `useMachine` que necesitamos para inicializar la máquina. Lo otro que tenemos que importar es nuestro Booking Machine. Vamos a inicializarla y esto me retorna `state` y `send` . El `state` me da toda la información de la máquina en ese momento, y el `send` me permite generar transiciones. Finalmente, mostramos el estado de nuestra máquina. En `App.js` lo único que hacemos es utilizar nuestro componente. ```js import "./App.css"; import { BaseLayout } from "./Components/BaseLayout"; function App() { return (
<BaseLayout />
); } export default App; ```

EMPECE MI PROYECTO CON STATE MACHINE

Es un proyecto de películas, aún en proceso, solo está disponible la vista mobile. Utilicé la máquina de estado para el nav.
https://my-movies-in-react.vercel.app/

Este es el procedimiento si vas a trabajar con React + TypeScript + Vite:

  • Primer paso: npm create vite@latest
  • Escoger React y typescript
  • Ingresar a la carpeta y usar el comando: npm i
  • (Opcional) Luego utilizar el comando git init para usar git en nuestro proyecto.
  • Ahora instalamos paquetes de xstate: npm i xstate @xstate/react
  • A codear!
npm i xstate @xstate/react