ดูเหมือนว่าฉันจะมีปัญหาในการส่งข้อมูลไปยังอาร์เรย์สถานะ ฉันพยายามบรรลุด้วยวิธีนี้:
this.setState({ myArray: this.state.myArray.push('new value') })
แต่ฉันเชื่อว่านี่เป็นวิธีที่ไม่ถูกต้องและทำให้เกิดปัญหาเกี่ยวกับความไม่แน่นอน?
ดูเหมือนว่าฉันจะมีปัญหาในการส่งข้อมูลไปยังอาร์เรย์สถานะ ฉันพยายามบรรลุด้วยวิธีนี้:
this.setState({ myArray: this.state.myArray.push('new value') })
แต่ฉันเชื่อว่านี่เป็นวิธีที่ไม่ถูกต้องและทำให้เกิดปัญหาเกี่ยวกับความไม่แน่นอน?
คำตอบ:
this.state.myArray.push('new value')
ส่งกลับความยาวของอาร์เรย์ที่ขยายแทนที่จะเป็นอาร์เรย์เอง Array.prototype.push ()
ฉันเดาว่าคุณคาดว่าค่าที่ส่งคืนจะเป็นอาร์เรย์
ดูเหมือนว่ามันจะค่อนข้างเป็นพฤติกรรมของ React:
อย่ากลายพันธุ์ this.state โดยตรงเนื่องจากการเรียก setState () ในภายหลังอาจแทนที่การกลายพันธุ์ที่คุณทำ ปฏิบัติต่อสิ่งนี้รัฐราวกับว่ามันไม่เปลี่ยนรูป ปฏิกิริยาส่วนประกอบ .
ฉันเดาว่าคุณจะทำแบบนี้ (ไม่คุ้นเคยกับ React):
var joined = this.state.myArray.concat('new value');
this.setState({ myArray: joined })
setState()
enqueues จะเปลี่ยนสถานะของคอมโพเนนต์และบอก React ว่าคอมโพเนนต์นี้และส่วนย่อยต้องแสดงผลอีกครั้งด้วยสถานะที่อัปเดต ดังนั้นฉันเดาว่ามันไม่ได้อัปเดตในขณะนั้นทันทีหลังจากตั้งค่า คุณช่วยโพสต์ตัวอย่างโค้ดซึ่งเราสามารถดูว่าคุณกำลังตั้งค่าจุดใดและบันทึกไว้ได้ไหม
.concat('new value');
ควรเป็น .concat(['new value']);
concat()
วิธีนี้ ดู: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... ( อาร์เรย์และ / หรือค่า concatenate เป็นแถวใหม่. )
การใช้ es6 สามารถทำได้ดังนี้:
this.setState({ myArray: [...this.state.myArray, 'new value'] }) //simple value
this.setState({ myArray: [...this.state.myArray, ...[1,2,3] ] }) //another array
this.props
และthis.state
อาจได้รับการอัปเดตแบบอะซิงโครนัสคุณจึงไม่ควรพึ่งพาค่าของเอกสารเหล่านี้ในการคำนวณสถานะถัดไป" ในกรณีของการแก้ไขอาร์เรย์เนื่องจากอาร์เรย์มีอยู่แล้วเป็นคุณสมบัติของthis.state
และคุณจำเป็นต้องอ้างอิงค่าเพื่อตั้งค่าใหม่คุณควรใช้รูปแบบsetState()
ที่ยอมรับฟังก์ชันที่มีสถานะก่อนหน้าเป็นอาร์กิวเมนต์ ตัวอย่าง: this.setState(prevState => ({ myArray: [...this.state.myArray, 'new value'] }));
ดูreactjs.org/docs/…
ไม่แนะนำให้เปลี่ยนสถานะโดยตรง
แนวทางที่แนะนำใน 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]
}))
this.setState((prevState) => ({ myArray: [values, ...prevState.myArray], }));
คุณไม่ควรใช้งานสถานะเลย อย่างน้อยไม่โดยตรง หากคุณต้องการอัปเดตอาร์เรย์ของคุณคุณจะต้องทำสิ่งนี้
var newStateArray = this.state.myArray.slice();
newStateArray.push('new value');
this.setState(myArray: newStateArray);
การทำงานกับวัตถุสถานะโดยตรงไม่เป็นที่ต้องการ คุณยังสามารถดูตัวช่วยความไม่เปลี่ยนรูปของ React
.slice()
เพื่อสร้างอาร์เรย์ใหม่และรักษาความไม่เปลี่ยนรูป ขอบคุณสำหรับความช่วยเหลือ
คุณสามารถใช้.concat
วิธีการสร้างสำเนาอาร์เรย์ของคุณด้วยข้อมูลใหม่:
this.setState({ myArray: this.state.myArray.concat('new value') })
แต่ระวังพฤติกรรมพิเศษ.concat
วิธีการเมื่อผ่านอาร์เรย์ - จะส่งผลให้[1, 2].concat(['foo', 3], 'bar')
[1, 2, 'foo', 3, 'bar']
รหัสนี้ใช้ได้ผลสำหรับฉัน:
fetch('http://localhost:8080')
.then(response => response.json())
.then(json => {
this.setState({mystate: this.state.mystate.push.apply(this.state.mystate, json)})
})
fetch(`api.openweathermap.org/data/2.5/forecast?q=${this.searchBox.value + KEY} `) .then( response => response.json() ) .then( data => { this.setState({ reports: this.state.reports.push.apply(this.state.reports, data.list)}); });
this.state = { reports=[] }
... กรุณาฉันต้องการทราบว่าฉันทำอะไรผิด
หากคุณต้องการให้ UI ของคุณ (เช่น ur flatList) เป็นปัจจุบันให้ใช้ PrevState: ในตัวอย่างด้านล่างหากผู้ใช้คลิกที่ปุ่มระบบจะเพิ่มวัตถุใหม่ลงในรายการ (ทั้งในรุ่นและ UI )
data: ['shopping','reading'] // declared in constructor
onPress={() => {this.setState((prevState, props) => {
return {data: [new obj].concat(prevState.data) };
})}}.
ด้วยวิธีต่อไปนี้เราสามารถตรวจสอบและอัปเดตวัตถุได้
this.setState(prevState => ({
Chart: this.state.Chart.length !== 0 ? [...prevState.Chart,data[data.length - 1]] : data
}));
ที่นี่คุณไม่สามารถผลักวัตถุไปยังอาร์เรย์สถานะเช่นนี้ คุณสามารถผลักดันเช่นเดียวกับในอาร์เรย์ปกติ ที่นี่คุณต้องตั้งค่าสถานะ
this.setState({
myArray: [...this.state.myArray, 'new value']
})
หากคุณแค่พยายามอัปเดตสถานะเช่นนั้น
handleClick() {
this.setState(
{myprop: this.state.myprop +1}
})
}
พิจารณาแนวทางนี้
handleClick() {
this.setState(prevState => {
return {
count: prevState.count + 1
}
})
}
โดยทั่วไปแล้ว prevState กำลังเขียน this.state ให้เรา
console.log(this.state.myArray)
มันมักจะอยู่ข้างหลัง คิดว่าทำไม?