Menu iconMenu icon
JavaScript de Cero a Superhéroe

Capítulo 10: Desarrollo de Aplicaciones de Página Única

Ejercicios Prácticos para el Capítulo 10: Desarrollando Aplicaciones de una Sola Página

Para solidificar tu comprensión de los conceptos clave cubiertos en el Capítulo 10, presentamos varios ejercicios prácticos. Estos ejercicios están diseñados para ayudarte a adquirir experiencia práctica en el desarrollo de Aplicaciones de una Sola Página (SPA), centrándose en el enrutamiento, la gestión de estado y el modelo SPA.

Ejercicio 1: Enrutamiento Simple de SPA

Objetivo: Implementar un enrutamiento simple del lado del cliente en una SPA con JavaScript puro sin usar ningún marco.

Solución:

<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Simple SPA Routing</title>
</head>
<body>
    <nav>
        <ul>
            <li><a href="#home">Home</a></li>
            <li><a href="#about">About</a></li>
        </ul>
    </nav>
    <div id="content"></div>

    <script src="router.js"></script>
</body>
</html>
// router.js
const routes = {
    'home': '<h1>Home Page</h1><p>Welcome to the home page.</p>',
    'about': '<h1>About Page</h1><p>Learn more about our SPA.</p>'
};

function handleRouting() {
    let hash = window.location.hash.substring(1);
    document.getElementById('content').innerHTML = routes[hash] || '<h1>404 Not Found</h1><p>The requested page does not exist.</p>';
}

window.addEventListener('hashchange', handleRouting);
window.addEventListener('load', handleRouting);

Ejercicio 2: Gestión de Estado con Redux

Objetivo: Crear una aplicación simple en React que use Redux para la gestión de estado para manejar un contador.

Solución:

# First, set up a new React app and install Redux
npx create-react-app redux-counter
cd redux-counter
npm install redux react-redux
// src/redux/store.js
import { createStore } from 'redux';

function counterReducer(state = { count: 0 }, action) {
    switch (action.type) {
        case 'INCREMENT':
            return { count: state.count + 1 };
        case 'DECREMENT':
            return { count: state.count - 1 };
        default:
            return state;
    }
}

const store = createStore(counterReducer);
export default store;
// src/App.js
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';

function App() {
    const count = useSelector(state => state.count);
    const dispatch = useDispatch();

    return (
        <div>
            <h1>Count: {count}</h1>
            <button onClick={() => dispatch({ type: 'INCREMENT' })}>Increment</button>
            <button onClick={() => dispatch({ type: 'DECREMENT' })}>Decrement</button>
        </div>
    );
}

export default App;
// src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import store from './redux/store';
import App from './App';

ReactDOM.render(
    <Provider store={store}>
        <App />
    </Provider>,
    document.getElementById('root')
);

Ejercicio 3: Carga Dinámica de Componentes en Vue.js

Objetivo: Implementar una aplicación en Vue.js que cargue componentes dinámicamente según la ruta.

Solución:

<!-- App.vue -->
<template>
  <div id="app">
    <nav>
      <button @click="currentView = 'home'">Home</button>
      <button @click="currentView = 'about'">About</button>
    </nav>
    <component :is="currentView"></component>
  </div>
</template>

<script>
import Home from './components/Home.vue'
import About from './components/About.vue'

export default {
  data() {
    return {
      currentView: 'home'
    }
  },
  components: {
    Home,
    About
  }
}
</script>
<!-- components/Home.vue -->
<template>
  <div>
    <h1>Home</h1>
    <p>This is the home page.</p>
  </div>
</template>

<script>
export default {
  name: 'Home'
}
</script>
<!-- components/About.vue -->
<template>
  <div>
    <h1>About</h1>
    <p>This is the about page.</p>
  </div>
</template>

<script>
export default {
  name: 'About'
}
</script>

Estos ejercicios están diseñados para mejorar tus habilidades en el desarrollo de SPA, enfocándose en la implementación de funcionalidades centrales como el enrutamiento y la gestión del estado en diferentes frameworks y bibliotecas. Al completar estas tareas, obtendrás una comprensión más profunda de cómo funcionan las SPA y cómo gestionar eficazmente los estados y rutas de la aplicación, componentes clave en la construcción de aplicaciones web modernas.

