gpt4 book ai didi

javascript - 如何防止在 React 中使用钩子(Hook)重新呈现页面?

转载 作者:行者123 更新时间:2023-11-30 09:14:11 31 4
gpt4 key购买 nike

我正在尝试为这个特定问题找到解决方案,但我可以找到它......在新的情况下,我有这段代码:

    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">&times;</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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com