簡體   English   中英

反應 onChange 以處理狀態對象

[英]React onChange to handle state objects

我有一個關於表單中的 React 狀態和 onChange 事件的有趣問題。 在我的 React 組件中,我將信息存儲在狀態中,其中包括對象。 當用戶輸入更改時,我希望狀態中的該對象的一部分發生更改。 例如,這是我正在談論的狀態:

this.state = {
      total: 0,
      email: '',
      creditCards: [],
      selectedCreditCard: {},
      billingAddresses: [],
      shippingAddresses: [],
      selectedBillingAddress: {},
      selectedShippingAddress: {},
    }

這是組件的狀態,這是我的句柄更改功能:

  handleChange(event) {
    this.setState({
      [event.target.name]: event.target.value,
    })
  }

正如您可能知道的那樣,這種類型的函數不適用於狀態內的對象。 例如,當用戶輸入他們的信用卡號時,我希望 this.state.selectedCreditCard.creditCardNumber 發生變化。 當然,按照我的形式設置的方式:

<input
          type="text"
          name="selectedCreditCard.creditCardNumber"
          value={selectedCreditCard.creditCardNumber}
          onChange={(evt) => handleChange(evt)}
        />

傳遞給 onChange 的“名稱”只是一個字符串,而不是指向狀態中的一個對象中的鍵值的指針。 因此,除了解構 state 中的每個對象並將每個 key:value 直接放置在 state 中而不是對象中之外,此函數沒有簡單的方法可以工作; 這樣做是有可能的,但是這樣代碼會變得非常麻煩。 我希望這一切都是有道理的。 有什么方法可以操作狀態中的對象,並讓表單傳遞指向對象中鍵的指針,而不是字符串? 謝謝。

我從您的描述中了解到您希望更新狀態對象屬性內的嵌套子項,如下所示

//default state
this.state = {
      total: 0,
      email: '',
      creditCards: [],
      selectedCreditCard: {},
      billingAddresses: [],
      shippingAddresses: [],
      selectedBillingAddress: {},
      selectedShippingAddress: {},
    }

更新為這樣的東西

//state after handleEvent
{
      total: 0,
      email: '',
      creditCards: [],
      selectedCreditCard:{
       creditCardNumber:"102131313"
      }, 
      billingAddresses: [],
      shippingAddresses: [],
      selectedBillingAddress: {},
      selectedShippingAddress: {},
 }

如果是這樣的話。 這是一個基於遞歸的解決方案,用於使用“.”創建嵌套對象 基於名稱字符串。

  handleChange(event) {
    //use split function to create hierarchy. example:
    //selectedCreditCard.creditCardNumber -> [selectedCreditCard , creditCardNumber]
    const obj = this.generate(
      event.target.name.split("."),
      event.target.value,
      0
    );
    
    this.setState({ ...obj });
  }

  //use recursion to generate nested object. example
  //([selectedCreditCard , creditCardNumber] , 12 , 0) -> {"selectedCreditCard":{"creditCardNumber":"12"}} 
  generate(arr, value, index) {
    return {
      [arr[index]]:
        index === arr.length - 1 ? value : this.generate(arr, value, index + 1)
    };
  }

我已經創建了一個 codeandbox 演示供您在此處探索更多信息。 演示鏈接

暫無
暫無

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

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