我在componentDidMount()中使用setState函数时遇到了一些问题。
我想做的是:我正在努力使HTML5圈响应(如果浏览器窗口更大则更大,反之亦然)。
到目前为止我做了什么:我一直在将尺寸存储在名为containerDim的状态中。默认情况下,此值设置为null。以下是我所做的基本实现:
class App extends React.Component {
constructor(props) {
super(props);
this.state = {containerDim: null};
this.resizeCircle = this.resizeCircle.bind(this) //To not loose value of this
}
componentDidMount() {
var dimensions = window.getComputedStyle(this.refs.responsiveContainer); //Used to get width and height
this.setState({
containerDim: {width:dimensions.width, height: dimensions.height}
});
window.addEventListener("resize", this.resizeCircle));
}
resizeCircle() { //THE RESIZING WORKS, THE initial setting of state doesn't
var dimensions = window.getComputedStyle(this.refs.responsiveContainer); //Used to get width and height
this.setState({
containerDim: {width:dimensions.width, height: dimensions.height}
});
}
render() {
return (
<div ref={"responsiveContainer"} >
<Circle dimensions={this.state.containerDim} />
</div>
);
}
}
//Circle component
class Circle extends React.Component {
constructor(props) {
super(props);
}
componentWillReceiveProps() {
console.log(this.props.dimensions); //THIS LOGS OUT NULL
}
render() {
CIRCLE GOES HERE
}
}
基本上我试图用这段代码来获取&#34; responseContainer&#34;的宽度和高度。并将其作为道具传递给<Circle />
组件。
上述方法不起作用,因为setState不会改变任何状态。
非常感谢任何帮助!
编辑:
这&#34; Works&#34;但我觉得这不正确,应该有更好的方法:
var dimensions = window.getComputedStyle(this.refs.container);
setTimeout(function() {
this.setState({
screenDim:{width:dimensions.width, height:dimensions.height}
});
}.bind(this),0);
this.setState({
screenDim:{width:dimensions.width, height:dimensions.height}
});
答案 0 :(得分:1)
组件不会在didMount中监听状态修改;这意味着即使状态更新,也不会触发重绘。
答案 1 :(得分:0)
你可以尝试一下吗?
componentDidMount() {
setInterval((function() {
var dimensions = window.getComputedStyle(this.refs.responsiveContainer); //Used to get width and height
this.setState({
containerDim: {width:dimensions.width, height: dimensions.height}
});
}).bind(this), 1000);
}