Ejercicios Prácticos para el Capítulo 10: Desarrollando Aplicaciones de una Sola Página

Para solidificar tu comprensión de los conceptos clave cubiertos en el Capítulo 10, presentamos varios ejercicios prácticos. Estos ejercicios están diseñados para ayudarte a adquirir experiencia práctica en el desarrollo de Aplicaciones de una Sola Página (SPA), centrándose en el enrutamiento, la gestión de estado y el modelo SPA.

Ejercicio 1: Enrutamiento Simple de SPA

Objetivo: Implementar un enrutamiento simple del lado del cliente en una SPA con JavaScript puro sin usar ningún marco.

Solución:

<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Simple SPA Routing</title>
</head>
<body>
    <nav>
        <ul>
            <li><a href="#home">Home</a></li>
            <li><a href="#about">About</a></li>
        </ul>
    </nav>
    <div id="content"></div>

    <script src="router.js"></script>
</body>
</html>
// router.js
const routes = {
    'home': '<h1>Home Page</h1><p>Welcome to the home page.</p>',
    'about': '<h1>About Page</h1><p>Learn more about our SPA.</p>'
};

function handleRouting() {
    let hash = window.location.hash.substring(1);
    document.getElementById('content').innerHTML = routes[hash] || '<h1>404 Not Found</h1><p>The requested page does not exist.</p>';
}

window.addEventListener('hashchange', handleRouting);
window.addEventListener('load', handleRouting);

Ejercicio 2: Gestión de Estado con Redux

Objetivo: Crear una aplicación simple en React que use Redux para la gestión de estado para manejar un contador.

Solución:

# First, set up a new React app and install Redux
npx create-react-app redux-counter
cd redux-counter
npm install redux react-redux
// src/redux/store.js
import { createStore } from 'redux';

function counterReducer(state = { count: 0 }, action) {
    switch (action.type) {
        case 'INCREMENT':
            return { count: state.count + 1 };
        case 'DECREMENT':
            return { count: state.count - 1 };
        default:
            return state;
    }
}

const store = createStore(counterReducer);
export default store;
// src/App.js
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';

function App() {
    const count = useSelector(state => state.count);
    const dispatch = useDispatch();

    return (
        <div>
            <h1>Count: {count}</h1>
            <button onClick={() => dispatch({ type: 'INCREMENT' })}>Increment</button>
            <button onClick={() => dispatch({ type: 'DECREMENT' })}>Decrement</button>
        </div>
    );
}

export default App;
// src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import store from './redux/store';
import App from './App';

ReactDOM.render(
    <Provider store={store}>
        <App />
    </Provider>,
    document.getElementById('root')
);

Ejercicio 3: Carga Dinámica de Componentes en Vue.js

Objetivo: Implementar una aplicación en Vue.js que cargue componentes dinámicamente según la ruta.

Solución:

<!-- App.vue -->
<template>
  <div id="app">
    <nav>
      <button @click="currentView = 'home'">Home</button>
      <button @click="currentView = 'about'">About</button>
    </nav>
    <component :is="currentView"></component>
  </div>
</template>

<script>
import Home from './components/Home.vue'
import About from './components/About.vue'

export default {
  data() {
    return {
      currentView: 'home'
    }
  },
  components: {
    Home,
    About
  }
}
</script>
<!-- components/Home.vue -->
<template>
  <div>
    <h1>Home</h1>
    <p>This is the home page.</p>
  </div>
</template>

<script>
export default {
  name: 'Home'
}
</script>
<!-- components/About.vue -->
<template>
  <div>
    <h1>About</h1>
    <p>This is the about page.</p>
  </div>
</template>

<script>
export default {
  name: 'About'
}
</script>

Estos ejercicios están diseñados para mejorar tus habilidades en el desarrollo de SPA, enfocándose en la implementación de funcionalidades centrales como el enrutamiento y la gestión del estado en diferentes frameworks y bibliotecas. Al completar estas tareas, obtendrás una comprensión más profunda de cómo funcionan las SPA y cómo gestionar eficazmente los estados y rutas de la aplicación, componentes clave en la construcción de aplicaciones web modernas.

