【问题标题】:Making text fade in/out on button click in React在 React 中单击按钮时使文本淡入/淡出
【发布时间】:2020-04-27 15:22:26
【问题描述】:

我有一个用 React 编写的随机报价生成器:https://codepen.io/1000mileworld/pen/RwNMwKE

当我点击新报价按钮时,我希望之前的报价淡出,新报价淡入。

我试图使用一些 jQuery 在设置新状态之前将不透明度更改为 0,然后将不透明度返回到 1。我可能必须在某个地方的 handleClick() 之外执行此操作,但不确定如何操作。

handleClick() { 
 $("#text").animate({ opacity: 0 }, 500);

 const quote = getRandomQuote();
 this.setState({
   text: quote.text,
   author: quote.author
 });

 $("#text").animate({ opacity: 1 }, 500);    
}

【问题讨论】:

    标签: javascript jquery css reactjs


    【解决方案1】:

    通常不建议在使用 React 渲染这些元素时查询 DOM(即使用选择器选择一个元素以调用 $.animate() on)。

    也许您可以考虑另一种方法,将 JQuery 全部绕过,而是使用 CSS 过渡和 React 来实现等效的淡入淡出过渡?

    这样的事情可能对你有用:

    JSX

    const FADE_DURATION = 1000;
    
    class Application extends React.Component {
        constructor(props){
        super(props);
        this.state = {     
            text: quote.text,
            author: quote.author,
    
            // Add extra state to control fading
            fadeTransition : null,
            fadeState : "fade-in",
        }
        this.handleClick = this.handleClick.bind(this)
        }
    
        handleClick(){ 
    
        // Create a timer that runs after quote
        // fades out
        const timeout = setTimeout(() => {
    
            // After current quote faded out, fetch
            // next quote and display
            const quote = getRandomQuote();
    
            this.setState({
            text: quote.text,
            author: quote.author,
            // Apply additional state to control
            // fading transition
            fadeTransition : null,
            fadeState : 'fade-in'
            });    
        }, FADE_DURATION);
    
        // Stop any existing transition
        clearTimeout(this.state.fadeTransition);
    
        // Update state to perform the fade out from
        // current quote
        this.setState({ 
            fadeState : 'fade-out', 
            fadeTransition : timeout 
        });
        }
    
        render() {
        return (
            <div className={`fade-wrapper ${this.state.fadeState}`} 
                    style={{ transitionDuration: `${FADE_DURATION}ms`}}>
            <Display text={this.state.text} 
                        author={this.state.author} 
                        click={this.handleClick} />
            </div>
        );
        }
    }
    

    CSS

    /* Add this to existing css */
    .fade-wrapper {
        transition:opacity ease-in-out;
    }
    .fade-out {
        opacity:0;  
    }
    .fade-in {
        opacity:1;
    }
    

    Here's a working example(抱歉,CSS 有点损坏)- 希望对您有所帮助!

    【讨论】:

    • 感谢这对我有用!我可以处理 CSS 哈哈
    • 所以我实际上有一个关于计时器如何清除的问题。假设您非常快地单击按钮两次,因此第一次淡入未完成。由于您正在清除变量“超时”,它如何知道清除第一次而不是第二次点击的淡入?只是因为第二次点击不应该重新定义“超时”而感到困惑?我知道 setTimeout 是异步的,但不确定它是否也包括变量定义
    • 在您描述的情况下,我们的想法是确保在我们安排新的时间之前取消排队以触发“淡入”的任何旧时间。在上面的代码中,我们首先安排一个要调用的函数来设置“淡入”动画。如果将来调用此方法,则淡入将进行。然后我们取消之前使用clearTimeout 安排的任何计时器,如上所示。当前状态变量this.state.fadeTransition 上可能实际上不存在计时器,但无论如何我们都会调用它,以防万一。接下来,我们启动fade-out。所有动画都是..
    • .. 实际由浏览器处理。这就是 CSS 过渡的好处——如果 CSS 过渡是在一个元素的属性过渡的中间,我们去改变那个元素的类或样式,浏览器会自动为我们处理这个 - 不需要额外的工作来管理我们需要“完成一半”的过渡。不确定这是否有帮助,但希望它填补了我的回答中的一些空白:-)
    • 所以要检查我的理解,在第一次单击时 this.state.fadeTransition 设置为在淡出上一个报价期间超时,但在第二次单击中,因为 this.state.fadeTransition 在 clearTimeout 之后设置timeout 变量在传递给 clearTimeout 时仍然指的是第一次点击?
    【解决方案2】:

    您可以使用 animate 中的回调,并在那里设置状态。比如:

        $( "#txt" ).animate({
        opacity: 0,
      }, 2000, function() {
        that.setState({text:"world"});
        $( "#txt" ).animate({
        opacity: 1,
      }, 2000, function() {
        // Animation complete.
      });
    

    您需要注意“this”的范围需要在回调中处理。我只是在示例中执行 that=this 只是为了演示回调的用法。

    https://jsfiddle.net/pythagoras2357/8zarn94j/9/

    https://api.jquery.com/animate/

    【讨论】:

    • 我不知道用什么来替换“this”。尝试了 Application.setState 但得到一个错误,说 setState 不是一个函数。但是,以另一种方式解决了问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    相关资源
    最近更新 更多