2015-07-09 3 views
2

Когда установлен компонент EffectBox, я хочу добавить к этому компоненту class. Но переход css не работает.ReactJS: переход css не работает в компонентеDidMount

Это JS код:

var EffectBox = React.createClass({ 
    componentDidMount: function() { 
    this.show(); 
    // setTimeout(this.show, 100); 
    }, 

    show: function() { 
     $(React.findDOMNode(this)).addClass('show'); 
    }, 

    render: function() { 
     return (
     <div className="effect-box" > 
     <div className="header"></div> 
     <div className="content"> 
     ... 
     ) 
    } 
    }); 

Css следующим образом:

.effect-box { 
    transform: translate3d(0, -100%, 0); 
    transition: all .4s; 
} 

.show { 
    transform: none; 
} 

И когда я использую delay позвонить показать function(use setTimeout) СМЧ анимационные работы. На данный момент (componentDidMount), сделал ли реальный DOM-рендеринг?

ответ

-1

Вместо фиксированного времени ожидания, попробуйте ждет документа, готового в componentDidMount:

componentDidMount: function() { 
    $(document).ready(function() { 
     this.show(); 
    }); 
} 
+0

jQuery не имеет ничего общего с этим. – zvona

+0

Функция show() OP вызывает вызов jquery-метода addClass в объекте jquery! Как вы можете сказать, что jquery не имеет ничего общего с jquery? Это чепуха. – FariaC

+0

Правда, я не заметил (ненужного) использования jQuery. Однако ответственность за то, чтобы весь документ был предоставлен, не несет ответственности за компоненты. И когда мы имеем дело с Single page App и Virtual DOM, это событие jQuery будет выполняться только один раз - не обязательно, когда мы визуализируем (обновляем) компонент в представлении. – zvona

0

Я попробовал это на моем собственном Реагировать проект со следующим кодом, который, кажется, работает просто отлично:

componentDidMount: function() { 
    this.show(); 
    }, 

    show: function() { 
    React.findDOMNode(this).classList.add('show'); 
    } 

и:

.show { 
    transition: transform 400ms; 
    transform: translate3d(-200px, -200px, 0px); 
} 
0

Я встретил эту проблему, и я нашел пару решений:
Одно, что я предпочитаю больше, чтобы обернуть this.show() в requestAnimationFrame (Это мягко версия тайм-аут.)

componentDidMount: function() { 
    requestAnimationFrame(()=> {this.show();}); 
} 

Второй один очень грубо, но если вы не хотите использовать какой-либо тайм-аута вы можете вызвать relayout , Это может повредить производительности приложений.

componentDidMount: function() { 
    document.body.offsetHeight; 
    this.show(); 
} 
Смежные вопросы