与 debounce、event.persist() 和在父组件中存储值一起使用时,输入不起作用

Posted

技术标签:

【中文标题】与 debounce、event.persist() 和在父组件中存储值一起使用时,输入不起作用【英文标题】:Input doesn't work when used with debounce, event.persist() and storing value at parent component 【发布时间】:2020-02-02 11:48:19 【问题描述】:

我需要一个带有去抖动搜索的输入字段,并且值应该从父组件传递。但是当从父组件传递值时它不起作用。实施它的正确方法是什么?

代码沙盒示例https://codesandbox.io/embed/debounce-input-owdwj

带去抖动的文本字段

class MyTextField extends Component 
  search = _.debounce(event => 
    this.props.onChange(event.target.value);
  , 300);

  handleChangeInput = event => 
    event.persist();

    this.search(event);
  ;

  render() 
    return (
      <TextField
        value=this.props.value
        placeholder="type"
        onChange=this.handleChangeInput
      />
    );
  
 

存储文本字段值的父组件

class Form extends Component 
  state = 
    value: ""
  ;

  handleChangeInput = value => 
    this.setState(
      value
    );
  ;

  render() 
    return (
      <div>
        <h2>this.state.value</h2>
        <MyTextField
          value=this.state.value
          onChange=this.handleChangeInput
        />
      </div>
    );
  

【问题讨论】:

我认为组件的职责在这里不是很清楚。我会使用以下架构:有一个带有内置去抖动功能的文本字段。它应该具有具有实际文本字段值的状态,但向上传递更改会去抖动。它的父级(MyTextField)应该处理异步操作,并且不需要将任何字段值传递给文本字段。你怎么看? 【参考方案1】:

这里的问题是您仅在 300 秒后更新组件,这也不会更新输入框。首先,只要有keyup,您就需要更新搜索框组件,以后可以在300秒后通知父级更改 我已更新您的代码参考,请查看https://codesandbox.io/embed/debounce-input-gm50t

【讨论】:

【参考方案2】:

在 componentDidMount 中声明你的 debounce 函数是一切都会好的。

1) 没有状态

class MyTextField extends Component 
  handleChangeInput = e => 
    this.search(e.target.value)
  ;

  componentDidMount() 
    this.search =_.debounce((value) => 
      this.props.onChange(value);
    , 300)
  

  render() 
    return (
      <TextField
        value=this.props.value
        placeholder="type"
        onChange=this.handleChangeInput
      />
    );
  


export default MyTextField;

2) 有状态:

class MyTextField extends Component 
  state = 
    textValue: ''
  

  handleChangeInput = e => 
    this.setState(
      textValue: e.target.value
    , () =>  this.search())
  ;

  componentDidMount() 
    this.search =_.debounce(() => 
      this.props.onChange(this.state.textValue);
    , 300)
  

  render() 
    return (
      <TextField
        value=this.props.value
        placeholder="type"
        onChange=this.handleChangeInput
      />
    );
  


export default MyTextField;

希望对你有帮助!!!

【讨论】:

以上是关于与 debounce、event.persist() 和在父组件中存储值一起使用时,输入不起作用的主要内容,如果未能解决你的问题,请参考以下文章

将 debouncer 与 React 事件一起使用

防抖(Debounce)与节流( throttle)区别

函数节流(throttle)与函数去抖(debounce)

debounce与throttle区别

javascript函数节流(throttle)与函数去抖(debounce)

react-autosuggest 与 debounce 和 distinctUntilChanged