简体   繁体   English

在 React.js 中使用 preventDefault

[英]Using preventDefault in React.js

The validation is working correctly, however when the user fails the validation the default action is still carried out.验证工作正常,但是当用户验证失败时,仍会执行默认操作。 So validation fails and the joke is still returned.所以验证失败,笑话仍然返回。 If validation fails, the Joke should not be returned.如果验证失败,则不应返回笑话。 I have tried to use preventDefault but no luck.我曾尝试使用 preventDefault 但没有成功。

 import React, { useState } from "react";



function Search() {

    const [joke, setJoke] = useState()
    const [firstname, setFN] = useState("sharoze")
    const [lastname, setLN] = useState("khan")

    const newJoke = (first, last) => {
        fetch(`http://api.icndb.com/jokes/random?firstName=${first}&lastName=${last}`)
            .then(result => result.json())
            .then(result2 => {
                console.log(result2)
                setJoke(result2.value.joke)

            })

    }


    function validateForm() {
        var firstname = document.getElementsByName("firstname")[0].value;
        var lastname = document.getElementsByName("lastname")[0].value;
        if (firstname === "" && lastname === "") {
            alert("Please enter atleast one name");

        }
        else if (!(/^[a-zA-Z]+$/.test(firstname + lastname))) {
            alert("'Only alphabets allowed'");

        }

    }


    return (
        <div className="jokeForm" >
            <form name="searchForm" >
                <input type="text" name="firstname" placeholder="First name" value={firstname} onChange={(e) => setFN(e.target.value)} />
                <input type="text" name="lastname" placeholder="Last name" value={lastname} onChange={(e) => setLN(e.target.value)} />
            </form>
            <button id="button" onClick={(e) => { validateForm(newJoke(firstname, lastname)); return false; }}>click here for a personalised chuckle</button>
            <h3>{joke}</h3>
        </div >


    )
}




export default Search;

sorry the code has been a little butchered!抱歉,代码有点乱七八糟!

The main problem I can see is that you don't pass event argument from onClick to your validation function, hence preventDefault() function is not working.我看到的主要问题是您没有将event参数从onClick传递给您的验证函数,因此preventDefault()函数不起作用。 Try to pass event argument to validation function and then use this argument in function to apply preventDefault() .尝试将event参数传递给验证函数,然后在函数中使用此参数来应用preventDefault()

--Update-- - 更新 -

You don't need to use preventDefault() at all.您根本不需要使用preventDefault() Just modify your validation function to call new joke only if validation is passed.只需修改您的验证函数以仅在验证通过时调用新笑话。

import React, { useState } from "react";



function Search() {

    const [joke, setJoke] = useState()
    const [firstname, setFN] = useState("sharoze")
    const [lastname, setLN] = useState("khan")

    const newJoke = (first, last) => {
        fetch(`http://api.icndb.com/jokes/random?firstName=${first}&lastName=${last}`)
            .then(result => result.json())
            .then(result2 => {
                console.log(result2)
                setJoke(result2.value.joke)

            })

    }


    function validateForm() {
        var firstname = document.getElementsByName("firstname")[0].value;
        var lastname = document.getElementsByName("lastname")[0].value;
        if (firstname === "" && lastname === "") {
            alert("Please enter atleast one name");
            return false;
        }
        else if (!(/^[a-zA-Z]+$/.test(firstname + lastname))) {
            alert("'Only alphabets allowed'");
            return false;
        }
        newJoke(firstname, lastname);
    }


    return (
        <div className="jokeForm" >
            <form name="searchForm" >
                <input type="text" name="firstname" placeholder="First name" value={firstname} onChange={(e) => setFN(e.target.value)} />
                <input type="text" name="lastname" placeholder="Last name" value={lastname} onChange={(e) => setLN(e.target.value)} />
            </form>
            <button id="button" onClick={() => validateForm()}>click here for a personalised chuckle</button>
            <h3>{joke}</h3>
        </div >


    )
}

export default Search;

You need to pass the event as an argument to validateForm as its first argument. 您需要将事件作为参数传递给validateForm作为其第一个参数。

onClick={(event) => validateForm(event)}
function validateForm(event) {
  event.preventDefault();

  var firstname = document.getElementsByName("firstname")[0].value;
  var lastname = document.getElementsByName("lastname")[0].value;

  if (firstname == "" && lastname == "") {
    alert("Please enter atleast one name"); return;
  }
  else if (!(/^[a-zA-Z]+$/.test(firstname + lastname))) {
    alert("'Only alphabets allowed'"); return;
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM