【问题标题】:React-spring - Animated div removes onclick functionReact-spring - 动画 div 移除 onclick 功能
【发布时间】:2020-10-27 18:38:46
【问题描述】:

我在 a 元素上的 onClick 函数遇到问题。如果没有 React-spring 动画,它可以完美运行。但是由于我已经向它添加了动画,所以功能不起作用。控制台没有错误,我在谷歌上真的找不到这样的问题。你遇到过这类问题吗?

声明动画

import {useTransition, animated} from 'react-spring';

const gameOptionsTransitions = useTransition(showGameOptions, null, {
 from: { opacity: 0, transform:'translateY(200px)' },
 enter: { opacity: 1, transform:'translateY(0)' },
 leave: { opacity: 0, transform:'translateY(200px)'}
});

作为回报

{gameOptionsTransitions.map(({ item, key, props }) =>
      item && 
          <animated.div key={key} style={props}>
              <Link to="/play">
                  <a className="playerVsComputer-btn" onClick={props.playPlayerVsComputer}>Player vs. Computer</a>
              </Link>
                
              <Link to="/play">
                  <a className="playerVsComputer-btn" onClick={props.playPlayerVsPlayer}>Player vs. Player</a>
              </Link>

              <form onSubmit={handleSubmit}>
                  <input type="text" ref={sizeOfBoard} onChange={removeHighlightInput} autoFocus />
              </form>
          </animated.div>
  )};

如您所见,两个 a 元素都包裹在 Link 元素中。因此,单击后,您将被重定向到该路径,但也应触发函数。此函数作为道具从 App.js 发送到此组件。我尝试将整个 onClick={props.playPlayerVsComputer}a 元素移动到 Link 但没有任何变化。

发送功能

  function playPlayerVsPlayer(){
    setPlayerVsPlayer({
      AI:false,
      AImove:false
    });

    setDimensions({
      rows:"3",
      columns:"3"
    })

    generateMatrix(3,3);
  }

此函数设置维度状态,然后根据这些维度创建矩阵。然后 generateMatrix 函数触发另一个函数,该函数将行 x 列表呈现给 App。但这并不重要,因为动画 div 会有问题,而不是这些函数。

【问题讨论】:

    标签: javascript reactjs react-props react-spring


    【解决方案1】:

    我已经像这样更改了动画 div,所以 Link 元素内部没有任何其他元素,classNames 也移到了 Link元素。

    {gameOptionsTransitions.map(({ item, key, props }) =>
        item && 
            <animated.div key={key} style={props}>
                <Link to="/play" className="setGameMode-btn" onClick={playPlayerVsComputer}>
                    Player vs. Computer
                </Link>
        
                <Link to="/play" className="setGameMode-btn" onClick={playPlayerVsPlayer}>
                    Player vs. Player
                </Link>
    
                <form onSubmit={handleSubmit}>
                    <input type="text" ref={sizeOfBoard} onChange={removeHighlightInput} autoFocus />
                </form>
            </animated.div>
    )};
    

    对于 onClick 事件,我创建了两个新函数,它们从 App.js 作为道具调用这些函数。

    //Fire animations sent as a props
    function playPlayerVsComputer(){
        props.playPlayerVsComputer();
    }
    
    function playPlayerVsPlayer(){
        props.playPlayerVsPlayer();
    }
    

    【讨论】:

      【解决方案2】:

      您正在添加一个具有自己的 props 的反应弹簧过渡,

      您只需将 props => 重命名为其他名称(例如 annimationProps),以免混淆 App 文件传递​​给您的组件的道具

      如下:

      {gameOptionsTransitions.map(({ item, key, annimationProps }) =>
            item && 
                <animated.div key={key} style={annimationProps}>
                    <Link to="/play">
                        <a className="playerVsComputer-btn" onClick={props.playPlayerVsComputer}>Player vs. Computer</a>
                    </Link>
                      
                    <Link to="/play">
                        <a className="playerVsComputer-btn" onClick={props.playPlayerVsPlayer}>Player vs. Player</a>
                    </Link>
      
                    <form onSubmit={handleSubmit}>
                        <input type="text" ref={sizeOfBoard} onChange={removeHighlightInput} autoFocus />
                    </form>
                </animated.div>
      )};
      

      【讨论】:

      • 感谢您的回答!您的方法确实修复了该功能,现在它按预期工作,但现在动画不起作用..我已经用这种方法修复了它。检查答案
      • 我已经发布了
      • 您有在路线之间转换的经验吗? @SpringerF
      • @Pinncik ,不,真的很抱歉
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多