1
votes

Éléments React js Dom

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?


7 commentaires

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? )


4 Réponses :


-1
votes

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.


0 commentaires

1
votes

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


1 commentaires

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 :)



0
votes

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


1 commentaires

Merci de votre attention. Dans mon esprit, votre exemple m'aidera. Je n'ai pas pu voter



0
votes

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'));


1 commentaires

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