【问题标题】:React Unknown Prop 'onSearch'反应未知道具'onSearch'
【发布时间】:2017-08-28 23:46:22
【问题描述】:

我正在尝试在这样的搜索输入中使用onSearch 事件:

render(){
  return(

  <input type="search" onSearch={ () => console.warn('search') }  />
  );
}

但是我收到了unknown prop error,有什么解决方法的想法吗?

我想创建一个自动完成输入,当用户点击键盘上的“搜索”图标时触发一个事件。

编辑:

onSearch 不是标准属性,所以我猜 react 不会支持它。由于 onSearch 与按 Enter 键相同,因此使用 onKeypress 即可:

render() {
  return (
    <main>
      <input onKeyPress={ this.onKeyPress } type="search" list="options"/>
      <datalist id="options">
        { OPTS.map(item => <option value={ item.nm } key={ item.id } data-id={ item.id } />) }
      </datalist>
    </main>
    );
  }


onKeyPress(event) {
  if (event.key === 'Enter') {
    const id = document.querySelector(`#options   option[value="${event.target.value}"]`).dataset.id;
    if (id) {
      console.warn('user search', id);
    }
  }
}

【问题讨论】:

  • 尝试使用onSubmitonChange 而不是onSearch

标签: javascript facebook reactjs input autocomplete


【解决方案1】:

search 绝对是搜索类型 input 的 DOM 事件,但 react 还不支持它。 所以你可以监听原始的 dom 元素事件。

这样做

<Input
  ref={element=>(element||{}).onsearch=this.searchHandler}
/>

这可行,你可能想知道为什么。

首先,ref 属性接受一个函数作为值,该函数将使用真实的 dom 元素(与虚拟 dom 相对)执行。

在真正的 dom 被挂载到文档之前,该函数也会被执行,但是没有我们可以附加事件的元素,所以我们使用 (element||{}) 来避免错误。

我们不使用addEventListener,而是使用ele.onsearch的方式,因为组件会在props或state更新时重新渲染,每次调用render函数我们都会在search事件触发时给dom元素附加一个事件处理函数可以运行多次。

【讨论】:

    【解决方案2】:

    我认为这样的事情应该可行:

    constructor() {
      this.state = { userInput: "" };
    
      this.handleSubmit = this.handleSubmit.bind(this);
    }
    
    handleSubmit() {  
        console.warn('user search', this.state.userInput);
    }
    
    render() {
      return (
        <form onSubmit={handleSubmit}>       
          <input 
            onChange={e => this.setState({userInput: e.target.value})} 
            type="search" 
            list="options" 
            value={this.state.userInput}
          />
          <datalist id="options">
            { OPTS.map(item => <option value={ item.nm } key={ item.id } data-id={ item.id } />) }
          </datalist>
        </form>
      );
    }
    

    看看https://facebook.github.io/react/docs/forms.html。您可能希望使用受控组件而不是直接访问 DOM 来获取输入值。

    【讨论】:

      【解决方案3】:

      我认为您正在寻找onChange。当您编辑其中的数据时,输入将触发更改事件。

      编辑: onSearch 不受 React Docs 的支持,您可以使用 keypress 事件或 keyup 事件来做同样的事情。只需检查键码,看看它是否输入 (13)

      handleKeyPress = (e) => {
          if(e.keyCode === 13) {
              console.warn('search');
          }
      }
      
      <input type="search" onKeyPress={this.handleKeyPress} />
      

      【讨论】:

      • 不,每次用户在我的输入中写入内容时都会触发 onchange 我希望仅在用户单击键盘上的“搜索”图标时触发事件。
      • @lagoLast 啊,我明白你在说什么。如果您愿意,我可以编辑我的答案以显示如何使用 onChange 为 onSubmit 工作
      猜你喜欢
      • 2017-03-11
      • 2017-06-21
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      • 2020-12-01
      相关资源
      最近更新 更多