首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React js Dom元素

React js Dom元素
EN

Stack Overflow用户
提问于 2019-01-06 22:15:15
回答 4查看 144关注 0票数 1

我是react js的新手,有一个关于DOM元素的问题。我的组件中有一个表。在鼠标悬停时,我想突出显示相应的单元格和行。我想要那个元素的坐标。例如,在悬停第四行的第三个单元格时,我希望result为{ r-4, c-3 }。我不想使用jquery来查找行的位置。我怎样才能达到这个结果呢?

EN

回答 4

Stack Overflow用户

发布于 2019-01-07 00:01:04

您可以在componentDidMount中添加js本机代码,并对td使用e.target.cellIndex,对row使用e.target.rowIndex

代码语言:javascript
复制
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}`);
  })
}

codepen的react中的实况演示:https://codepen.io/anon/pen/oJdjJW?editors=1010

希望我能帮到你

票数 1
EN

Stack Overflow用户

发布于 2019-01-07 00:29:12

你不应该自己接触DOM,那样会扼杀react的目的

相反,您的事件侦听器应该在组件中表达,react将处理它们

在内部,这意味着react将在必要时调用addEventListener和removeEventListener以及其他有用的优化

首先,您的数据应该结构化为嵌套数组,然后映射到行和单元格

多亏了Array.prototype.map的强大功能,您可以访问行和单元格的索引

代码语言:javascript
复制
rows.map((row, rowIndex) => (
    <div>
      {row.map((cell, cellIndex) => (
        <div
          onClick={() => {
            console.log(`you clicked on ${rowIndex}, ${cellIndex}`)
          }}
        >
          {cell}
        </div>
      ))}
    </div>
  ))

以下是codesandbox https://codesandbox.io/s/6zw42m4pxw中的工作示例

票数 0
EN

Stack Overflow用户

发布于 2019-01-07 07:04:35

您可以通过组合使用onMouseOversetState和动态样式来实现这一点:

代码语言:javascript
复制
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'));
代码语言:javascript
复制
table {
  border-collapse: 'collapse'
}

td {
  padding: 1em
}
代码语言:javascript
复制
<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>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54062384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档