Comment peut-on réaliser une liaison bidirectionnelle pour un élément input ?
sobes.tech IA
Réponse de l'IA
-
Manuellement :
En utilisant JavaScript, lier la valeur de l'input à une variable et mettre à jour l'input lors du changement de la variable. Écouter l'événement
inputsur l'élément input et mettre à jour la variable.let myValue = ''; const inputElement = document.getElementById('myInput'); const displayElement = document.getElementById('display'); inputElement.addEventListener('input', (event) => { myValue = event.target.value; displayElement.textContent = myValue; // Mise à jour de la vue }); // Exemple de mise à jour de la variable depuis un autre endroit function updateValue(newValue) { myValue = newValue; inputElement.value = myValue; // Mise à jour de l'input displayElement.textContent = myValue; // Mise à jour de la vue } -
Avec frameworks/bibliothèques :
Frameworks comme Angular, Vue.js, React (avec composants contrôlés) offrent des mécanismes intégrés pour la liaison bidirectionnelle.
- Angular :
[(ngModel)]="myValue" - Vue.js :
v-model="myValue" - React : Utilisation de
valueetonChangepour gérer l'état.
import React, { useState } from 'react'; function MyComponent() { const [myValue, setMyValue] = useState(''); const handleChange = (event) => { setMyValue(event.target.value); }; return ( <div> <input type="text" value={myValue} onChange={handleChange} /> <p>Valeur : {myValue}</p> </div> ); } - Angular :
-
Utilisation de l'API Proxy :
Créer un objet Proxy qui réagit aux changements de propriété et met à jour la valeur de l'input, ainsi que d'écouter l'événement
inputsur l'élément input et mettre à jour la propriété Proxy.const inputElement = document.getElementById('myInput'); const data = { value: '' }; const reactiveData = new Proxy(data, { set(target, property, newValue) { if (property === 'value') { target[property] = newValue; inputElement.value = newValue; // Mise à jour de l'input document.getElementById('display').textContent = newValue; // Mise à jour de la vue return true; } return false; } }); inputElement.addEventListener('input', (event) => { reactiveData.value = event.target.value; // Mise à jour de la propriété Proxy }); // Exemple de mise à jour de la propriété Proxy depuis un autre endroit // reactiveData.value = 'Nouvelle valeur'; -
Utilisation d'éléments personnalisés avec Shadow DOM et templates :
Créer un élément personnalisé qui encapsule l'input et implémente la logique de liaison dans son Shadow DOM.
class TwoWayInput extends HTMLElement { constructor() { super(); const shadowRoot = this.attachShadow({ mode: 'open' }); shadowRoot.innerHTML = ` <input type="text" /> <p id="display"></p> `; this.inputElement = shadowRoot.querySelector('input'); this.displayElement = shadowRoot.getElementById('display'); this._value = ''; this.inputElement.addEventListener('input', (event) => { this.value = event.target.value; }); } get value() { return this._value; } set value(newValue) { this._value = newValue; this.inputElement.value = newValue; this.displayElement.textContent = newValue; this.dispatchEvent(new CustomEvent('change', { detail: this._value })); } connectedCallback() { // Possibilité d'initialiser la valeur depuis un attribut if (this.hasAttribute('initial-value')) { this.value = this.getAttribute('initial-value'); } } } customElements.define('two-way-input', TwoWayInput);