Ejercicios Prácticos para el Capítulo 10: Desarrollando Aplicaciones de una Sola Página

Para solidificar tu comprensión de los conceptos clave cubiertos en el Capítulo 10, presentamos varios ejercicios prácticos. Estos ejercicios están diseñados para ayudarte a adquirir experiencia práctica en el desarrollo de Aplicaciones de una Sola Página (SPA), centrándose en el enrutamiento, la gestión de estado y el modelo SPA.

Ejercicio 1: Enrutamiento Simple de SPA

Objetivo: Implementar un enrutamiento simple del lado del cliente en una SPA con JavaScript puro sin usar ningún marco.

Solución:

<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Simple SPA Routing</title>
</head>
<body>
    <nav>
        <ul>
            <li><a href="#home">Home</a></li>
            <li><a href="#about">About</a></li>
        </ul>
    </nav>
    <div id="content"></div>

    <script src="router.js"></script>
</body>
</html>
// router.js
const routes = {
    'home': '<h1>Home Page</h1><p>Welcome to the home page.</p>',
    'about': '<h1>About Page</h1><p>Learn more about our SPA.</p>'
};

function handleRouting() {
    let hash = window.location.hash.substring(1);
    document.getElementById('content').innerHTML = routes[hash] || '<h1>404 Not Found</h1><p>The requested page does not exist.</p>';
}

window.addEventListener('hashchange', handleRouting);
window.addEventListener('load', handleRouting);

Ejercicio 2: Gestión de Estado con Redux

Objetivo: Crear una aplicación simple en React que use Redux para la gestión de estado para manejar un contador.

Solución:

# First, set up a new React app and install Redux
npx create-react-app redux-counter
cd redux-counter
npm install redux react-redux
// src/redux/store.js
import { createStore } from 'redux';

function counterReducer(state = { count: 0 }, action) {
    switch (action.type) {
        case 'INCREMENT':
            return { count: state.count + 1 };
        case 'DECREMENT':
            return { count: state.count - 1 };
        default:
            return state;
    }
}

const store = createStore(counterReducer);
export default store;
// src/App.js
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';

function App() {
    const count = useSelector(state => state.count);
    const dispatch = useDispatch();

    return (
        <div>
            <h1>Count: {count}</h1>
            <button onClick={() => dispatch({ type: 'INCREMENT' })}>Increment</button>
            <button onClick={() => dispatch({ type: 'DECREMENT' })}>Decrement</button>
        </div>
    );
}

export default App;
// src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import store from './redux/store';
import App from './App';

ReactDOM.render(
    <Provider store={store}>
        <App />
    </Provider>,
    document.getElementById('root')
);

Ejercicio 3: Carga Dinámica de Componentes en Vue.js

Objetivo: Implementar una aplicación en Vue.js que cargue componentes dinámicamente según la ruta.

Solución:

<!-- App.vue -->
<template>
  <div id="app">
    <nav>
      <button @click="currentView = 'home'">Home</button>
      <button @click="currentView = 'about'">About</button>
    </nav>
    <component :is="currentView"></component>
  </div>
</template>

<script>
import Home from './components/Home.vue'
import About from './components/About.vue'

export default {
  data() {
    return {
      currentView: 'home'
    }
  },
  components: {
    Home,
    About
  }
}
</script>
<!-- components/Home.vue -->
<template>
  <div>
    <h1>Home</h1>
    <p>This is the home page.</p>
  </div>
</template>

<script>
export default {
  name: 'Home'
}
</script>
<!-- components/About.vue -->
<template>
  <div>
    <h1>About</h1>
    <p>This is the about page.</p>
  </div>
</template>

<script>
export default {
  name: 'About'
}
</script>

Estos ejercicios están diseñados para mejorar tus habilidades en el desarrollo de SPA, enfocándose en la implementación de funcionalidades centrales como el enrutamiento y la gestión del estado en diferentes frameworks y bibliotecas. Al completar estas tareas, obtendrás una comprensión más profunda de cómo funcionan las SPA y cómo gestionar eficazmente los estados y rutas de la aplicación, componentes clave en la construcción de aplicaciones web modernas.

