Я работаю над более крупным проектом, но я создал этот короткий пример, чтобы проиллюстрировать проблему.
Если я использую компонент Box
, он работает. Он выводит в консоль componentWillEnter
и componentWillLeave
, когда мы нажимаем на кнопку.
Если я использую контейнер BoxContainer
, он больше не работает. componentWillEnter
и componentWillLeave
специальные хуки жизненного цикла не вызываются.
{this.state.shouldShowBox && <BoxContainer/>}
Сборка Webpack выполнена корректно, ошибок в консоли нет, но ничего не выводит.
Я также пробовал использовать высокоуровневый API :ReactCSSTransitionGroup
, и он работает с компонентами Box
и BoxContainer
. Но мне нужно использовать низкоуровневый API: ReactTransitionGroup
.
У вас есть идея, почему это не работает, когда мы используем react-redux
?
Используемая версия:
- реагировать: 15.0.2
- редукс: 3.5.2
- реакция-редукс: 4.4.5
Код :
import React from 'react';
import {render} from 'react-dom';
import {Provider, connect} from 'react-redux';
import {createStore, compose, combineReducers} from 'redux';
import TransitionGroup from 'react/lib/ReactTransitionGroup';
// Box component
class Box extends React.Component {
componentWillEnter(callback) {
console.log('componentWillEnter');
callback();
}
componentWillLeave(callback) {
console.log('componentWillLeave');
callback();
}
render() {
return <div className="box"/>;
}
}
// Boxe connected component
const BoxContainer = connect(null, {})(Box);
// App component
class App extends React.Component {
state = {
shouldShowBox: true
};
toggleBox = () => {
this.setState({
shouldShowBox: !this.state.shouldShowBox
});
};
render() {
return (
<div>
<TransitionGroup>
{this.state.shouldShowBox && <BoxContainer/>}
</TransitionGroup>
<button className="toggle-btn" onClick={this.toggleBox}>
toggle
</button>
</div>
);
}
}
// reducer
function reducer(state = [], action) {
switch (action.type) {
default:
return state
}
}
// store
const store = createStore(reducer);
// render
render(
<Provider store={store}>
<App />
</Provider>
,
document.getElementById('root')
);