Cómo crear un componente de autocompletado en React
Introducción
La función de autocompletar es una función en la que un campo de entrada sugiere una palabra en función de la entrada del usuario. Esto ayuda a mejorar la experiencia del usuario en su aplicación, como en los casos en los que es necesaria una búsqueda.
En este artículo, examinará cómo crear un componente de autocompletado en React. Trabajará con una lista fija de sugerencias, vinculará eventos, comprenderá los códigos del teclado y operará la gestión del estado.
Prerrequisitos
Para completar este tutorial, necesitará lo siguiente:
- Se requiere conocimiento de React. Para obtener más información sobre React, consulta la serie Cómo codificar en React .
Paso 1: Construir Autocompleteel componente
El Autocomplete
componente es donde crearás la funcionalidad de la función de autocompletar.
Crea un Autocomplete.js
archivo, importa React y crea una instancia de una Autocomplete
clase:
Autocompletar.js
import React, { Component, Fragment } from "react";import './styles.css'class Autocomplete extends Component { constructor(props) { super(props); this.state = { activeSuggestion: 0, filteredSuggestions: [], showSuggestions: false, userInput: "" }; }
En su estado, la activeSuggestion
propiedad define el índice de una sugerencia seleccionada. La propiedad filteredSuggestions
, establecida en una matriz vacía, coincide con la entrada del usuario. La showSuggestions
propiedad determinará si aparece o no la lista de sugerencias y userInput
se asigna a sí misma una cadena vacía para aceptar una palabra de la entrada de un usuario.
Con su clase iniciada y el estado establecido, veamos los métodos a aplicar en el componente.
En su Autocomplete.js
archivo, defina un onChange
método y actualice su estado:
Autocompletar.js
onChange = e = { const { suggestions } = this.props; const userInput = e.currentTarget.value; const filteredSuggestions = suggestions.filter( suggestion = suggestion.toLowerCase().indexOf(userInput.toLowerCase()) -1 ); this.setState({ activeSuggestion: 0, filteredSuggestions, showSuggestions: true, userInput: e.currentTarget.value }); };
El método onChange
se activará cuando el usuario cambie el valor de entrada. En cada cambio, el método filtrará la lista de sugerencias y devolverá sugerencias que no contengan la entrada del usuario. Una vez que se ejecute el filtro, el .setState()
método revisará userInput
la propiedad de su estado para que contenga un valor, establecerá su showSuggestions
valor booleano para permitir que se muestren las sugerencias y restablecerá la activeSuggestion
propiedad en cada llamada al método.
El onClick
evento se invocará cuando el usuario haga clic en una sugerencia. En su Autocomplete.js
archivo, declare un onClick
método e implemente un .setState()
método:
Autocompletar.js
onClick = e = { this.setState({ activeSuggestion: 0, filteredSuggestions: [], showSuggestions: false, userInput: e.currentTarget.innerText }); };
El .setState()
método actualizará la entrada del usuario y restablecerá las propiedades de su estado.
El onKeyDown
método se activará cuando el usuario presione una tecla. En el Autocomplete.js
archivo, declare un onKeyDown
método y establezca varias condiciones:
Autocompletar.js
onKeyDown = e = { const { activeSuggestion, filteredSuggestions } = this.state; if (e.keyCode === 13) { this.setState({ activeSuggestion: 0, showSuggestions: false, userInput: filteredSuggestions[activeSuggestion] }); } else if (e.keyCode === 38) { if (activeSuggestion === 0) { return; } this.setState({ activeSuggestion: activeSuggestion - 1 }); } // User pressed the down arrow, increment the index else if (e.keyCode === 40) { if (activeSuggestion - 1 === filteredSuggestions.length) { return; } this.setState({ activeSuggestion: activeSuggestion + 1 }); } };
Una vez que haya almacenado sus propiedades activeSuggestion
y filteredSuggestion
en un objeto deconstruido, los condicionales verificarán si la tecla que el usuario presionó coincide con los códigos de tecla. El primer condicional verificará si el código de tecla coincide con 13
, la tecla Enter, y ejecutará el .setState()
método para actualizar la userInput
propiedad y cerrar la lista de sugerencias. Si el usuario presionó la flecha hacia arriba, el código de tecla 38
, el condicional disminuirá el índice de la activeSuggestion
propiedad y no devolverá nada si el índice es cero. Si el usuario presionó la flecha hacia abajo, el código de tecla 40
, el condicional incrementará el índice en la activeSuggestion
propiedad y no devolverá nada si el índice coincide con la longitud de la filteredSuggestions
propiedad.
Ahora que sus métodos están completos, pasemos a aplicar su render
método de ciclo de vida.
En su Autocomplete.js
archivo, establezca una render()
declaración y defina sus métodos y estado en un objeto deconstruido:
Autocompletar.js
render() { const { onChange, onClick, onKeyDown, state: { activeSuggestion, filteredSuggestions, showSuggestions, userInput } } = this; let suggestionsListComponent;
La variable suggestionsListComponent
no tiene un valor definido, ya que lo asignarás en los condicionales siguientes:
Autocompletar.js
if (showSuggestions userInput) { if (filteredSuggestions.length) { suggestionsListComponent = ( ul {filteredSuggestions.map((suggestion, index) = { let className; // Flag the active suggestion with a class if (index === activeSuggestion) { className = "suggestion-active"; } return ( li className={className} key={suggestion} onClick={onClick} {suggestion} /li ); })} /ul ); } else { suggestionsListComponent = ( div emNo suggestions available./em /div ); } }
La primera condición comprobará si los valores de las propiedades showSuggestions
y userInput
existen, mientras que la siguiente condición comprobará la longitud de la filteredSuggestions
propiedad. Si se cumplen las condiciones, la suggestionsListComponent
variable se asigna a sí misma el valor de iterar a través de la filteredSuggestions
propiedad y marca una sugerencia activa con un nombre de clase si el índice coincide con el valor de la activeSuggestion
propiedad. La suggestionsListComponent
variable devolverá una lista ordenada de las sugerencias tras la ejecución del onClick
método y asignará a cada sugerencia un nombre de clase. Si los valores de las propiedades showSuggestions
y userInput
no existen, aparecerá un texto para indicar que no hay sugerencias disponibles.
Si el usuario no cumple con las condiciones enumeradas, el render()
método de ciclo de vida devolverá un React Fragment
para aplicar el campo de entrada e invocar los métodos sin agregar nodos adicionales al modelo de objetos del documento:
Autocompletar.js
return ( Fragment input type="text" onChange={onChange} onKeyDown={onKeyDown} value={userInput} / {suggestionsListComponent} /Fragment ); }}export default Autocomplete;
Ahora que ha desarrollado su Autocomplete
componente, exporte el archivo y combine su funcionalidad en otro componente.
Paso 2: Unirse a su proyecto React
El App
componente es donde mostrará la funcionalidad de su Autocomplete
componente. En su index.js
archivo, declare un App
componente e importe su Autocomplete
componente:
índice.js
import React from "react";import Autocomplete from "./Autocomplete";function App() { return ( div h1React Autocomplete Demo/h1 h2Start typing and experience the autocomplete wizardry!/h2 Autocomplete suggestions={"Oranges", "Apples", "Banana", "Kiwi", "Mango"]}/ /div );}export default App
La declaración de retorno de su App
componente acepta el Autocomplete
componente con la lista fija de sugerencias.
Paso 3: Dar estilo al Autocompletecomponente
Para finalizar su Autocomplete
componente, agregue estilo con CSS para posicionar y colorear su aplicación y campo de entrada.
Crea un styles.css
archivo y establece reglas CSS para dar forma a tu Autocomplete
componente:
estilos.css
body { font-family: sans-serif;}input { border: 1px solid #999; padding: 0.5rem; width: 300px;}.no-suggestions { color: #999; padding: 0.5rem;}.suggestions { border: 1px solid #999; border-top-width: 0; list-style: none; margin-top: 0; max-height: 143px; overflow-y: auto; padding-left: 0; width: calc(300px + 1rem);}.suggestions li { padding: 0.5rem;}.suggestion-active,.suggestions li:hover { background-color: #008f68; color: #fae042; cursor: pointer; font-weight: 700;}.suggestions li:not(:last-of-type) { border-bottom: 1px solid #999;}
Con tus reglas CSS construidas, importa el archivo en tu Autocomplete.js
archivo para aplicar tus estilos.
Conclusión
React ofrece medidas para construir la funcionalidad de autocompletar disponible en un componente con métodos integrados y personalizados para interactuar con el usuario.
Descubra cómo funciona el componente Autocompletar en CodeSandbox .
Deja una respuesta