我收到此错误:Cannot read property 'getBoundingClientRect' of null
。我使用此功能getBoundingClientRect
,因为在我的项目中,我希望具有以下效果:在突出显示一个元素的同时,其余元素具有不同的样式。该消息显示功能handleScroll
。我使用的组件看起来像这样
class QuestionListItem extends Component {
constructor() {
super();
this.state = {
isActive: false,
};
this.handleScroll = this.handleScroll.bind(this);
}
componentDidMount = () => {
window.addEventListener('scroll', this.handleScroll);
this.handleScroll();
};
handleScroll = () => {
const { isActive } = this.state;
const { top } = this.wrapRef.getBoundingClientRect();
if (top > 60 && top < 400 && !isActive) {
this.setState({ isActive: true });
}
if ((top <= 60 || top >= 400) && isActive) {
this.setState({ isActive: false });
}
}
setWrapRef = (ref) => {
this.wrapRef = ref;
}
render() {
const { isActive } = this.state;
const { question } = this.props;
return (
<div
className={`Test__questions-item--noactive ${isActive && 'Test__questions-item--active'}`}
ref={this.setWrapRef}
>
<li key={question.id}>
<p>
{question.question}
</p>
<QuestionAnswerForm name={question.question} />
</li>
</div>
);
}
}
为什么会有这样的错误?感谢您的提前帮助:)
答案 0 :(得分:0)
我认为问题是您尚未为ref
创建任何wrapRef
。如错误所述无法获取null属性;因此wrapRef
本身为空
class QuestionListItem extends Component {
constructor() {
super();
this.state = {
isActive: false,
};
this.handleScroll = this.handleScroll.bind(this);
}
componentDidMount = () => {
window.addEventListener('scroll', this.handleScroll);
this.handleScroll();
};
wrapRef=React.createRef();
handleScroll = () => {
const { isActive } = this.state;
const { top } = this.wrapRef.current.style;
if (top > 60 && top < 400 && !isActive) {
this.setState({ isActive: true });
}
if ((top <= 60 || top >= 400) && isActive) {
this.setState({ isActive: false });
}
}
render() {
const { isActive } = this.state;
const { question } = this.props;
return (
<div
className={`Test__questions-item--noactive ${isActive && 'Test__questions-item--active'}`}
ref={this.wrapRef}
>
<li key={question.id}>
<p>
{question.question}
</p>
<QuestionAnswerForm name={question.question} />
</li>
</div>
);
}
}
答案 1 :(得分:0)
正如我注意到的代码所示,您在其中使用了带有componentDidMount的箭头功能。
应该是:
componentDidMount() {}
如果您将箭头函数与handleScroll一起使用,则无需在构造函数中进行绑定,请尝试将其删除,然后按以下方式修改handleScroll:
handleScroll = () => {
const { isActive } = this.state;
if (this.wrapRef) {
const { top } = this.wrapRef.getBoundingClientRect();
if (top > 60 && top < 400 && !isActive) {
this.setState({ isActive: true });
}
if ((top <= 60 || top >= 400) && isActive) {
this.setState({ isActive: false });
}
}
}
还删除了在componentDidMount中的事件列表器之后调用this.handleScroll()的函数,因为它没有用。