Я использую сборник рассказов для визуализации изменений компонентов React после моделирования взаимодействия пользователя с ферментом.В качестве небольшого примера я хочу, чтобы история отображала компонент после нажатия одной из его кнопок.
Проблема, с которой я столкнулся, заключается в том, что конструктор компонента вызывается дважды: один раз, когда компонент монтируется ферментом изатем после того, как сборник рассказов отобразит компонент.Это возвращает компонент в его состояние по умолчанию, поэтому любые изменения после имитации взаимодействия с пользователем теряются.
Вот некоторый код, показывающий проблему.После загрузки истории компонент кнопки находится в состоянии «без щелчка», несмотря на то, что щелчок имитировался с помощью фермента:
import React from 'react';
class SampleComponent extends React.Component {
constructor(props){
super(props);
console.log('constructor');
this.state = {isClicked: false};
this.onClick = this.onClick.bind(this);
}
onClick(){
console.log('onClick');
this.setState({isClicked: true});
}
render(){
const text = (this.state.isClicked)? 'Clicked!' : 'Not Clicked';
return (
<div>
<input type='button' value='Click' onClick={this.onClick} />
<p>{text}</p>
</div>
);
}
}
export default SampleComponent;
Файл истории:
import React from 'react';
import { storiesOf } from '@storybook/react';
import { mount } from 'enzyme';
import { specs, describe, it } from 'storybook-addon-specifications';
import SampleComponent from '../src/SampleComponent';
storiesOf('SampleComponent', module)
.add('clicked', () => {
const comp = <SampleComponent/>;
specs(() => describe('clicked', function () {
it('Should display clicked state message', function () {
const output = mount(comp);
output.find('input').simulate('click');
});
}));
return comp;
});
Выходные данные дляконсоль будет:
constructor
onClick
constructor