我试图为这个特定的问题找到解决方案,但我可以找到它……与此相伴的是,我有以下代码:
import React, { Fragment, useState } from 'react'
import '../../media/style/modal.css'
export default function Modal(props) {
const { activateModal } = props
const[values, setValues]= useState({name:'',email:''})
if (activateModal) {
document.getElementById('modals').click()
}
function handleValues(){
setValues({
name:document.getElementById('name').value,
email:document.getElementById('email').value
})
}
return (
<Fragment>
<button type="button" id="modals" style={{ display: 'none' }} data-toggle="modal" data-target="#exampleModalCenter">
Launch demo modal
</button>
<div className="modal fade" id="exampleModalCenter" tabIndex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
<div className="modal-dialog modal-dialog-centered" role="document">
<div className="modal-content">
<form onSubmit={handleSubmit}>
<div className="container">
<div className="row">
<button type="button" className="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div className="row justify-content-center">
<h5 className="modal-title" id="modalTitle"><span style={{color:'rgb(197,115,199)'}}>get- </span>started</h5>
</div>
<div className="row justify-content-center">
<input type="text" id="name" name="name" onChange={handleValues} />
<input type="email" id="email" name="email" />
</div>
<div className="row justify-content-center">
<button type="submit" id="btn2">Send</button>
</div>
</div>
</form>
</div>
</div>
</div>
</Fragment>
)
}
当我在输入中写东西时,我的页面重新呈现...而我不知道如何停止这种行为,有什么想法吗?...我尝试使用useRef,但我不知道即时消息是否使用正确,因此我无法获得预期的效果
最佳答案
我已将您的代码复制到沙箱中,并为您修复了https://codesandbox.io/s/agitated-snow-lls4g?fontsize=14
只是为了澄清起见,即使您对其进行了突变,useRef也不会重新呈现。仅当其他条件触发重新渲染时,才会显示更新的值。所以useState是正确的用法。
尽管我没有为您更改此名称(以表明没有它是可能的),但我还是强烈建议您将电子邮件和姓名放在自己的useState中,以使更改其中一个不会更改另一个。我也不会从document.getElementById获取值,而是使用从handleChange传入的event.target.value,并为每个元素提供一个handleChange。如果您有多个元素,请使用函数式编程来创建其功能。 (例如handleEmailChange = handleChange('email')
然后handleChange是一个返回函数的函数(也称为currying)。
澄清:useRef
用于保留渲染之间的数据(更新不会触发重新渲染)useState
用于保留渲染器之间的数据(更新将触发重新渲染)
每个输入可能应使用其自己的状态,以避免更改其他组件和效果可能订阅的值。
使用currying
为每个输入计算handleChange
关于javascript - 如何防止在React中使用钩子(Hook)重新渲染页面?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56410202/