React重新发送手动路由仅在刷新后才起作用

时间:2020-09-04 13:06:12

标签: javascript reactjs jsx

我正在尝试布线组件,因此每次单击按钮时,都会显示新内容。

我想出了下一个解决方案:

import React, {useState} from 'react';
import {
    BrowserRouter as Router,
    Switch,
    Route,
    Link,
    useHistory
  } from "react-router-dom";
import Starter from '../../images/calculator.svg';
import Container from 'react-bootstrap/container';
import Row from 'react-bootstrap/Row';
import Col from 'react-bootstrap/Col';
import $ from 'jquery';

function Calculator() {
    const [inputName, setInputName] = useState('');
    const [inputPhone, setInputPhone] = useState('');
    const [inputValid, setInputValid] = useState(false);
    const history = useHistory();

    //Check if filled the inputs in valid way
    const handleValidation = () =>{
        let errors = {};
        let formIsValid = true;
    
        //Name
        if(typeof inputName !== "undefined"){
           if(!inputName.match(/^[a-zA-Z]+$/)){
              formIsValid = false;
              errors["name"] = "רק אותיות בשם, ללא מספרים או סימנים";
           }        
        }
        if(inputName === ""){
            formIsValid = false;
            errors["name"] = "שם מלא חסר";
         }
         if(typeof errors['name'] === 'undefined'){
            errors['name'] = "";
        }



    
        //Phone number
        if(inputPhone.length !== 9){
            formIsValid = false;
            errors["phone"] = "המספר אינו תקין";
        }
        if(typeof inputPhone !== "undefined"){
            if(!inputPhone.match(/^\d+$/)){
               formIsValid = false;
               errors["phone"] = "רק מספרים בטלפון, ללא אותיות";
            }        
         }
         if(inputPhone === ''){
            formIsValid = false;
            errors["phone"] = "מספר פלאפון חסר";
         }
         if(typeof errors['phone'] === 'undefined'){
             errors['phone'] = "";
         }

        $('.errors').html(errors["name"] + " <br /> " + errors["phone"]);
        setInputValid(formIsValid);
        return formIsValid;
    }





    //Handles the click
    //if valid continue
    //if not alert error
    const handleClick = () =>{
        if(inputValid){
            history.push("/start");
        }
        else{
            alert('נא למלא את תיבות הטקסט כנדרש');
        }
    }

    return (
        <section id="calculator">
            <h1>
                מחשבון הצעת מחיר
            </h1>
            <br/>
            <Container>
                <Router>
                    <Switch>
                        <Route exact path="/">
                            <div className="center">
                                <img src={Starter} style={{width: '500px'}} alt="מחשבון הצעת מחיר"/>
                                <br/>
                                <input onChange={handleValidation} type="text" id="name" placeholder="שם מלא" value={inputName} onInput={e => setInputName(e.target.value)} />
                                <br/>
                                <br/>
                                <input onChange={handleValidation} type="text" id="phone" placeholder="מספר טלפון" value={inputPhone} onInput={e => setInputPhone(e.target.value)}/>
                                <br/>
                                <p className="errors"></p>
                                <br/>
                                    <button id="btn" onClick={handleClick}>התחל</button>
                                <br/><br/><br/>
                                    אפשר גם לקבל הצעה בוואצאפ!
                            </div>
                        </Route>
                        <Route path="/start">
                            test
                        </Route>
                    </Switch>
                </Router>
            </Container>
        </section>
    );

}

export default Calculator;

handleValidation-处理表单的有效性,可以正常工作,并通过调试对其进行仔细检查。

handleClick-检查表单是否有效,如果为true,则执行路由,如果没有警报,则为

每次inputValid返回true时,我的网站路径都会更改为localhost:3000/start,但刷新后才重新渲染。

如何在不刷新页面的情况下重新呈现手动路由?

1 个答案:

答案 0 :(得分:0)

显然,它是answered before,但并不容易找到。

useHistory必须具有以下触发器才能重新渲染组件路由

history.go(0);

一旦将其添加到我的handleClick函数中,它将自动重新呈现页面,而无需刷新页面。