Элементы React js Dom

Я новичок в react js, и у меня есть один вопрос об элементах DOM. У меня есть таблица в моем компоненте. При наведении указателя мыши я хочу выделить соответствующую ячейку и строку. Я хочу получить координаты этого элемента. Например, при наведении курсора на 3-ю ячейку 4-й строки я хочу получить результат как { r-4, c-3 }. Я не хочу использовать jquery для поиска позиции строк. Как я могу достичь такого результата?

Вы можете выделить текущую строку и ячейку, используя только CSS; координаты определять не нужно. Если они вам действительно нужны, просто добавляйте слушателя hover к каждой ячейке по мере их создания.

Chris G 06.01.2019 15:18

Проблема в том, что мне нужно отправить на сервер координаты.

Boris Avetisyan 06.01.2019 15:21

Похоже, вам просто нужен обработчик onmouseover, который куда-то передает координаты. Где у тебя проблемы? Вы можете показать код?

putvande 06.01.2019 15:57

добавьте свой код в скрипт, код или песочницу кода

saman khademi 06.01.2019 15:57

вы можете использовать чистый js в componentDidMount

saman khademi 06.01.2019 15:59

@samankhademi вот ссылка на jsfiddle jsfiddle.net/Boris996/cwrs9L8t/3

Boris Avetisyan 06.01.2019 16:23

В чем проблема с отрицательными голосами? )

Boris Avetisyan 06.01.2019 16:28
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
7
145
4

Ответы 4

На самом деле, response не работает с DOM, он отображает сам DOM, поэтому jquery не может вам помочь, если вы хотите делать такие вещи, я предлагаю вам больше узнать о реакции Ссылки, вы можете справиться с этим, используя ref и onclicks, надеюсь, это поможет вам.

вы можете добавить собственный код js в componentDidMount и использовать e.target.cellIndex для td и e.target.rowIndex для row

const tds = window.document.getElementsByTagName("td");
for(var i = 0; i<= tds.length -1;i++){
    tds[i].addEventListener("mouseup", e => {
    console.info(`cell ${e.target.cellIndex +1}` , `Row : ${e.target.parentElement.rowIndex + 1}`);
  })
}

живая демонстрация в реакции на коде: https://codepen.io/anon/pen/oJdjJW?editors=1010

надеюсь, я смогу помочь тебе

хорошо, если это был ваш ответ, пожалуйста, нажмите галочку рядом с этим ответом, чтобы сделать его основным ответом на вопрос :)

saman khademi 07.01.2019 14:31

вы не должны трогать DOM самостоятельно, это убьет цель реакции

вместо этого ваши слушатели событий должны быть выражены в вашем компоненте, и реагирование будет обрабатывать их

внутри это означает, что реакция будет вызывать addEventListener и removeEventListener, когда это необходимо, среди других полезных опций.

сначала ваши данные должны быть структурированы как вложенный массив а затем нанесите на карту свои строки и ячейки

благодаря мощности Array.prototype.map у вас будет доступ к индексам строк и ячеек

rows.map((row, rowIndex) => (
    <div>
      {row.map((cell, cellIndex) => (
        <div
          onClick = {() => {
            console.info(`you clicked on ${rowIndex}, ${cellIndex}`)
          }}
        >
          {cell}
        </div>
      ))}
    </div>
  ))

вот рабочий пример в codeandbox https://codesandbox.io/s/6zw42m4pxw

Спасибо за внимание. На мой взгляд, ваш пример мне поможет. Я не мог голосовать

Boris Avetisyan 06.01.2019 20:19

Вы можете добиться этого с помощью комбинации onMouseOver, setState и динамического стиля:

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'));
table {
  border-collapse: 'collapse'
}

td {
  padding: 1em
}
<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>

Спасибо. Это помогло. могу ли я написать код для выделения определенных элементов на основе этой логики. Например, при наведении курсора на координаты (3,4) не выделяется вся строка или ячейка. Вместо этого выделите только (3,4), (3,3), (3,2). заранее спасибо

Boris Avetisyan 07.01.2019 09:26

Другие вопросы по теме