【问题标题】:How to find when user stops typing in controlled components?如何查找用户何时停止输入受控组件?
【发布时间】:2019-12-24 02:09:13
【问题描述】:

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

当我尝试使用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 动作

【问题讨论】:

  • 提供你的代码尝试解决问题,我们可以看看有什么问题
  • 好吧,我已经到了这一点!我试图在用户停止输入后立即发送CHANGE_INPUT 操作。 codesandbox.io/s/redux-example-ii9tx
  • 请看上面的链接

标签: reactjs forms input react-redux controlled-component


【解决方案1】:

你可以这样做:


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 秒后)再次更改值,则可以取消该超时。

【讨论】:

  • 您能否详细说明我的代码和您的代码之间的区别?除了您提供的代码是用 React 钩子编写的之外,它们不是一回事吗?
  • 你的例子抛出一个TypeError,所以我无法比较。我希望得到你有“只有最后一个字符作为输入休息”的版本 - 问题。
  • 我对@9​​87654326@ 感到困惑。如果我在减速器道具的输入中接收到值,代码将如何变化?我的意思是const App = (value) =&gt; ...
  • 那里有两种状态:一种存在于 redux 中(每 500 毫秒更新一次),另一种是本地状态(应该立即更新)。您想在文本框中显示即时的,因为您不想在每次按键后等待 500 毫秒查看结果,然后每 500 毫秒使其与 redux 中的同步。
猜你喜欢
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多