Ejercicios Prácticos para el Capítulo 10: Desarrollando Aplicaciones de una Sola Página

Para solidificar tu comprensión de los conceptos clave cubiertos en el Capítulo 10, presentamos varios ejercicios prácticos. Estos ejercicios están diseñados para ayudarte a adquirir experiencia práctica en el desarrollo de Aplicaciones de una Sola Página (SPA), centrándose en el enrutamiento, la gestión de estado y el modelo SPA.

Ejercicio 1: Enrutamiento Simple de SPA

Objetivo: Implementar un enrutamiento simple del lado del cliente en una SPA con JavaScript puro sin usar ningún marco.

Solución:

<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Simple SPA Routing</title>
</head>
<body>
    <nav>
        <ul>
            <li><a href="#home">Home</a></li>
            <li><a href="#about">About</a></li>
        </ul>
    </nav>
    <div id="content"></div>

    <script src="router.js"></script>
</body>
</html>
// router.js
const routes = {
    'home': '<h1>Home Page</h1><p>Welcome to the home page.</p>',
    'about': '<h1>About Page</h1><p>Learn more about our SPA.</p>'
};

function handleRouting() {
    let hash = window.location.hash.substring(1);
    document.getElementById('content').innerHTML = routes[hash] || '<h1>404 Not Found</h1><p>The requested page does not exist.</p>';
}

window.addEventListener('hashchange', handleRouting);
window.addEventListener('load', handleRouting);

Ejercicio 2: Gestión de Estado con Redux

Objetivo: Crear una aplicación simple en React que use Redux para la gestión de estado para manejar un contador.

Solución:

# First, set up a new React app and install Redux
npx create-react-app redux-counter
cd redux-counter
npm install redux react-redux
// src/redux/store.js
import { createStore } from 'redux';

function counterReducer(state = { count: 0 }, action) {
    switch (action.type) {
        case 'INCREMENT':
            return { count: state.count + 1 };
        case 'DECREMENT':
            return { count: state.count - 1 };
        default:
            return state;
    }
}

const store = createStore(counterReducer);
export default store;
// src/App.js
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';

function App() {
    const count = useSelector(state => state.count);
    const dispatch = useDispatch();

    return (
        <div>
            <h1>Count: {count}</h1>
            <button onClick={() => dispatch({ type: 'INCREMENT' })}>Increment</button>
            <button onClick={() => dispatch({ type: 'DECREMENT' })}>Decrement</button>
        </div>
    );
}

export default App;
// src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import store from './redux/store';
import App from './App';

ReactDOM.render(
    <Provider store={store}>
        <App />
    </Provider>,
    document.getElementById('root')
);

Ejercicio 3: Carga Dinámica de Componentes en Vue.js

Objetivo: Implementar una aplicación en Vue.js que cargue componentes dinámicamente según la ruta.

Solución:

<!-- App.vue -->
<template>
  <div id="app">
    <nav>
      <button @click="currentView = 'home'">Home</button>
      <button @click="currentView = 'about'">About</button>
    </nav>
    <component :is="currentView"></component>
  </div>
</template>

<script>
import Home from './components/Home.vue'
import About from './components/About.vue'

export default {
  data() {
    return {
      currentView: 'home'
    }
  },
  components: {
    Home,
    About
  }
}
</script>
<!-- components/Home.vue -->
<template>
  <div>
    <h1>Home</h1>
    <p>This is the home page.</p>
  </div>
</template>

<script>
export default {
  name: 'Home'
}
</script>
<!-- components/About.vue -->
<template>
  <div>
    <h1>About</h1>
    <p>This is the about page.</p>
  </div>
</template>

<script>
export default {
  name: 'About'
}
</script>

Estos ejercicios están diseñados para mejorar tus habilidades en el desarrollo de SPA, enfocándose en la implementación de funcionalidades centrales como el enrutamiento y la gestión del estado en diferentes frameworks y bibliotecas. Al completar estas tareas, obtendrás una comprensión más profunda de cómo funcionan las SPA y cómo gestionar eficazmente los estados y rutas de la aplicación, componentes clave en la construcción de aplicaciones web modernas.