我只需要使用jQuery动画,请不要提及过渡。
这是我的代码库
var CommentForm = React.createClass({
componentWillUnmount: function(cb) {
console.log('hiding')
jQuery(this.getDOMNode()).slideUp('slow', cb);
console.log((this.getDOMNode()))
},
componentDidMount: function() {
jQuery(this.getDOMNode()).hide().slideDown('slow');
if (this.props.autofocus) {
jQuery(this.refs.commentArea.getDOMNode()).focus();
}
},
render: function() {
return (
<div>
<div className="panel-footer" ref="commentComponent">
<form role="form">
<div className="form-group">
<textarea className="form-control" placeholder="Say something nice!" ref="commentArea"></textarea>
</div>
<div className="pull-right">
<button className="btn btn-default btn-md" type="button"><span className="fa fa-comment"></span> Comment</button>
</div>
<div className="clearfix"></div>
</form>
</div>
</div>
);
}
});
如您所见,安装组件时,我可以添加一个很棒的动画,但是不能像代码中提到的那样用动画来卸载该组件。
任何想法如何仅使用jQuery来做到这一点?和Reactjs组件生命周期?
这是我通过过于简单的演示来解决此问题的尝试。
jsFiddle 。
JavaScript:
var Container = React.createClass({
onClicked: function() {
console.log('Container.onClicked');
if(this.state.isShowing){
this.refs.myHelloWorld.hide();
} else {
this.setState({ isShowing: true });
}
},
onAnimationComplete: function() {
console.log('Container.onAnimationComplete');
this.setState({ isShowing: false });
},
getInitialState: function() {
return { isShowing: false };
},
render: function() {
var helloWorld = this.state.isShowing ? <Hello name="World!" onComplete={this.onAnimationComplete} ref="myHelloWorld" /> : '';
return (
<div id="container">
<MyButton onButtonClicked={this.onClicked}/>
{helloWorld}
</div>
);
}
});
var MyButton = React.createClass({
render: function() {
return <button onClick={this.props.onButtonClicked}>Toggle</button>;
}
});
var Hello = React.createClass({
hide: function() {
console.log('Hello.hide');
var that = this;
$(React.findDOMNode(this)).stop(true).fadeOut({
duration: 1200,
complete: function() {
that.props.onComplete();
}
});
},
componentDidMount: function() {
console.log('Hello.componentDidMount');
$(React.findDOMNode(this)).stop(true).hide().fadeIn(1200);
},
componentWillUnmount: function() {
console.log('Hello.componentWillUnmount');
},
render: function() {
return <div>Hello { this.props.name }</div>;
}
});
React.render(<Container />, document.body);
正如你已经想通了,这是不是很难任何动画子组件 中 通过使用主视图
componentDidMount
生命周期事件。
然而,这是棘手的做同样的,当我们要进行动画 了 ,从我们主要考虑到我们孩子的组件,因为相应的
componentWillUnmount
生命周期事件触发 后,
我们认为有实际未安装,并且没有可用的,我们可以在这之前使用事件。即使存在,我们也不得不从其内部或主视图中手动删除子组件。我最初考虑使用
React.unmountComponentAtNode
相同的方法,但后来又想出了另一种方法。
解决方案是首先从主视图向子组件发送一个回调,作为以后使用的参数。然后,我们调用子组件这将动画的另一种方法 进行
组件的DOM节点本身。最后,当动画完成时,我们将触发与之前收到的相同的回调。
希望这可以帮助。
PS此方法不受jQuery animate()
及其相关方法的约束,而是可以用于任何其他基于JS的动画库(我正在研究我最喜欢的
GSAP ;)),只要它们在动画播放时触发回调已完成( GSAP 提供了
很多 )。
更新#1:
哇哇哇!
因此,碰巧的是,我更多地研究了ReactJS,尤其是它的动画部分,看看我发现了什么,他们公开了
用于转换事件的低级API 。
因此,我们试图通过自己的回调来更早完成该事情,并且我们的props
对象维护对etc的引用,事实证明,可以使用此API本身来完成。
我不确定目前是否真的很喜欢它,因为我还没有在实际项目中实现这两种技术,但是我很高兴我们现在有可用的选项。我们可以使用内部API,也可以按照我们先前的建议烹饪自己的解决方案。
看一下经过修改的 jsFiddle
所做的相同的事情,但是这次使用内部回调,例如
componentWillEnter
和
componentWillLeave
。
我正在学习React Redux,但我不了解制作动画的正确方法。让我们举个例子: 例如,我有一个列表,我想在点击时删除项目。这是超级容易,如果我没有动画效果:调度点击动作,减速机从商店中删除项目,并做出反应重新渲染html。 让我们添加一个在单击时删除行项目的动画。所以,当用户点击一个项目时,我想运行一个奇特的效果,删除行项目,然后。。。怎样我可以想出几种方法: 1)单击我调度动作,然后减速器在S
问题内容: 我正在尝试在我的react应用中使用bootstrap,但这给了我一个。我已经导入了jquery并尝试从其他帖子尝试以下操作: 但是,我仍然会收到错误消息。 解决此问题的唯一方法是将 进入index.html 有没有一种方法可以导出jquery或引导程序能够检测/读取它? 我通过以下方式致电我的引导程序 问题答案: 我尝试使用“ create-react-app”构建一个项目,发现导入
问题内容: 我是ReactJS的新手。以前,我使用jQuery设置所需的任何动画或功能。但是现在我正在尝试使用ReactJS并最小化jQuery的使用。 我的情况是: 我正在尝试使用ReactJS构建手风琴。 使用JQuery : 我的问题: 我该如何使用ReactJS? 问题答案: 您应该尝试避免在ReactJS中使用jQuery。但是,如果您真的想使用它,则可以将其放入组件的component
我想在render()中动态生成输出,但遇到了一个非常奇怪的情况。我有一个使用fetch()从数据库检索数据的过程。一旦得到数据,我就确定数据记录的数量,然后执行for循环,用返回的数据填充数组。在for循环之前有一个console.log()来显示数据接收数组的内容,在填充接收数组时还有另一个console.log()。出于某种原因,在填充数组的特定引用时,数组的所有引用似乎都在更改。这是我的全
问题内容: 我试图在ReactJS组件中使用event.stopPropagation()来阻止单击事件冒泡并触发遗留代码中与JQuery关联的click事件,但是似乎React的stopPropagation()只能停止传播到事件也附加在React中,并且JQuery的stopPropagation()不会停止传播到随React附加的事件。 有什么方法可以使stopPropagation()在这
问题内容: 我所看到的和jQuery的。左右滑动的功能/方式如何? 问题答案: 您可以使用jQueryUI中的其他效果来执行此操作: 快速示例: