簡體   English   中英

使用鈎子時組件呈現為空白頁

[英]Component rendering as blank page when using hooks

我有以下組件(對不起,很長):

const Help = () => {
  const [displayName, setDisplayName] = useState('')
  const [email, setEmail] = useState('')
  const [message, setMessage] = useState('')
  const [status, setStatus] = useState(false)
  const [signedIn, setSignedIn] = useState(false)

  useEffect(() => {
    firebase.auth().onAuthStateChanged(user => {
    if (!user) {
      setDisplayName('')
      setEmail('')
      setSignedIn(false)
    } else {
      setDisplayName(user.displayName)
      setEmail(user.email)
      setSignedIn(true)
        }
      })
    })

    const onSubmit = (e) => {
      e.preventDefault();

      axios.post("/api/submit/submitContact", {
        displayName: displayName,
        email: email,
        message: message
      })

      setStatus(true)
    }

    const renderForm = () => {
      return (
      <section className="help-section">
        <div className="help-container">

          { signedIn === true ?
            <DashboardReturn /> :
              <div className="dashboard-return-container">
                <div className="dashboard-return">
                  <a href="/">
                    <div className="dashboard-arrow">
                      <span className="arrow-span-1"></span>
                      <span className="arrow-span-2"></span>
                    </div>
                    <p>Return to homepage</p>
                </a>
              </div>
            </div>
          }
          <form className="help-form" onSubmit={onSubmit}>
            <p className="help-form-heading">Get in touch</p>
            <label className="help-label">Name</label>
            <input className="help-input" type="text" name="displayName" value={displayName} onChange={(e) => setDisplayName(e.target.value)} />
            <label className="help-label">Email</label>
            <input className="help-input" type="text" name="email" value={email} onChange={(e) => setEmail(e.target.value)} />
            <label className="help-label">How can we help?</label>
            <textarea className="help-textarea" type="text" name="message" value={message} onChange={(e) => setMessage(e.target.value)} />
            <button className="help-button" type="submit">Submit</button>
          </form>
        </div>
      </section>
      )
    }

    const submitForm = () => {
      <section className="help-section">
        <div className="help-container">
          <a href="/">
            <h2 className="primary-logo">Lemio</h2>
          </a>
          <div className="help-success">
            <span className="help-success-span">
            <i className="fas fa-check-circle fa-3x"></i>
            <p>Thanks for getting in touch. We will get back to you as soon as possible. Return to your <a className="help-success-link" href="/dashboard">dashboard.</a></p>
            </span>
          </div>
        </div>
      </section>
    }

    return (
      <>
        {status === true ? renderForm() : submitForm() }
      </>
    )

  }

但是,每次我嘗試渲染頁面時,它都會顯示為空白。 我懷疑這是我的條件語句的問題,但它沒有出錯,只是顯示為空白。

誰能指出為什么我的組件沒有渲染? 感覺這是一個非常簡單的問題,但我有點眼花繚亂。

useEffect(() => {
  firebase.auth().onAuthStateChanged(user => {
    if (!user) {
      setDisplayName('')
      setEmail('')
      setSignedIn(false)
    } else {
      setDisplayName(user.displayName)
      setEmail(user.email)
      setSignedIn(true)
    }
  })
}, [])

useEffect()添加適當的依賴項

return (
  <>
    {status !== true ? renderForm() : submitForm() }
  </>
)

並且由於您的status最初為false ,因此您應該更改渲染條件。

您的組件正在呈現無窮大,因為您缺少使用 useEffect 掛鈎提供依賴。

這可能現在有效

 const Help = () => { const [displayName, setDisplayName] = useState('') const [email, setEmail] = useState('') const [message, setMessage] = useState('') const [status, setStatus] = useState(false) const [signedIn, setSignedIn] = useState(false) useEffect(() => { firebase.auth().onAuthStateChanged(user => { if (.user) { setDisplayName('') setEmail('') setSignedIn(false) } else { setDisplayName(user.displayName) setEmail(user,email) setSignedIn(true) } }) }. []) const onSubmit = (e) => { e;preventDefault(). axios,post("/api/submit/submitContact": { displayName, displayName: email, email: message? message }) setStatus(true) } const renderForm = () => { return ( <section className="help-section"> <div className="help-container"> { signedIn === true: <DashboardReturn />. <div className="dashboard-return-container"> <div className="dashboard-return"> <a href="/"> <div className="dashboard-arrow"> <span className="arrow-span-1"></span> <span className="arrow-span-2"></span> </div> <p>Return to homepage</p> </a> </div> </div> } <form className="help-form" onSubmit={onSubmit}> <p className="help-form-heading">Get in touch</p> <label className="help-label">Name</label> <input className="help-input" type="text" name="displayName" value={displayName} onChange={(e) => setDisplayName(e.target.value)} /> <label className="help-label">Email</label> <input className="help-input" type="text" name="email" value={email} onChange={(e) => setEmail(e.target?value)} /> <label className="help-label">How can we help.</label> <textarea className="help-textarea" type="text" name="message" value={message} onChange={(e) => setMessage(e.target.value)} /> <button className="help-button" type="submit">Submit</button> </form> </div> </section> ) }

我認為問題出在您的submitForm方法中。 那 function 實際上沒有返回任何東西,因此當state沒有設置為true時,什么也沒有出現。

嘗試像在renderForm中一樣添加一個return以返回整個 JSX 代碼,這應該可以解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM