最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React中重新實(shí)現(xiàn)強(qiáng)制實(shí)施表單的流程步驟

 更新時(shí)間:2024年05月13日 10:29:03   作者:刻刻帝的海角  
這篇文章主要介紹了React中重新實(shí)現(xiàn)強(qiáng)制實(shí)施表單的流程步驟,就像設(shè)計(jì)人員一樣,在添加邏輯之前,您需要為不同的狀態(tài)“模擬”或創(chuàng)建“模擬”,例如,這里只是表單的視覺部分的模擬,文中通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下

前言

就像設(shè)計(jì)人員一樣,在添加邏輯之前,您需要為不同的狀態(tài)“模擬”或創(chuàng)建“模擬”。例如,這里只是表單的視覺部分的模擬。這個(gè)模擬由一個(gè) prop 控制,其默認(rèn)值為 :status'empty'

  1. 識別組件的不同視覺狀態(tài)
  2. 確定觸發(fā)這些狀態(tài)更改的因素
  3. 表示內(nèi)存中的狀態(tài)useState
  4. 刪除任何非必要狀態(tài)變量
  5. 連接事件處理程序以設(shè)置狀態(tài)

步驟 1:識別組件的不同視覺狀態(tài)

在計(jì)算機(jī)科學(xué)中,你可能聽說過“狀態(tài)機(jī)”處于幾種“狀態(tài)”之一。如果你與設(shè)計(jì)師合作,你可能已經(jīng)看到了不同“視覺狀態(tài)”的模型。React 站在設(shè)計(jì)和計(jì)算機(jī)科學(xué)的交叉點(diǎn)上,所以這兩個(gè)想法都是靈感的來源。

首先,您需要可視化用戶可能看到的 UI 的所有不同“狀態(tài)”:

  1. :表單有一個(gè)禁用的“提交”按鈕。
  2. 鍵入:表單具有啟用的“提交”按鈕。
  3. 提交:表單已完全禁用。顯示微調(diào)器。
  4. 成功:顯示“謝謝”消息,而不是表單。
  5. 錯(cuò)誤:與鍵入狀態(tài)相同,但帶有額外的錯(cuò)誤消息。
export default function Form({
  status = 'empty'
}) {
  if (status === 'success') {
    return <h1>That's right!</h1>
  }
  return (
    <>
      <h2>City quiz</h2>
      <p>
        In which city is there a billboard that turns air into drinkable water?
      </p>
      <form>
        <textarea />
        <br />
        <button>
          Submit
        </button>
      </form>
    </>
  )
}

你可以隨心所欲地稱呼這個(gè)道具,命名并不重要。嘗試編輯以顯示成功消息。通過模擬,您可以在連接任何邏輯之前快速迭代 UI。這是同一組件的更充實(shí)的原型,仍然由道具“控制”:status = 'empty'status = 'success'status

export default function Form({
  // Try 'submitting', 'error', 'success':
  status = 'empty'
}) {
  if (status === 'success') {
    return <h1>That's right!</h1>
  }
  return (
    <>
      <h2>City quiz</h2>
      <p>
        In which city is there a billboard that turns air into drinkable water?
      </p>
      <form>
        <textarea disabled={
          status === 'submitting'
        } />
        <br />
        <button disabled={
          status === 'empty' ||
          status === 'submitting'
        }>
          Submit
        </button>
        {status === 'error' &&
          <p className="Error">
            Good guess but a wrong answer. Try again!
          </p>
        }
      </form>
      </>
  );
}

步驟 2:確定觸發(fā)這些狀態(tài)更改的原因

您可以觸發(fā)狀態(tài)更新以響應(yīng)兩種類型的輸入:

  • 人工輸入,例如單擊按鈕、輸入字段、導(dǎo)航鏈接。
  • 計(jì)算機(jī)輸入,如網(wǎng)絡(luò)響應(yīng)到達(dá)、超時(shí)完成、圖像加載。

步驟 3:用useState 

接下來,您需要使用 useState 表示內(nèi)存中組件的視覺狀態(tài)。簡單性是關(guān)鍵:每個(gè)狀態(tài)都是一個(gè)“移動部分”,你希望盡可能少的“移動部分”。更復(fù)雜會導(dǎo)致更多的錯(cuò)誤!

從絕對必須存在的狀態(tài)開始。例如,您需要存儲 for the input,以及 (如果存在)來存儲最后一個(gè)錯(cuò)誤:answererror

const [answer, setAnswer] = useState('');

const [error, setError] = useState(null);

然后,需要一個(gè)狀態(tài)變量,表示要顯示的視覺狀態(tài)之一。在內(nèi)存中通常有不止一種表示方式,因此您需要對其進(jìn)行試驗(yàn)。

如果您很難立即想到最佳方法,請首先添加足夠的狀態(tài),以便您確定涵蓋了所有可能的視覺狀態(tài):

const [isEmpty, setIsEmpty] = useState(true);

const [isTyping, setIsTyping] = useState(false);

const [isSubmitting, setIsSubmitting] = useState(false);

const [isSuccess, setIsSuccess] = useState(false);

const [isError, setIsError] = useState(false);

你的第一個(gè)想法可能不是最好的,但沒關(guān)系——重構(gòu)狀態(tài)是這個(gè)過程的一部分!

步驟 4:刪除任何非必要狀態(tài)變量

您希望避免狀態(tài)內(nèi)容中的重復(fù),因此您只跟蹤必要的內(nèi)容。花一點(diǎn)時(shí)間重構(gòu)狀態(tài)結(jié)構(gòu)將使組件更易于理解,減少重復(fù),并避免意外含義。你的目標(biāo)是防止內(nèi)存中的狀態(tài)不表示你希望用戶看到的任何有效 UI 的情況。 (例如,您永遠(yuǎn)不希望同時(shí)顯示錯(cuò)誤消息并禁用輸入,否則用戶將無法更正錯(cuò)誤!

以下是您可以詢問的有關(guān)狀態(tài)變量的一些問題:

  • 這種狀態(tài)會導(dǎo)致悖論嗎?例如,不能兩者都是 .悖論通常意味著狀態(tài)的約束不夠。兩個(gè)布爾值有四種可能的組合,但只有三種對應(yīng)于有效狀態(tài)。若要刪除“不可能”狀態(tài),可以將它們組合成一個(gè)必須是以下三個(gè)值之一的值:、 或 。isTypingisSubmittingtruestatus'typing''submitting''success'
  • 相同的信息是否已經(jīng)在另一個(gè)狀態(tài)變量中可用?另一個(gè)悖論:不能同時(shí)存在。通過使它們成為單獨(dú)的狀態(tài)變量,您可能會冒著它們不同步并導(dǎo)致錯(cuò)誤的風(fēng)險(xiǎn)。幸運(yùn)的是,您可以刪除并改為檢查 .isEmptyisTypingtrueisEmptyanswer.length === 0
  • 你能從另一個(gè)狀態(tài)變量的逆變量中得到相同的信息嗎? 不需要,因?yàn)槟梢愿臑闄z查。isErrorerror !== null

清理完畢后,剩下 3 個(gè)(低于 7 個(gè)!基本狀態(tài)變量:

const [answer, setAnswer] = useState('');
const [error, setError] = useState(null);
const [status, setStatus] = useState('typing'); // 'typing', 'submitting', or 'success'

您知道它們是必不可少的,因?yàn)槟鸁o法在不破壞功能的情況下刪除它們中的任何一個(gè)。

步驟 5:將事件處理程序連接到設(shè)置狀態(tài)

最后,創(chuàng)建更新狀態(tài)的事件處理程序。下面是最終形式,所有事件處理程序都已連接起來:

import { useState } from 'react';
 
export default function Form() {
  const [answer, setAnswer] = useState('');
  const [error, setError] = useState(null);
  const [status, setStatus] = useState('typing');
 
  if (status === 'success') {
    return <h1>That's right!</h1>
  }
 
  async function handleSubmit(e) {
    e.preventDefault();
    setStatus('submitting');
    try {
      await submitForm(answer);
      setStatus('success');
    } catch (err) {
      setStatus('typing');
      setError(err);
    }
  }
 
  function handleTextareaChange(e) {
    setAnswer(e.target.value);
  }
 
  return (
    <>
      <h2>City quiz</h2>
      <p>
        In which city is there a billboard that turns air into drinkable water?
      </p>
      <form onSubmit={handleSubmit}>
        <textarea
          value={answer}
          onChange={handleTextareaChange}
          disabled={status === 'submitting'}
        />
        <br />
        <button disabled={
          answer.length === 0 ||
          status === 'submitting'
        }>
          Submit
        </button>
        {error !== null &&
          <p className="Error">
            {error.message}
          </p>
        }
      </form>
    </>
  );
}
 
