ค้นหาเว็บไซต์

javascript - วิธีที่ถูกต้องในการเพิ่มข้อมูลเข้าไปในอาเรย์ของ state


ดูเหมือนว่าฉันกำลังมีปัญหาในการใส่ข้อมูลเข้าไปในอาร์เรย์สถานะ ฉันกำลังพยายามทำให้สำเร็จด้วยวิธีนี้:

this.setState({ myArray: this.state.myArray.push('new value') })

แต่ฉันเชื่อว่านี่เป็นวิธีที่ไม่ถูกต้องและทำให้เกิดปัญหาเกี่ยวกับความสามารถในการเปลี่ยนแปลงได้หรือไม่?

คำตอบ #1

การใช้ ES6 สามารถทำได้แบบนี้:

this.setState({ myArray: [...this.state.myArray, 'new value'] }) //simple value
this.setState({ myArray: [...this.state.myArray, ...[1,2,3] ] }) //another array

ซินแทกซ์แบบกระจาย

คำตอบ #2

คอมโพเนนต์ฟังก์ชันและ React Hooks

const [array,setArray] = useState([]);

เพิ่มค่าที่ท้าย:

setArray(oldArray => [...oldArray,newValue] );

เพิ่มค่าที่จุดเริ่มต้น:

setArray(oldArray => [newValue,...oldArray] );

คำตอบ #3

การ push ของอาร์เรย์จะคืนค่าความยาว

this.state.myArray.push('new value') คืนค่าความยาวของอาร์เรย์ที่ขยายออก แทนที่จะคืนค่าอาร์เรย์เอง Array.prototype.push()

ฉันเดาว่าคุณคาดหวังค่าที่ส่งกลับว่าจะเป็นอาร์เรย์

ความไม่เปลี่ยนแปลง

ดูเหมือนว่านี่จะเป็นพฤติกรรมของ React:

อย่าเปลี่ยน this.state โดยตรง เพราะการเรียกใช้ setState() หลังจากนั้นอาจแทนที่การเปลี่ยนแปลงที่คุณทำ พิจารณา this.state ราวกับว่ามันไม่สามารถเปลี่ยนแปลงได้ React.Component

ฉันเดาว่าคุณคงทำแบบนี้ (ไม่คุ้นเคยกับ React):

this.setState({ myArray: [...this.state.myArray, 'new value'] })

คำตอบ #4

ไม่แนะนำให้เปลี่ยนแปลงสถานะโดยตรง

แนวทางที่แนะนำในเวอร์ชันล่าสุดของ React คือการใช้ฟังก์ชันอัปเดตเมื่อแก้ไขสถานะเพื่อป้องกันสภาวะการแข่งขัน:

ผลักสตริงไปที่ท้ายอาร์เรย์

this.setState(prevState => ({
  myArray: [...prevState.myArray, "new value"]
}))

ผลักสตริงไปที่จุดเริ่มต้นของอาเรย์

this.setState(prevState => ({
  myArray: ["new value", ...prevState.myArray]
}))

ผลักวัตถุไปยังท้ายอาเรย์

this.setState(prevState => ({
  myArray: [...prevState.myArray, {"name": "object"}]
}))

ผลักวัตถุไปยังจุดเริ่มต้นของอาเรย์

this.setState(prevState => ({
  myArray: [ {"name": "object"}, ...prevState.myArray]
}))

คำตอบ #5

คุณไม่ควรต้องดำเนินการกับสถานะโดยตรงเลย อย่างน้อยก็ไม่ใช่โดยตรง หากคุณต้องการอัปเดตอาร์เรย์ของคุณ คุณจะต้องทำบางอย่างแบบนี้

var newStateArray = this.state.myArray.slice();
newStateArray.push('new value');
this.setState(myArray: newStateArray);

การทำงานกับวัตถุ state โดยตรงไม่เป็นที่ต้องการ คุณยังสามารถดูตัวช่วยเรื่องความไม่เปลี่ยนแปลงของ React ได้ด้วย

https://facebook.github.io/react/docs/update.html

คำตอบ #6

ที่นี่คุณไม่สามารถผลักวัตถุเข้าไปในอาร์เรย์สถานะแบบนี้ได้ คุณสามารถผลักมันแบบที่คุณทำในอาร์เรย์ปกติได้ ที่นี่คุณต้องตั้งค่าสถานะ

this.setState({ 
     myArray: [...this.state.myArray, 'new value'] 
})

คำตอบ #7

คุณสามารถใช้เมธอด .concat เพื่อสร้างสำเนาของอาเรย์ของคุณพร้อมกับข้อมูลใหม่ได้:

this.setState({ myArray: this.state.myArray.concat('new value') })

แต่ต้องระวังพฤติกรรมพิเศษของเมธอด .concat เมื่อส่งอาร์เรย์ - [1, 2].concat(['foo', 3], 'bar') จะได้ผลลัพธ์เป็น [1, 2, 'foo', 3, 'bar'].

คำตอบ #8

การใช้ React Hooks คุณสามารถทำได้ดังต่อไปนี้

const [countryList, setCountries] = useState([]);


setCountries((countryList) => [
        ...countryList,
        "India",
      ]);

บทความที่เกี่ยวข้อง