Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在状态改变时触发特定功能_Javascript_Reactjs_Triggers_React Hooks_React Spring - Fatal编程技术网

Javascript 在状态改变时触发特定功能

Javascript 在状态改变时触发特定功能,javascript,reactjs,triggers,react-hooks,react-spring,Javascript,Reactjs,Triggers,React Hooks,React Spring,我试图在点击按钮时触发按钮反弹,并试图克服以下几点: 如何停止useSpring,使其仅在click=true(也在加载时)时执行? 这方面的后续问题是。真是暂时的我怎么能做到呢 动画完成后或x ms后,它将恢复为false 如何阻止它每次在输入中更改useState()时执行动画 如何改进动画反弹,使其看起来更平滑?(可选) 导出默认函数App(){ const[click,setClick]=useState(false); const[input,setInput]=useState(“

我试图在点击按钮时触发按钮反弹,并试图克服以下几点:

  • 如何停止useSpring,使其仅在click=true(也在加载时)时执行? 这方面的后续问题是。真是暂时的我怎么能做到呢 动画完成后或x ms后,它将恢复为false
  • 如何阻止它每次在输入中更改useState()时执行动画
  • 如何改进动画反弹,使其看起来更平滑?(可选)
  • 导出默认函数App(){
    const[click,setClick]=useState(false);
    const[input,setInput]=useState(“”);
    const clicked=useSpring({
    to:[{transform:“scale(0.95)”},{transform:“scale(1)”},
    from:{transform:“scale(1)”},
    配置:{
    质量:1,,
    张力:1000,
    摩擦系数:13
    }
    });
    常量getInput=e=>{
    设置输入(如目标值);
    };
    返回(
    setClick(true)}>
    点击我
    );
    }
    
    我玩弄了你的代码。我找到了一个办法。首先,您应该为useSpring添加一个条件,以便仅在单击为true时播放动画。其次,动画完成后,应将“单击返回”恢复为false。我在代码中使用了恢复部分的超时

    export default function App() {
      const [click, setClick] = useState(false);
      const [input, setInput] = useState("");
      const clicked = useSpring({
        to: click
          ? [{ transform: "scale(0.95)" }, { transform: "scale(1)" }]
          : [{ transform: "scale(1)" }],
        from: { transform: "scale(1)" },
        config: {
          mass: 1,
          tension: 1000,
          friction: 13
        }
      });
    
      const getInput = e => {
        setInput(e.target.value);
      };
    
      const handleClick = () => {
        setClick(true);
        setTimeout(() => setClick(false), 700);
      };
    
      return (
        <div className="App">
          <Input placeholder="type here" onChange={getInput} />
          <animated.div style={clicked}>
            <Button style={{ width: "300px" }} onClick={handleClick}>
              Click me
            </Button>
          </animated.div>
        </div>
      );
    }
    
    导出默认函数App(){
    const[click,setClick]=useState(false);
    const[input,setInput]=useState(“”);
    const clicked=useSpring({
    收件人:单击
    ?[{变换:“尺度(0.95)”},{变换:“尺度(1)”}]
    :[{变换:“比例(1)”}],
    from:{transform:“scale(1)”},
    配置:{
    质量:1,,
    张力:1000,
    摩擦系数:13
    }
    });
    常量getInput=e=>{
    设置输入(如目标值);
    };
    常量handleClick=()=>{
    setClick(true);
    setTimeout(()=>setClick(false),700);
    };
    返回(
    

    啊,谢谢!我在做点击?{transform…}:{transform}时没有使用数组。你知道更好的方法使动画看起来更平滑吗?对我来说似乎足够平滑。我看不出有任何问题。
    export default function App() {
      const [click, setClick] = useState(false);
      const [input, setInput] = useState("");
      const clicked = useSpring({
        to: click
          ? [{ transform: "scale(0.95)" }, { transform: "scale(1)" }]
          : [{ transform: "scale(1)" }],
        from: { transform: "scale(1)" },
        config: {
          mass: 1,
          tension: 1000,
          friction: 13
        }
      });
    
      const getInput = e => {
        setInput(e.target.value);
      };
    
      const handleClick = () => {
        setClick(true);
        setTimeout(() => setClick(false), 700);
      };
    
      return (
        <div className="App">
          <Input placeholder="type here" onChange={getInput} />
          <animated.div style={clicked}>
            <Button style={{ width: "300px" }} onClick={handleClick}>
              Click me
            </Button>
          </animated.div>
        </div>
      );
    }