Si colocamos las imágenes dentro de la carpeta 'src', React las empaqueta en el proyecto. Esto significa que cuando crea su aplicación para la producción, las imágenes se agruparán y se minimizarán.
Luego las imágenes se agregan haciendo uso de la palabra clave 'import' o 'require'
Crear una aplicación que muestre una bandera de un país una a la vez, permitir con dos botones cambiar a la siguiente o anterior bandera. Localizar las imágenes en la carpeta 'src'.
Como primer paso creamos una aplicación con create-react-app:
npx create-react-app proyecto019
Creamos en la carpeta 'src' una subcarpeta llamada 'imagenes' y en la misma almacenamos 8 imágenes de banderas:

Modificamos el archivo App.js:
App.js
import {useState} from 'react'
import argentina from './imagenes/argentina.png';
import bolivia from './imagenes/bolivia.png';
import brasil from './imagenes/brasil.png';
import chile from './imagenes/chile.png';
import colombia from './imagenes/colombia.png';
import peru from './imagenes/peru.png';
import uruguay from './imagenes/uruguay.png';
import venezuela from './imagenes/venezuela.png';
function App() {
const banderas = [argentina, bolivia, brasil, chile, colombia, peru, uruguay, venezuela];
const [nroBandera, setNroBandera] = useState(0)
function banderaSiguiente() {
if (nroBandera < banderas.length - 1) {
setNroBandera(nroBandera + 1)
}
}
function banderaPrevia() {
if (nroBandera > 0) {
setNroBandera(nroBandera - 1)
}
}
return (
<div>
<h1>Banderas de paises Latinoamericanos</h1>
<p><img src={banderas[nroBandera]} alt="argentina" /></p>
<p>
<input type="button" value="<" onClick={banderaPrevia} />
<input type="button" value=">" onClick={banderaSiguiente} />
</p>
</div>
);
}
export default App;
Importamos cada imagen con la palabra clave import y hacemos referencia al archivo de la imágen:
import argentina from './imagenes/argentina.png'; import bolivia from './imagenes/bolivia.png'; import brasil from './imagenes/brasil.png'; import chile from './imagenes/chile.png'; import colombia from './imagenes/colombia.png'; import peru from './imagenes/peru.png'; import uruguay from './imagenes/uruguay.png'; import venezuela from './imagenes/venezuela.png';
Creamos un arreglo con la referencia a cada imagen:
const banderas = [argentina, bolivia, brasil, chile, colombia, peru, uruguay, venezuela];
Definimos un Hook de estado con el número de subíndice del arreglo que indicará la bandera visible actual:
const [nroBandera, setNroBandera] = useState(0)
Mostramos la imagen:
<p><img src={banderas[nroBandera]} alt="argentina" /></p>
Luego según el botón que se presiona llamamos a la función respectiva:
<p>
<input type="button" value="<" onClick={banderaPrevia} />
<input type="button" value=">" onClick={banderaSiguiente} />
</p>
Las dos funciones modifican ea bandera seleccionada:
function banderaSiguiente() {
if (nroBandera < banderas.length - 1) {
setNroBandera(nroBandera + 1)
}
}
function banderaPrevia() {
if (nroBandera > 0) {
setNroBandera(nroBandera - 1)
}
}

Podemos probar ahora la aplicación que muestra las imágenes localizadas en la carpeta public/imagenes/: aquí
Recordar que si subimos nuestra aplicación a una subcarpeta de nuestro servidor debemos modificar el archivo 'package.json', agregando dicho path:
{
"name": "proyecto019",
"homepage": "https://www.scratchya.com.ar/reactya/proyecto018/",
"version": "0.1.0",
"private": true,
....
Vamos a resolver el mismo problema pero empleando ahora require.
Podemos realizar los cambios en el mismo problema anterior, ya que las imágenes las vamos a recuperar de la misma carpeta.
Modificamos el archivo App.js:
App.js
import { useState } from 'react'
function App() {
const banderas = ["argentina.png", "bolivia.png", "brasil.png", "chile.png", "colombia.png", "peru.png", "uruguay.png", "venezuela.png"]
const [indice, setIndice] = useState(0)
function banderaSiguiente() {
if (indice < banderas.length - 1) {
setIndice(indice + 1)
}
}
function banderaPrevia() {
if (indice > 0) {
setIndice(indice - 1)
}
}
return (
<div>
<h1>Banderas de paises Latinoamericanos</h1>
<p><img src={require(`./imagenes/${banderas[indice]}`)} alt="bandera" /></p>
<p>
<input type="button" value="<" onClick={banderaPrevia} />
<input type="button" value=">" onClick={banderaSiguiente} />
</p>
</div>
);
}
export default App;
No disponemos ahora un import por cada imagen, sino mediante la función require indicamos el path y el nombre del archivo directamente, en nuestro caso lo extraemos del arreglo 'banderas', dependiendo del valor de la variable 'indice':
<p><img src={require(`./imagenes/${banderas[indice]}`)} alt="bandera" /></p>