2016-02-04 6 views
4

У меня возникло несколько проблем с использованием функции setState в компонентеDidMount().setState не работает в компонентеDidMount() - React

Что я пытаюсь сделать: Я пытаюсь сделать круг 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 
    } 

} 

В основном то, что я пытаюсь сделать с этим кодом, чтобы получить ширину и высоту «responseContainer» и передать его в качестве опоры к <Circle /> компонент.

Вышеупомянутое не работает, так как setState не изменяет состояние вообще.

Любая помощь была бы принята с благодарностью!

EDIT:

Это «работает», но я чувствую, что это не правильно и должно быть лучше:

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

У вас есть ошибки? –

+0

Проблема в том, что когда я вызываю setState, на самом деле ничего не меняется. ContainerDim все равно будет null. Проблема в том, что setState будет делать только что-то, если я его дважды назову. Еще более странно то, что даже если setState ничего не меняет, он по-прежнему вызывает componentWillReceiveProps. – mre12345

+0

Не связано с вопросом, но почему бы просто не использовать CSS (ширина жидкости) для изменения размера круга? – villeaka

ответ

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); 
    } 
+0

Я попробовал это и в компонентеWillReceiveProps() Я получаю сигнал, что они были сменными, но когда он печатает, он по-прежнему равен нулю ... После первого интервала он работает, хотя – mre12345

+0

EDIT: Я добавил функциональность изменения размера к примеру, единственное, с чем я столкнулся, - это отправить начальная ширина и высота чувствительного контейнера к компоненту Circle – mre12345

+0

EDIT2: Хм, это действительно странно ... Я установил значение setInterval на 10 секунд и даже тогда первый раз не работал, но все остальные интервалы работают. – mre12345

1

Компонент не прослушивает изменения состояния в didMount; это означает, что даже если состояние обновлено, перерисовка не запускается.

+4

Итак, где бы вы порекомендовали мне использовать setState, где я могу сообщить компоненту Circle, что высота и ширина отзывчивого Контейнера? – mre12345

+3

@pinturic вы можете предоставить ссылку ссылки? Из документа [docs на жизненном цикле компонента] (https://facebook.github.io/react/docs/react-component.html#componentdidmount) в отношении 'componentDidMount() 'он говорит:« Состояние настройки в этом методе будет срабатывать повторного рендеринга ". – Marklar

Смежные вопросы