【问题标题】:How can I prevent re-rendering of the page with hooks in React?如何防止在 React 中使用钩子重新渲染页面?
【发布时间】:2019-10-17 23:53:58
【问题描述】:

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

    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 但我不知道我是否正确使用它所以我没有得到想要的效果

【问题讨论】:

  • 你应该发布你的整个文件
  • 可能是时候将您的示例应用程序放在显示此行为的React Playground 上:当我在输入中写一些东西时,我的页面会重新呈现

标签: javascript reactjs jsx react-hooks


【解决方案1】:

我将您的代码复制到沙盒并为您修复了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

【讨论】:

  • 好吧,我需要使用 useRef 来避免重新渲染,但我不知道如何
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 2021-05-03
  • 2020-04-24
  • 2019-07-23
相关资源
最近更新 更多