转发父母onWheel到滚动表

时间:2017-12-14 15:49:01

标签: reactjs react-virtualized

我有一个包含<div />元素的外部父<Table />容器。我希望能够在父<Table />元素的onWheel事件上滚动<div />,即使鼠标当前不在<Table />上也是如此。

我有一个表元素的参考和一个事件处理程序,它正在侦听onWheel事件,但是我无法弄清楚如何将该事件转发到表中。

2 个答案:

答案 0 :(得分:1)

我做了codePen illustrating a scroll redirection

这将在父wheelEvent(红色背景的那个)上收听<div>,禁用默认滚动行为(evt.preventDefault()),然后设置scrollTop的{​​{1}}位置另一个<div>

这是组件代码:

class RedirectScroll extends React.Component {
    parentOnScroll = (evt) => {
        evt.preventDefault();
        const scrollTo= (evt.deltaY) + this.box.scrollTop;
        this.box.scrollTop = scrollTo;
    }
    render() {
        return (
            <div className="parent" onWheel={this.parentOnScroll}> // Listen scrolls on this div
               <div className="scrollablebox" ref={(box) => this.box = box}>
                   // Some content
               </div>
            </div>
        );
    }
}

我希望这就是你要找的东西。

答案 1 :(得分:1)

因为我猜你想要滚动表体,你可以试试这个。

&#13;
&#13;
class Table extends React.Component {

    constructor() {
        super();
        this.callback = this.callback.bind(this);
        this.body = null;
    }

    callback(ev) {
        
        this.body.scrollTop += ev.deltaY;
    }
    
    render() {
        return <div onWheel={this.callback}>
            <table>
                <tbody ref={c => this.body = c}>
                    {[1, 2, 3, 4, 5, 6,].map(i => <tr>
                        <td>{i}</td>
                    </tr>)}
                </tbody>
            </table>
        </div>;
    }
}

ReactDOM.render(<Table />, document.getElementById('root'));
&#13;
tbody {
  display: block;
  height: 3rem;
  overflow: scroll;
}

tr:nth-child(2n+1) {
  background-color: #ddf;
}

tr:nth-child(2n) {
  background-color: #eef;
}

table {
  margin: auto;
  border-collapse: collapse;
}

td {
  width: 5rem;
  text-align: center;
  font-family: sans-serif;
  color: #00f;
}

div {
  width: 100%;
  display: block;
  text-align: center;
  background-color: #99f;
}
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>
&#13;
&#13;
&#13;