javascript - React re-rending 手动路由仅在刷新一次时有效
问题描述
我正在尝试路由一个组件,以便每次单击按钮时都会显示新内容。
我想出了下一个解决方案:
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 - 检查表单是否有效,如果为真则执行路由,如果不是警报。
每次inputValid
返回 true,我的网站路径都会更改为localhost:3000/start
,但只有在我刷新它时才会重新呈现。
如何在不刷新页面的情况下重新渲染手动路由?
解决方案
显然这已经被回答过,但不是那么容易找到。
useHistory 必须有以下触发器才能重新渲染组件路由
history.go(0);
一旦我将它添加到我的handleClick
函数中,它会自动重新渲染页面而不刷新它。
推荐阅读
- python-3.x - 在 geopandas 上应用多个聚合函数
- django - 如何将手动创建的表单转换为 django 表单?
- vue.js - 如何在 Vue Js 中加载静态图像
- python - Sublime Text 3:所有下拉选项都会导致空白选项卡
- ruby-on-rails - 用偏执的 gem 调用一个软删除的对象来 real_destroy
- c# - 为什么 Microsoft.AspNetCore.OData 打破了我的 Swagger?
- java - 按值对 HashMap 进行排序并转换为新 Map
- r - 点大小表示值时如何更改点大小的范围
- python-3.x - 嵌入到 def 中时,参数不会传递到我的 scipy.optimize.minimize 函数中。他们不断返回“未定义”
- r - 基于附件数据框选择变量的自动预测模型拟合