当前位置: 首页 > 面试题库 >

jQuery和ReactJS仅动画

施文彬
2023-03-14
问题内容

我只需要使用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中的其他效果来执行此操作: 快速示例: