我想在触发滚动事件时以百分比形式返回进度, 我不知道如何更新状态以获得正确的结果,并将其显示在div标签中 预先感谢。
这是我的脚本:
import React from "react";
class ProgressBar extends React.Component {
constructor(props) {
super(props);
this.state = {
percentage: 0,
};
}
getProgressPercentage() {
let maxHeight = document.body.scrollHeight - window.innerHeight;
let percent = (window.pageYOffset / maxHeight) * 100;
let progress = Math.round(percent) + "%";
// console.log(progress);
return progress;
}
componentDidMount() {
document.addEventListener("scroll", this.getProgressPercentage);
}
componentWillUnmount() {
document.removeEventListener("scroll", this.getProgressPercentage);
}
render() {
return <div> {this.state.percentage} </div>;
}
}
export default ProgressBar;
答案 0 :(得分:1)
使用this.setState()
(docs,resource)
getProgressPercentage() {
let maxHeight = document.body.scrollHeight - window.innerHeight;
let percent = (window.pageYOffset / maxHeight) * 100;
let progress = Math.round(percent) + "%";
// console.log(progress);
this.setState({ percentage: progress })
return progress;
}
componentDidMount() {
document.addEventListener("scroll", () => this.getProgressPercentage());
}
componentWillUnmount() {
document.removeEventListener("scroll", () => this.getProgressPercentage());
}
为什么您的代码无法按预期工作:
当您写这篇文章时:
document.addEventListener("scroll", this.getProgressPercentage)
this.getProgressPercentage()
不会作为组件的方法执行,而不会作为函数执行。含义this
并非您的想法:它将不是您的组成部分。因此,setState
上将没有this
。因此,您得到的错误是:this.setState is not a function
。
JavaScript中有关this
的更多信息here和here,这里是arrow functions
答案 1 :(得分:0)
您应该使用setState
:
getProgressPercentage() {
let maxHeight = document.body.scrollHeight - window.innerHeight;
let percentage = (window.pageYOffset / maxHeight) * 100;
this.setState({ percentage });
}
这将触发以正确的百分比值重新呈现。 我删除了进度变量,因为我认为它应该在渲染器中。
答案 2 :(得分:0)
使用setState,引用:Description
this.setState((state, props) => {
return {counter: state.counter + props.step};
});
getProgressPercentage() {
let maxHeight = document.body.scrollHeight - window.innerHeight;
let percent = (window.pageYOffset / maxHeight) * 100;
let progress = Math.round(percent) + "%";
this.setState({ percentage })
}
答案 3 :(得分:0)
在下面的实例上简单使用setState方法。
getProgressPercentage() {
//your code
this.setState({ percentage });
}
答案 4 :(得分:0)
感谢您的回答,这是我找到的解决方案,无论如何,我不明白为什么在此文本中没有“ requestAnimationFrame ”的情况下“ setState”无法正常工作。
getProgressPercentage() {
let maxHeight = document.body.scrollHeight - window.innerHeight;
let percent = (window.pageYOffset / maxHeight) * 100;
let progress = Math.round(percent);
this.setState({ percentage: progress });
}
lisenOnScrollEvent() {
document.addEventListener("scroll", () => {
requestAnimationFrame(() => {
this.getProgressPercentage();
});
});
}
componentDidMount() {
this.lisenOnScrollEvent();
}