Je suis nouveau dans react js et j'ai une question sur les éléments DOM. J'ai une table dans mon composant. Au survol de la souris, je veux mettre en évidence la cellule et la ligne correspondantes. Je veux avoir les coordonnées de cet élément. Par exemple, en survolant la 3ème cellule de la 4ème ligne, je veux avoir le résultat comme {r-4, c-3}
. Je ne veux pas utiliser jquery pour trouver la position des lignes. Comment puis-je atteindre ce résultat?
4 Réponses :
En fait, react ne fonctionne pas avec le DOM, il rend le DOM lui-même, donc la jquery ne peut pas vous aider, si vous voulez faire de telles choses, je vous suggère de rechercher plus sur react Refs , vous pouvez le gérer en utilisant ref et onclicks, j'espère que cela vous aidera.
vous pouvez ajouter du code natif js dans componentDidMount
et utiliser e.target.cellIndex
pour td
et e.target.rowIndex
pour row
const tds = window.document.getElementsByTagName("td"); for(var i = 0; i<= tds.length -1;i++){ tds[i].addEventListener("mouseup", e => { console.log(`cell ${e.target.cellIndex +1}` , `Row : ${e.target.parentElement.rowIndex + 1}`); }) }
démo en direct en réaction à codepen: https://codepen.io/anon/pen/oJdjJW?editors=1010
j'espère pouvoir vous aider
ok donc si c'était votre réponse, veuillez appuyer sur la coche à côté de cette réponse pour en faire la réponse principale à la question :)
vous ne devriez pas toucher le DOM vous-même, cela tuerait le but de react
à la place, vos écouteurs d'événements devraient être exprimés dans votre composant et réagir les gérerait
en interne, cela signifie que réagir appellera addEventListener et removeEventListener si nécessaire parmi d'autres optmisations utiles
d'abord, vos données doivent être structurées comme un tableau imbriqué puis mappez sur vos lignes et cellules
grâce à la puissance de Array.prototype.map, vous aurez accès aux index des lignes et des cellules
rows.map((row, rowIndex) => ( <div> {row.map((cell, cellIndex) => ( <div onClick={() => { console.log(`you clicked on ${rowIndex}, ${cellIndex}`) }} > {cell} </div> ))} </div> ))
voici un exemple de travail dans codesandbox https://codesandbox.io/s/6zw42m4pxw
Merci de votre attention. Dans mon esprit, votre exemple m'aidera. Je n'ai pas pu voter
Vous pouvez y parvenir en combinant onMouseOver
, setState
et un style dynamique:
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script> <div id="root"></div>
table { border-collapse: 'collapse' } td { padding: 1em }
class App extends React.Component { constructor(props) { super(props); this.state = { x: null, y: null } } render() { return ( <div> <p>User is hovering over ({this.state.x}, {this.state.y})</p> <table> {(new Array(10)).fill().map((_, y) => ( <tr> {(new Array(10).fill().map((_, x) => ( <td onMouseEnter={() => this.setState({x,y})} style={{backgroundColor: (this.state.x==x || this.state.y==y) ? 'red' : 'grey'}} ></td> )))} </tr> ))} </table> </div> ) } } ReactDOM.render((<App/>), document.querySelector('#root'));
Merci. Ça m'a aidé. puis-je écrire du code pour mettre en évidence des éléments spécifiques en fonction de cette logique. Par exemple, survoler les coordonnées (3,4) pour ne pas mettre en évidence toute la ligne ou la cellule. Au lieu de cela, mettez en surbrillance uniquement (3,4), (3,3), (3,2). Merci d'avance
Vous pouvez mettre en évidence la ligne et la cellule actuelles en utilisant uniquement CSS; il n'est pas nécessaire de déterminer les coordonnées. Si vous en avez besoin, ajoutez simplement un écouteur
hover
à chaque cellule lorsque vous les créez.Le problème est que je dois envoyer au serveur les coordonnées.
On dirait que vous voulez juste un gestionnaire
onmouseover
qui passe les coordonnées quelque part. Où rencontrez-vous des problèmes? Pouvez-vous montrer du code?ajoutez votre code dans un violon, un codepen ou un sandbox
vous pouvez utiliser pur js dans componentDidMount
@samankhademi voici le lien jsfiddle jsfiddle.net/Boris996/cwrs9L8t/3
Quel est le problème des votes négatifs? )