[英]using prompt() in react but the page keeps refreshing
所以我是一个反应初学者,我做了这个非常简单的项目,通过 JavaScript 中的“prompt()”function 获取某人的年龄,并将其传递给反应以渲染它。 您可以单击“更改年龄”按钮来更改屏幕上显示的年龄,这意味着它会给您另一个提示,您可以通过该提示重新输入年龄,然后新的年龄将显示在屏幕上。 一切正常,但由于 React 不断重新呈现我的页面,它会多次显示提示。 如果您在第一个年龄之后的提示中输入任何年龄,屏幕上的年龄不会改变。 我的猜测是,这可能是因为提示出现在 react 的虚拟 dom 有时间连接真实 dom 之前,因此您在这些提示中输入的任何值都将被完全忽略。 这可能是我自己无法解决的一些愚蠢的小问题,感谢您的帮助!
这是 App.js:
import {useState} from 'react';
function App() {
var ageInput = prompt("What Is Your Age?");
const [age, setAge] = useState(ageInput);
const changeAge = () => {
setAge(prompt("What Is Your Age?"));
}
return (
<div className="app">
<h1 style={{textAlign: "center"}}>Homepage</h1>
<p>Mario is {age} years old!</p>
<button onClick={changeAge}>Change Age</button>
</div>
)
}
export default App
这是 index.js:
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('root')
);
PS:我还不知道 Redux,所以不幸的是,目前涉及 Redux 的任何解决方案都不在我的 scope 范围内
问题很简单,就是这一行: var ageInput = prompt("What Is Your Age?");
位于 function 组件的“顶层”,因此在每次渲染时都会被调用。 这意味着显示提示 - 当您不希望它出现时。
React function 组件的顶层应该是一个“纯函数”,它从 props/state/etc 读取它需要的数据并返回代表你的 UI 的 JSX。 有副作用的东西,比如“提示”,应该从其他地方调用——或者从像你的changeAge
这样的事件处理程序中调用(那部分在你的代码中绝对没问题)——或者从传递给useEffect
挂钩的 function 中调用。
useEffect
是我在这里推荐的。 您似乎只希望此提示无需先单击即可设置组件的“初始状态”。 因此,使用带有空数组第二个参数的useEffect
,在组件首次安装时也调用changeAge
,而不是之后。 您的组件最终将如下所示:
function App() {
const [age, setAge] = useState(0);
const changeAge = () => {
setAge(prompt("What Is Your Age?"));
}
useEffect(changeAge, []);
return (
<div className="app">
<h1 style={{textAlign: "center"}}>Homepage</h1>
<p>Mario is {age} years old!</p>
<button onClick={changeAge}>Change Age</button>
</div>
)
}
唯一的小缺点是您需要将“初始年龄”传递给useState
,它在useEffect
function 之前运行,因此会在用户响应提示之前显示在您的初始 UI 中。 我在上面放了 0,但你可以放任何你想要的东西——这可能并不重要,如果重要的话,你可以让 UI 显示一些稍微不同的东西,直到age
保持一个合理的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.