获取React中div的offsetTop位置

我正在尝试在React中实现一个List视图。我想要实现的是存储列表标头信息并注册组件并注册滚动事件。每次用户滚动窗口时,我都想取出存储的div并重新计算offsetTop数据。

现在的问题是,我发现控制台仅打印出初始值(该值是固定的,并且从未更改),offsetTop数据onscroll功能从未更改。

有人建议如何offsetTop_instances对象获取最新信息吗?

import React, { Component } from 'react';

import ListHeader from './lib/ListHeader';

import ListItems from './lib/ListItems';

const styles = {

'height': '400px',

'overflowY': 'auto',

'outline': '1px dashed red',

'width': '40%'

};

class HeaderPosInfo {

constructor(headerObj, originalPosition, originalHeight) {

this.headerObj = headerObj;

this.originalPosition = originalPosition;

this.originalHeight = originalHeight;

}

}

export default class ReactListView extends Component {

static defaultProps = {

events: ['scroll', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll', 'resize', 'touchmove', 'touchend'],

_instances:[],

_positionMap: new Set(),

_topPos:'',

_topWrapper:''

}

static propTypes = {

data: React.PropTypes.array.isRequired,

headerAttName: React.PropTypes.string.isRequired,

itemsAttName: React.PropTypes.string.isRequired,

events: React.PropTypes.array,

_instances: React.PropTypes.array,

_positionMap: React.PropTypes.object,

_topPos: React.PropTypes.string,

_topWrapper: React.PropTypes.object

};

state = {

events: this.props.events,

_instances: this.props._instances,

_positionMap: this.props._positionMap,

_topPos: this.props._topPos

}

componentDidMount() {

this.initStickyHeaders();

}

componentWillUnmount() {

}

componentDidUpdate() {

}

refsToArray(ctx, prefix){

let results = [];

for (let i=0;;i++){

let ref = ctx.refs[prefix + '-' + String(i)];

if (ref) results.push(ref);

else return results;

}

}

initHeaderPositions() {

// Retrieve all instance of headers and store position info

this.props._instances.forEach((k)=>{

this.props._positionMap.add(new HeaderPosInfo(

k,

k.refs.header.getDOMNode().offsetTop,

k.refs.header.getDOMNode().offsetHeight

));

});

let it = this.props._positionMap.values();

let first = it.next();

this.props._topPos = first.value.originalPosition;

this.props._topWrapper = first.value.headerObj;

}

initStickyHeaders () {

this.props._instances = this.refsToArray(this, 'ListHeader');

this.initHeaderPositions();

// Register events listeners with the listview div

this.props.events.forEach(type => {

if (window.addEventListener) {

React.findDOMNode(this.refs.listview).addEventListener(type, this.onScroll.bind(this), false);

} else {

React.findDOMNode(this.refs.listview).attachEvent('on' + type, this.onScroll.bind(this), false);

}

});

}

onScroll() {

// update current header positions and apply fixed positions to the top one

console.log(1);

let offsetTop = React.findDOMNode(this.props._instances[0].refs.header).offsetTop;

}

render() {

const { data, headerAttName, itemsAttName } = this.props;

let _refi = 0;

let makeRef = () => {

return 'ListHeader-' + (_refi++);

};

return (

<div ref="listview" style={styles}>

{

Object.keys(data).map(k => {

const header = data[k][headerAttName];

const items = data[k][itemsAttName];

return (

<ul key={k}>

<ListHeader ref={makeRef()} header={header} />

<ListItems items={items} />

</ul>

);

})

}

</div>

);

}

}

整个源代码都在Github上,您可以从这里克隆并编译它:

Github

回答:

可能会鼓励您使用Element.getBoundingClientRect()方法来获取元素的顶部偏移量。此方法提供视口中元素的完整偏移值(左,上,右,下,宽度,高度)。

查看John Resig的文章,其中描述了此方法的帮助。

以上是 获取React中div的offsetTop位置 的全部内容, 来源链接: utcz.com/qa/420165.html

回到顶部