基本 React 表单提交刷新整个页面

IT技术 javascript reactjs
2021-05-01 04:27:52

我正在尝试创建一个输入表单,将信息存储在组件的状态变量中,然后在屏幕上输出该变量。我阅读了有关受控组件的文档,这就是我在这里尝试的内容。

我的主要问题是当我点击提交时,屏幕上会出现正确的文本,但随后整个页面都刷新了,我不知道为什么。从我在网上阅读的内容来看,refs似乎是一个解决方案,但我的理解是我可以使用它,也可以使用受控组件。

class InputField extends React.Component {
constructor(props) {
    super(props);
    this.state = {
        itemName: "",
        storedItemName: "",
    };
    this.handleNameChange = this.handleNameChange.bind(this);        
    this.afterSubmission = this.afterSubmission.bind(this);
}
handleNameChange(event) {        
    this.setState({
        itemName: event.target.value
    });
}
afterSubmission(event) {
    let name = this.state.itemName;
    this.setState ({
        storedItemName:this.state.itemName
    }, function() {
        alert(this.state.storedItemName); // Shows the right value!
    });
}
render() {
    return(
        <div>
            <form onSubmit = {this.afterSubmission}>
                <label> Item Name: 
                <input 
                    type = "text" 
                    name = "itemName" 
                    value = {this.state.itemName} 
                    onChange = {this.handleNameChange}
                /></label>                    
                <input type = "submit" value = "Submit" />
            </form>
            <div className = "itemList">
                <p>Hi</p>
                {this.state.storedItemName}
            </div>
        </div>
    );
}
3个回答

只需调用event.preventDefault方法即可防止表单的默认行为

afterSubmission(event) {
    event.preventDefault();
    let name = this.state.itemName;
    this.setState ({
        storedItemName:this.state.itemName
    }, function() {
        alert(this.state.storedItemName); // Shows the right value!
    }
}

防止默认行为:

afterSubmission(event) {
    event.preventDefault();
    let name = this.state.itemName;
    this.setState ({
        storedItemName:this.state.itemName
    }, function() {
        alert(this.state.storedItemName); // Shows the right value!
    });
}

有 3 种方法可以做到这一点:

第一种方式

通过使用event.preventDefault();函数

  • 当我们使用 onSubmit() 事件提交表单时,该事件的默认行为是刷新浏览器并呈现新的 html 页面。
  • 为了防止 onSubmit 事件的页面刷新的这种默认行为,我们将 event.preventDefault(); 在我们为 onSubmit 事件调用的函数中。

输入字段.js

class InputField extends React.Component {
    
        state = {
                  itemName: "",
                  storedItemName: "",
                }
    
        handleNameChange = (event) => { 
            const { name,value } = event.target;  
            //we can't write this.setState({name:value}) this will set name as the key we need value of the name which is itemName
            
            this.setState({
                [name] : value //itemName:"the text we will enter" 
            });
        }
        afterSubmission = (event) => {
            event.preventDefault();
            this.setState ({
                storedItemName:this.state.itemName
            }, function() {
                alert(this.state.storedItemName);
            });
        }
        render() {
            return(
                <div>
                    <form onSubmit = {this.afterSubmission}>
                        <label> Item Name: 
                        <input 
                            onChange = {this.handleNameChange}
                            type = "text" 
                            name = "itemName" 
                            value = {this.state.itemName} 
                        />
                        </label>                    
                        <input type = "submit" value = "Submit" />
                    </form>
                    <div className = "itemList">
                        <p>Hi</p>
                        {this.state.storedItemName}
                    </div>
                </div>
            );
        }
    }
    
    export default InputField;

第二种方式

  • 通过从表单元素中删除 onSubmit 事件

  • 接下来是将提交的输入类型更改为输入类型按钮并为其添加一个 onClick 事件

输入字段.js

class InputField extends React.Component {

    state = {
              itemName: "",
              storedItemName: "",
            }

    handleNameChange = (event) => { 
        console.log(this);    
        const { name,value } = event.target;  
        this.setState({
            [name] : value
        });
    }
    afterSubmission = () => {
        this.setState ({
            storedItemName:this.state.itemName
        }, function() {
            alert(this.state.storedItemName);
        });
    }
    render() {
        return(
            <div>
                <form>
                    <label> Item Name: 
                    <input 
                        onChange = {this.handleNameChange}
                        type = "text" 
                        name = "itemName" 
                        value = {this.state.itemName} 
                    />
                    </label>                    
                    <input 
                        type = "button" 
                        onClick={this.afterSubmission} 
                        value = "Submit" 
                    />
                </form>
                <div className = "itemList">
                    <p>Hi</p>
                    {this.state.storedItemName}
                </div>
            </div>
        );
    }
}

export default InputField;

第三种方式

通过使用react表单钩子(https://www.react-hook-form.com/

  • 根据文档,我们必须在我们的开发服务器中安装 npm module

npm install react-hook-form

输入字段.js

import InputFieldForm from 'location specified';
    class InputField extends React.Component {
            
      render() {
        return(
              <div>
                  <InputFieldForm />
              </div>
              );
       }
    }
    export default InputField;

InputFieldForm.js

import React from "react";
import { useForm } from "react-hook-form";

const InputFieldForm = () =>{
    const onSubmit = (formData) =>{
        alert(JSON.stringify(formData));
        console.log(formData);
    } 

    const { register, handleSubmit } = useForm();
    return(
        <form onSubmit = {handleSubmit(onSubmit)}>
            <label> Item Name: 
            <input 
                {...register('itemName')}
                type = "text" 
                name = "itemName" 
            />
            </label>                    
            <input type = "submit" value = "Submit" />
        </form>
    )
}

export default InputFieldForm;