function submitForm(answer) {
  // Pretend it's hitting the network.
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      let shouldError = answer.toLowerCase() !== 'lima'
      if (shouldError) {
        reject(new Error('Good guess but a wrong answer. Try again!'));
      } else {
        resolve();
      }
    }, 1500);
  });
}

盡管此代碼比原始命令式示例更長,但它的脆弱性要小得多。將所有交互表示為狀態(tài)更改,可以在以后引入新的視覺狀態(tài),而不會破壞現(xiàn)有狀態(tài)。它還允許您更改每個(gè)狀態(tài)中應(yīng)顯示的內(nèi)容,而無需更改交互本身的邏輯。

以上就是React中重新實(shí)現(xiàn)強(qiáng)制實(shí)施表單的流程步驟的詳細(xì)內(nèi)容,更多關(guān)于React強(qiáng)制實(shí)施表單的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • React Fiber中面試官最關(guān)心的技術(shù)話題

    React Fiber中面試官最關(guān)心的技術(shù)話題

    這篇文章主要為大家介紹了React Fiber中面試官最關(guān)心的技術(shù)話題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • React函數(shù)式組件Hook中的useEffect函數(shù)的詳細(xì)解析

    React函數(shù)式組件Hook中的useEffect函數(shù)的詳細(xì)解析

    useEffect是react v16.8新引入的特性。我們可以把useEffect hook看作是componentDidMount、componentDidUpdate、componentWillUnmounrt三個(gè)函數(shù)的組合
    2022-10-10
  • React學(xué)習(xí)筆記之條件渲染(一)

    React學(xué)習(xí)筆記之條件渲染(一)

    條件渲染在React里就和js里的條件語句一樣。下面這篇文章主要給大家介紹了關(guān)于React學(xué)習(xí)記錄之條件渲染的相關(guān)資料,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-07-07
  • React中的常用Hooks分享

    React中的常用Hooks分享

    React?提供了許多常用的?Hooks,用于在函數(shù)組件中添加狀態(tài)管理、副作用處理和其他功能,本文主要介紹了其中幾個(gè)常用的,需要的可以收藏一下
    2023-07-07
  • React錯(cuò)誤邊界Error Boundaries詳解

    React錯(cuò)誤邊界Error Boundaries詳解

    錯(cuò)誤邊界是一種React組件,這種組件可以捕獲發(fā)生在其子組件樹任何位置的JavaScript錯(cuò)誤,并打印這些錯(cuò)誤,同時(shí)展示降級UI,而并不會渲染那些發(fā)生崩潰的子組件樹
    2022-12-12
  • 在react中使用highlight.js將頁面上的代碼高亮的方法

    在react中使用highlight.js將頁面上的代碼高亮的方法

    本文通過 highlight.js 庫實(shí)現(xiàn)對文章正文 HTML 中的代碼元素自動添加語法高亮,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-01-01
  • React?Hooks--useEffect代替常用生命周期函數(shù)方式

    React?Hooks--useEffect代替常用生命周期函數(shù)方式

    這篇文章主要介紹了React?Hooks--useEffect代替常用生命周期函數(shù)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • 探究react-native 源碼的圖片緩存問題

    探究react-native 源碼的圖片緩存問題

    本篇文章主要介紹了探究react-native 源碼的圖片緩存問題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 詳解三種方式在React中解決綁定this的作用域問題并傳參

    詳解三種方式在React中解決綁定this的作用域問題并傳參

    這篇文章主要介紹了詳解三種方式在React中解決綁定this的作用域問題并傳參,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • React之錯(cuò)誤邊界 Error Boundaries示例詳解

    React之錯(cuò)誤邊界 Error Boundaries示例詳解

    這篇文章主要為大家介紹了React之錯(cuò)誤邊界Error Boundaries示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10

最新評論

江西省| 朝阳县| 江油市| 游戏| 虹口区| 桓台县| 申扎县| 蓝山县| 崇州市| 阳春市| 禹州市| 平阴县| 江安县| 贵阳市| 安陆市| 镇江市| 霍邱县| 济宁市| 大港区| 周至县| 彝良县| 西安市| 武陟县| 文水县| 水城县| 常山县| 辽宁省| 沿河| 渝北区| 化州市| 静乐县| 绵阳市| 青冈县| 水富县| 凉城县| 百色市| 高碑店市| 堆龙德庆县| 麻阳| 卢氏县| 宜君县|