2016-12-26 2 views
1

Общим случаем при выполнении css-переходов является то, что вам сначала нужно установить некоторые начальные значения, а затем перейти к другим значениям. В моем случае мне нужно изменить поле на абсолютное положение, а затем я хочу перевести его в полноэкранный режим. Это то, что я пробовал:Добавьте css в два этапа с реакцией?

componentDidMount (props) { 
    this.flky = new Flickity('.carousel', flickityOptions) 

    this.flky.on('staticClick',() => { 
    this.setState({ zoom: 'transition' },() => { 
     this.setState({ zoom: 'full' }) 
    }) 
    }) 
} 

setStyle() { 
    const container = this.refs.container 
    if (this.state.zoom === 'transition') { 
    return { 
     position: 'absolute', 
     top: container.offsetTop + 'px', 
     left: container.offsetLeft + 'px', 
     width: container.offsetWidth + 'px', 
     height: container.offsetHeight + 'px', 
     transition: 'all .5s' 
    } 
    } else if (this.state.zoom === 'full') { 
    return { 
     background: 'white', 
     position: 'absolute', 
     top: 0, 
     left: 0, 
     width: '100%', 
     height: '100%', 
     transition: 'all .5s' 
    } 
    } 
} 

<div ref='container' style={this.setStyle()} /> 

Проблема, кажется, что первоначальный CSS не применяется до того, как вторичный применяется, так ДИВ идет прямо в полноэкранном режиме. Я пытаюсь достичь этого, используя обратный вызов setState, но он не работает.

Это связано с задержкой 0мс по какой-либо причине.

this.flky.on('staticClick',() => { 
    this.setState({ zoom: 'transition' },() => { 
    setTimeout(() => { 
     this.setState({ zoom: 'full' },() => { 
      this.flky.resize() 
     }, 0) 
    }) 
    }) 
}) 
+0

он работает, если по какой-то причине я добавляю задержку на 0 секунд, но это, как правило, не очень хорошая практика, есть ли какой-то обратный вызов, который я мог бы использовать или что-то делать? – Himmators

+0

Исходный css ** применяется **. Ваша проблема в том, что вам нужна задержка 0,5 с между первым и вторым 'setState' (но они идут быстрее). Я думаю, что этот путь имеет недостаток вообще. Возможно, вы найдете более полезным использовать «ключевые кадры» в css - делать все переходы только через css. –

+0

спасибо, однако, это не так, как работает css. переходы начинаются с момента применения нового css, поэтому его нельзя переписать в этом смысле. Я обновил вопрос с задержкой 0мс. – Himmators

ответ

0

Как только состояние установлено, вы затем перезаписываете его другим состоянием. Вместо того, чтобы устанавливать css в обратном вызове setState, вы захотите установить его, как только будет сделано первое.

Я бы просто использовал интерактивную библиотеку для анимации, если бы я был вами. React Motion имеет обратный вызов onRest, который вы бы использовали для этого.

+0

Могу ли я каким-то образом сделать рендер, прежде чем перезаписать его? – Himmators

+0

Переход все равно не будет выполнен и будет перезаписан. .5s больше, чем 'setState'. –

+0

в соответствии с спецификациями css, если объект имеет свойство css, а затем получает новый css-свойство, переход происходит, я обновляю вопрос, чтобы уточнить. – Himmators