2

我试图捕捉用户停止输入受控输入的那一刻。它在不受控制的组件内部发生得如此顺利。

当我尝试使用时setTimeout,只有最后一个字符作为输入,其余的都没有输入。我不确定为什么会这样

import React, { Component } from "react";
import ReactDOM from "react-dom";
import {connect} from 'react-redux';

import "./styles.css";

class Main extends Component{
  state={}

  timeout = null;

  onChange = e => {
    this.props.handleInputChange(e.target.value);
  }

  render(){
    return (
      <div className="Main">
        <input type='text' value={this.props.val} onChange={this.onChange}/>
      </div>
    );
  }
}

const mapStateToProps = state => {
  val: state.reducer.val
}

const mapDispatchToProps = dispatch => {
  handleInputChange: (val)=>dispatch(reducer.changeInput(val))
}

connect(mapStateToProps,mapDispatchToProps)(Main);

当用户停止输入时,它应该调度changeInput动作

4

1 回答 1

8

你可以这样做:


const App = () => {
  const [value, setValue] = React.useState('')

  React.useEffect(() => {
    const timeout = setTimeout(() => {
      store.dispatch({ type: "CHANGE_INPUT", val: value });
    }, 2000)

    // if this effect run again, because `value` changed, we remove the previous timeout
    return () => clearTimeout(timeout)
  }, [value])

  return (
    <input
      type="text"
      value={value}
      onChange={(e) => setValue(e.target.value)}
    />
  )
}

每次value状态改变时,useEffect 函数都会运行。setTimeout超时将开始,如果在执行函数之前值再次更改(在我的示例中为 2 秒后),则可以取消超时。

于 2019-08-18T18:14:43.010 回答