在使用reactcstransitiongroup时遇到麻烦
Having trouble using ReactCSSTransitionGroup
我正在尝试实现reactcstransitiongroup,并遵循React网站上的示例。我使用的是React 0.14-rc1,由于某种原因,reactcstransitiongroup组件似乎没有任何影响。我甚至没有在控制台上得到任何错误。我的代码:
import React, { PropTypes } from 'react';
import ReactDOM from 'react-dom';
import classnames from 'classnames';
import Dropzone from 'react-dropzone';
import styles from './AddEventForm.css';
import withStyles from '../../../../../decorators/withStyles';
import Link from '../../../../../utils/Link';
import DateSelects from '../DateSelects';
import {StartDateSelect} from '../DateSelects';
import {EndDateSelect} from '../DateSelects';
import {EventTypeSelect} from '../DateSelects';
import ProfileStore from '../../../../../stores/ProfileStore';
import TimelineStore from '../../../../../stores/TimelineStore';
import TimelineDispatcher from '../../../../../dispatchers/TimelineDispatcher';
import TimelineActions from '../../../../../actions/TimelineActions';
import ReactCSSTransitionGroup from 'react-addons-css-transition-group';
let getProfileState = () => {
return {
profile: ProfileStore.getProfile()
};
}
let getTimelineState = () => {
return {
timeline: TimelineStore.getEvents()
};
}
class AddEventForm extends React.Component {
_onChange() {
this.setState(getTimelineState());
}
constructor() {
super();
this.state = {};
this.state.files = [];
this.state.profile = getProfileState();
this.state.timeline = getTimelineState();
}
componentDidMount() {
TimelineStore.addChangeListener(this._onChange.bind(this));
}
componentWillUnmount() {
TimelineStore.removeChangeListener(this._onChange.bind(this));
}
onDrop(files) {
console.log('Received files: ', files);
this.setState({
files: files
});
}
render() {
return(
<ReactCSSTransitionGroup
transitionEnterTimeout={500}
transitionLeaveTimeout={500}
transitionName="EventForm">
<form onSubmit={ TimelineActions.createEvent.bind(this) } id="addTimelineEventForm" className="AddTimelineEvent">
<a className="AddTimelineEventCloseButton" onClick={ TimelineActions.closeModal.bind(this) }>
<i className="fa fa-times"></i>
</a>
<h3>Add Event</h3>
<div className="AddEventTitle TimelineFormField">
<input ref="event_title"
className="TimelineInput" placeholder="Title" />
</div>
<div className="AddEventPlace TimelineFormField">
<input ref="event_place"
className="TimelineInput" placeholder="Place" />
</div>
<div className="AddEventLocation TimelineFormField">
<input ref="event_location"
className="TimelineInput" placeholder="Location" />
</div>
<div className="AddEventDescription TimelineFormField">
<textarea ref="event_description"
rows="2" className="TimelineInput" placeholder="Description"></textarea>
</div>
<StartDateSelect />
<EndDateSelect />
<EventTypeSelect />
<div className="AddEventMedia TimelineFormField">
<Dropzone className="Dropzone" activeClassName="DropzoneActive" ref="dropzone" multiple={true} disableClick={false} onDrop={this.onDrop.bind(this)}>
<div>Try dropping some files here, or click to select files to upload.</div>
{this.state.files.length > 0 ?
<div>
<div>{this.state.files.map((file) =>
<div className="DropzoneUploadedImageContainer">
<img className="DropzoneUploadedImage" key={file.preview} src={file.preview} />
<br className="clear" />
</div> )}
</div>
<p className="DropzoneFileCount">{this.state.files.length} files</p>
</div> : null}
</Dropzone>
<p className="AddTimelineEventNote">Note: Images only, maximum 4 images and maximum file size is 2 MB</p>
<button type="submit" form="addTimelineEventForm" className="SaveEventButton btn btn-primary">Save</button>
<a onClick={ TimelineActions.closeModal.bind(this) } className="SaveEventButton btn btn-default">Cancel</a>
</div>
</form>
</ReactCSSTransitionGroup>
);
}
}
export default AddEventForm;
CSS: @keyframes scaleUp {
from {
opacity: 0;
transform:scale(0.2);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes scaleDown {
from {
opacity: 1;
transform:scale(1);
}
to {
opacity: 0;
transform:scale(0);
}
}
.EventForm-enter {
opacity: 0.01;
}
.EventForm-appear {
opacity: 0.01;
transition: scaleUp .5s ease-in;
}
.EventForm-enter.EventForm-enter-active {
opacity: 1;
transform:scale(1);
}
.EventForm-leave {
opacity: 0;
transition: scaleDown .5s ease-in;
}
你知道是什么引起的吗?
关于CSS过渡的官方react文档解释说,当最初挂载时,过渡组中的组件不会动画化。
-enter
和enter-active
类仅在更新后添加item时应用。要么通过状态更改,要么通过重新呈现父组件。
如果你想在初始安装上动画,你应该把transitionAppear={true}
添加到你的reactcstransitiongroup组件中。对应的css类为AddTimeLineEvent-appear
和AddTimeLineEvent-appear-active
。
希望这能解决问题。
BTW:如果你只想在初始挂载时有一个动画,你可以在componentDidMount()上添加一个函数:
this.refs.getDOMNode('myRef').classList.add("active");
并将ref="myRef"
添加到表单中以设置动画。
相关文章:
- 使用JavaScript获取Google地图上显示的所有推文时遇到麻烦
- 在 Javascript 中添加数字时遇到麻烦
- 使用 Coffeescript 和 Express .js 将变量传递给 Jade 时遇到麻烦
- 编写正确的 jQuery 插件时遇到麻烦
- 在三.js中更改纹理时遇到麻烦
- 从 javascript 中的函数返回时遇到麻烦
- 理解 $.ajax() 参数以获取 PHP 变量时遇到麻烦
- 比较数组时遇到麻烦
- 使 JavaScript 函数工作时遇到麻烦
- 在Firefox和IE中获取CSS属性时遇到麻烦
- 将 Blueimp Gallery 与 HTML 和 Bootstrap 集成时遇到麻烦
- 将jQuery导入WordPress时遇到麻烦
- 在解决来自 coderbyte 的 JavaScript 编码挑战时遇到麻烦
- 从页面抓取时遇到麻烦
- 让jQuery在Wordpress中工作时遇到麻烦
- 在codeigniter框架中添加css和js文件时遇到麻烦
- 处理由dayClick返回的日期时遇到麻烦
- 在使用jQuery更改依赖于滚动位置的类时遇到麻烦
- 在使用javascript加速滚动动画时遇到麻烦
- 在跨域jquery/Ajax服务调用中遇到麻烦