【问题标题】:Input Textbox Does Not Reset in ReactJS输入文本框不会在 ReactJS 中重置
【发布时间】:2019-07-22 23:06:28
【问题描述】:

我有下拉菜单、复选框、单选框、输入框。我的重置按钮重置除了输入文本框之外的所有控件,键入的单词不会重置。我的代码有什么问题?谢谢。 应用.js

import React, {Component} from 'react';
import Input from './Input';
Class App extends Component {
//get intial state
getInitialState = () => {
const initialState={
    keyword:''
 }
 return initialState;
}
state= this.getInitialState();
//reset state
onReset=()=>{
this.setState(this.getInitialState());

} 

componentDidMount(){
    this.runSearch();
}
//call API
runSearch=async(keyword)=>{
   //API CALL
});
//keywordsubmit
onKeywordSubmit=(keyword)=>{

this.setState({keyword:keyword});
this.runSearch(keyword.toUpperCase());

  }
  onReset=()=>{
  this.setState(this.getInitialState());

  } 
  render(){
    return(
        <div id="App">
        <label>Input keyword:</label><Input onChange="" value={this.state.keyword}  onSubmit={this.onKeywordSubmit} />
        <input type="reset" value="Reset Search" onClick={this.onReset}>
        </div>
    )
}

}

Input.js 导入 React, {Component} from 'react';

class Input extends Component {
state={keyword:''};
//event onInputChange
onInputChange=(event)=>{
    this.setState({keyword:event.target.value});

}
//event onKeywordSubmit
onKeywordSubmit=(event)=>{
    event.preventDefault();
    this.props.onSubmit(this.state.keyword);
}

render(){
    return (
        <form onSubmit={this.onKeywordSubmit}>

        <input type="textbox" value={this.state.keyword} onChange={this.onInputChange}  />

        </form>
    );
}
}
export default Input;

即使单击“重置”按钮,输入文本框搜索词也会保持不变。

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    您已设置代码来处理父组件中的表单状态和 onChange,但您没有在子组件中使用它。

    由于您将valueonChangeonSubmit 作为道具传递给Input 组件,因此您应该通过this.propsInput 组件中使用它们。

    这样的事情应该是一个好的开始

    import React, { Component } from "react";
    import Input from "./Input";
    
    class App extends Component {
        constructor(props) {
            super(props);
            this.handleChange = this.handleChange.bind(this);
        }
    
        //get intial state
        getInitialState = () => {
            const initialState = {
                keyword: ""
            };
            return initialState;
        };
    
        state = this.getInitialState();
    
        //reset state
        onReset = () => {
            this.setState(this.getInitialState());
        };
    
        componentDidMount() {
            this.runSearch();
        }
    
        handleChange({ target: { value } }) {
            this.setState({ keyword: value });
        }
    
        //call API
        runSearch = async (keyword) => {
            //API CALL
        });
    
        //keywordsubmit
        onKeywordSubmit = e => {
            e.preventDefault();
            this.runSearch(this.state.keyword.toUpperCase());
        };
    
        render() {
            return (
                <div id="App">
                    <label>Input keyword:</label>
                    <Input onChange={this.handleChange} value={this.state.keyword} onSubmit={this.onKeywordSubmit} />
                    <input type="reset" value="Reset Search" onClick={this.onReset} />
                </div>
            );
        }
    }
    

    还有输入组件

    class Input extends Component {
        render() {
            return (
                <form onSubmit={this.props.onSubmit}>
                    <input type="textbox" value={this.props.value} onChange={this.props.onChange} />
                </form>
            );
        }
    }
    export default Input;
    

    【讨论】:

    • 谢谢。但是当我按回车(onKeywordSubmit)时输入关键字消失了,并且关键字的值没有传递给 runSearch()
    • 查看编辑以获取修复。您无需在提交处理程序中再次设置状态。
    • 输入正常,但是Reset按钮仍然没有清除输入框。
    • 您定义了两次 onReset。尝试删除其中一个。
    • 嗯?我删除了 onClick={this.onReset} 仍然无法正常工作。
    【解决方案2】:

    现在,您的状态逻辑分布在父母和孩子之间,您的孩子 (Input) 不知道何时按下了重置。如果您从 Input 中取出所有状态(将 onInputChange 移动到父级并将 e.preventDefault 移动到父级的 onKeywordSubmit),您所有的有状态逻辑都将在一个地方处理,您的 Input 将只获得新值作为道具传下来(所以它根本不会关心重置)

    class App extends Component {
      getInitialState = () ...
    
      state = this.getInitialState...
    
      onReset = () ...
    
      runSearch = () ...
    
      //event onInputChange
      onInputChange = (event) => {
        this.setState({keyword:event.target.value});
      }
    
      //event onKeywordSubmit
      onKeywordSubmit = (event) => {
        event.preventDefault();
        const keyword = event.target.value;
        this.setState({ keyword });
        this.runSearch(keyword.toUpperCase());
      }
    
      render() {
        return (
          <div>
            <Input onChange={this.onInputChange} keyword={this.state.keyword}  onSubmit={this.onKeywordSubmit} />
            <input type="reset" value="Reset Search" onClick={this.onReset}>
          </div>
        )
      }
    }
    
    const Input = ({ onSubmit, onChange, keyword }) => (
        <form onSubmit={onSubmit}>
            <input type="textbox" value={keyword} onChange={onChange} />
        </form>
    );
    

    【讨论】:

    • 谢谢。但我认为“this”是保留字,只能在传递{onSubmit,onChange,关键字}时用于父组件而不是子组件。
    • 啊,对不起。我错过了将这些更改为道具。现已修复。
    • 谢谢。这与@adam_th 的旧帖子相同。基本上将类转换为功能。同样的问题:输入关键字消失,关键字没有传递给 runSearch()。无需在 onKeywordSubmit 函数中重置关键字状态。现在问题是Reset按钮还是没有清空输入框。
    猜你喜欢
    • 2018-11-13
    • 2017-06-30
    • 2013-07-01
    • 2016-12-19
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 2021-02-16
    相关资源
    最近更新 更多