เมื่อมันเป็นสิ่งสำคัญที่จะผ่านprops
ไปsuper()
และทำไม?
class MyComponent extends React.Component {
constructor(props) {
super(); // or super(props) ?
}
}
เมื่อมันเป็นสิ่งสำคัญที่จะผ่านprops
ไปsuper()
และทำไม?
class MyComponent extends React.Component {
constructor(props) {
super(); // or super(props) ?
}
}
คำตอบ:
มีเพียงเหตุผลเดียวที่ต้องผ่านprops
ไปsuper()
:
เมื่อคุณต้องการเข้าถึงthis.props
ในตัวสร้าง
ผ่าน:
class MyComponent extends React.Component {
constructor(props) {
super(props)
console.log(this.props)
// -> { icon: 'home', … }
}
}
ไม่ผ่าน:
class MyComponent extends React.Component {
constructor(props) {
super()
console.log(this.props)
// -> undefined
// Props parameter is still available
console.log(props)
// -> { icon: 'home', … }
}
render() {
// No difference outside constructor
console.log(this.props)
// -> { icon: 'home', … }
}
}
โปรดทราบว่าผ่านหรือไม่ผ่านprops
จะsuper
มีไม่มีผลกระทบกับการใช้ที่ใหม่กว่าของนอกthis.props
constructor
นั่นคือrender
, shouldComponentUpdate
หรือจัดการเหตุการณ์เสมอสามารถเข้าถึงได้
สิ่งนี้ถูกกล่าวอย่างชัดเจนในคำตอบเดียวของ Sophie Alpert สำหรับคำถามที่คล้ายกัน
เอกสาร - รัฐและวงจรชีวิตการเพิ่มสถานะท้องถิ่นลงในคลาสจุดที่ 2 - คำแนะนำ:
ส่วนประกอบคลาสควรเรียกตัวสร้างฐานด้วย
props
เสมอ
อย่างไรก็ตามไม่มีเหตุผลให้ เราสามารถคาดการณ์ว่าเป็นเพราะคลาสย่อยหรือเพื่อความเข้ากันได้ในอนาคต
(ขอบคุณ @MattBrowne สำหรับลิงค์)
this.props
เป็นเว้นแต่ส่งผ่านไปยังundefined
super()
ไม่ว่าจะด้วยวิธีใดจะไม่มีผลกับการเรนเดอร์หรือความพร้อมใช้งานthis.props
ในrender()
ภายหลัง
super
คุณมีการอ้างอิงถึงพวกเขาในตัวสร้าง
props
ไปsuper()
: facebook.github.io/react/docs/... ฉันไม่แน่ใจว่าทำไมเนื่องจากเมื่อคุณชี้ให้เห็นthis.props
ว่าสามารถเข้าถึงได้ในวิธีอื่นทั้งสองวิธี ... บางทีพวกเขาอาจแนะนำสิ่งนี้เพื่อความเข้ากันได้ในอนาคตในกรณีที่ React เวอร์ชันในอนาคตอาจต้องการทำอะไรบางอย่างprops
ในคอนสตรัคเตอร์
props
ไปsuper
เมื่อเป็นคุณชี้ออกprops
พารามิเตอร์มีสิทธิใช้ได้สำหรับเราที่จะใช้ภายในสร้างและthis.props
ใช้งานได้ทุกที่อื่น? มีประโยชน์ที่จะใช้this.props
มากกว่าเพียงแค่props
? มันเป็นการปฏิบัติที่ไม่ดีที่จะทำลายโครงสร้างprops
ในคอนสตรัคเตอร์หรือไม่? ฉันคิดว่าฉันยังคงล้มเหลวในการดูกรณีเมื่อคุณต้องการที่จะผ่านprops
ไปsuper
แต่ฉันยินดีที่จะเดิมพันมันเป็นเพียงความไม่รู้ของฉันฮ่า
super(props)
คุณสามารถเรียกวิธีการที่ใช้this.props
ในจากตัวสร้างเช่นthis.doStuffUsingThisDotProps()
โดยไม่ต้องส่งผ่านพารามิเตอร์อุปกรณ์ประกอบฉากไปยังวิธีการ / ฟังก์ชั่นเหล่านั้น ฉันเพิ่งเขียนนวกรรมิกที่ทำสิ่งนี้ซึ่งดูเหมือนจะต้องการให้ฉันใช้super(props)
ก่อนตามคำตอบของคำถามนี้
ในตัวอย่างนี้คุณกำลังขยายReact.Component
คลาสและตามข้อกำหนด ES2015 ตัวสร้างคลาสย่อยไม่สามารถใช้งานได้this
จนกว่าจะsuper()
ถูกเรียกใช้ ตัวสร้างคลาส ES2015 ต้องเรียกsuper()
ถ้าเป็นคลาสย่อยด้วย
class MyComponent extends React.Component {
constructor() {
console.log(this); // Reference Error
}
render() {
return <div>Hello {this.props.name}</div>;
}
}
ตรงกันข้าม:
class MyComponent extends React.Component {
constructor() {
super();
console.log(this); // this logged to console
}
render() {
return <div>Hello {this.props.name}</div>;
}
}
รายละเอียดเพิ่มเติมตามคำตอบล้นสแต็คที่ยอดเยี่ยมนี้
คุณอาจเห็นตัวอย่างของส่วนประกอบที่สร้างขึ้นโดยการขยายReact.Component
คลาสที่ไม่ได้โทรsuper()
แต่คุณจะสังเกตเห็นสิ่งเหล่านี้ไม่มีconstructor
ดังนั้นจึงไม่จำเป็น
class MyOtherComponent extends React.Component {
render() {
return <div>Hi {this.props.name}</div>;
}
}
จุดหนึ่งของความสับสนที่ฉันเคยเห็นจากนักพัฒนาบางคนที่ฉันพูดถึงคือส่วนประกอบที่ไม่มีconstructor
และดังนั้นจึงไม่โทรไปsuper()
ที่ใดก็ได้ยังคงมีthis.props
อยู่ในrender()
วิธีการ โปรดจำไว้ว่ากฎนี้และความจำเป็นนี้เพื่อสร้างthis
ผลผูกพันสำหรับใช้เฉพาะกับconstructor
constructor
super()
และsuper(props)
)
เมื่อคุณผ่านprops
ไปยังอุปกรณ์ประกอบฉากได้รับมอบหมายให้super
this
ดูสถานการณ์ต่อไปนี้:
constructor(props) {
super();
console.log(this.props) //undefined
}
เมื่อคุณทำเช่นเคย:
constructor(props) {
super(props);
console.log(this.props) //props will get logged.
}
function ReactComponent(props, context) {
this.props = props;
this.context = context;
}
คุณต้องผ่านprops
ทุกครั้งที่มีอุปกรณ์ประกอบฉากและคุณจะไม่ใส่มันเข้าไปthis.props
ด้วยตนเอง
super(props)
this.props = props
และsuper(props)
เป็นสิ่งเดียวกันหรือไม่
this.props
จาก 'ภายนอก' โดยไม่คำนึงถึงสิ่งที่ทำในตัวสร้าง
Dan Abramov เขียนบทความในหัวข้อนี้:
ทำไมเราเขียน super (อุปกรณ์ประกอบฉาก)?
และสิ่งสำคัญของมันคือการมีนิสัยชอบส่งผ่านเพื่อหลีกเลี่ยงสถานการณ์นี้ที่จริงแล้วฉันไม่เห็นว่ามันจะเกิดขึ้นได้:
// Inside React
class Component {
constructor(props) {
this.props = props;
// ...
}
}
// Inside your code
class Button extends React.Component {
constructor(props) {
super(); // 😬 We forgot to pass props
console.log(props); // ✅ {}
console.log(this.props); // 😬 undefined
}
// ...
}
super()
ใช้เพื่อเรียกคอนสตรัคเตอร์หลัก
super(props)
จะผ่านprops
ไปยังผู้สร้างหลัก
จากตัวอย่างของคุณsuper(props)
จะเรียกReact.Component
นวกรรมิกที่ส่งผ่านprops
เป็นอาร์กิวเมนต์
ข้อมูลเพิ่มเติมเกี่ยวกับsuper
:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/super
เมื่อใช้งานconstructor()
ฟังก์ชั่นภายในส่วนประกอบ React super()
มันเป็นข้อกำหนด โปรดทราบว่าMyComponent
องค์ประกอบของคุณกำลังขยายหรือยืมฟังก์ชันการทำงานจากReact.Component
คลาสฐาน
คลาสพื้นฐานนี้มีconstructor()
ฟังก์ชั่นของตัวเองที่มีรหัสอยู่ภายในเพื่อติดตั้งส่วนประกอบ React สำหรับเรา
เมื่อเรากำหนดconstructor()
ฟังก์ชั่นในMyComponent
ชั้นเรียนของเราเราเป็นหลักแทนที่หรือแทนที่constructor()
ฟังก์ชั่นที่อยู่ในReact.Component
ชั้นเรียน แต่เรายังต้องให้แน่ใจว่ารหัสการตั้งค่าทั้งหมดในconstructor()
ฟังก์ชั่นนี้ยังคงได้รับการเรียก
ดังนั้นเพื่อให้แน่ใจว่าReact.Component
เป็นฟังก์ชั่นได้รับการเรียกเราเรียกconstructor()
คือการอ้างอิงถึงฟังก์ชั่นผู้ปกครองนั่นคือทั้งหมดที่มันเป็นsuper(props)
super(props)
constructor()
เราต้องเพิ่มsuper(props)
ทุกครั้งที่เรากำหนดconstructor()
ฟังก์ชั่นภายในองค์ประกอบตามระดับ
super(props)
ถ้าเราทำไม่ได้เราจะเห็นข้อผิดพลาดที่บอกว่าเราจะต้องโทร
เหตุผลทั้งหมดสำหรับการกำหนดconstructor()
funciton นี้คือการเริ่มต้นวัตถุรัฐของเรา
ดังนั้นเพื่อเริ่มต้นวัตถุสถานะของเราภายใต้การเรียกสุดฉันจะเขียน:
class App extends React.Component {
constructor(props) {
super(props);
this.state = {};
}
// React says we have to define render()
render() {
return <div>Hello world</div>;
}
};
ดังนั้นเราจึงได้กำหนดของเราconstructor()
วิธีการเริ่มต้นวัตถุรัฐของเราโดยการสร้างวัตถุ JavaScript, การกำหนดคุณสมบัติหรือคู่ค่า / this.state
คีย์มันกำหนดผลจากการที่ไป ตอนนี้แน่นอนว่านี่เป็นเพียงตัวอย่างที่นี่ดังนั้นฉันไม่ได้กำหนดคู่ของคีย์ / ค่าให้กับวัตถุสถานะมันเป็นเพียงวัตถุเปล่า
นี่คือไวโอลินที่ฉันได้ทำ: jsfiddle.net มันแสดงให้เห็นว่าอุปกรณ์ประกอบฉากได้รับมอบหมายไม่ได้อยู่ในการสร้างโดยค่าเริ่มต้น ตามที่ผมเข้าใจพวกเขาจะ assinged React.createElement
ในวิธีการ ดังนั้นsuper(props)
ควรจะเรียกว่าเฉพาะเมื่อ superclass ของ assings คอนสตรัคด้วยตนเองเพื่อprops
this.props
หากคุณเพียงแค่ขยายการReact.Component
โทรsuper(props)
จะไม่ทำอะไรกับอุปกรณ์ประกอบฉาก อาจจะมีการเปลี่ยนแปลงใน React เวอร์ชันถัดไป
ที่นี่เราจะไม่ได้สิ่งนี้ในนวกรรมิกดังนั้นมันจะกลับมาไม่ได้กำหนด แต่เราจะสามารถดึงสิ่งนี้ออกมานอกฟังก์ชั่นการสร้าง
class MyComponent extends React.Component {
constructor() {
console.log(this); // Reference Error i.e return undefined
}
render() {
return <div>Hello {this.props.name}</div>;
}
}
ถ้าเราใช้ super () เราก็สามารถดึงตัวแปร "this" ภายในนวกรรมิกได้เช่นกัน
class MyComponent extends React.Component {
constructor() {
super();
console.log(this); // this logged to console
}
render() {
return <div>Hello {this.props.name}</div>;
}
}
ดังนั้นเมื่อเราใช้ super (); เราจะสามารถดึงข้อมูลได้ แต่ this.props จะไม่ได้กำหนดไว้ในตัวสร้าง แต่นอกเหนือจากคอนสตรัคเตอร์นี้
ถ้าเราใช้ super (อุปกรณ์ประกอบฉาก) จากนั้นเราสามารถใช้ this.props มูลค่าภายในนวกรรมิกเช่นกัน
ถ้าคุณต้องการใช้ thisprops ในนวกรรมิกคุณจะต้องผ่านอุปกรณ์ประกอบฉากไปยังสุดยอด มิฉะนั้นจะไม่สำคัญเนื่องจาก React จะตั้งค่า .props ให้กับอินสแตนซ์จากภายนอกทันทีหลังจากเรียกตัวสร้าง
สำหรับการตอบสนองเวอร์ชัน 16.6.3 เราใช้super (อุปกรณ์ประกอบฉาก)เพื่อเริ่มต้นชื่อองค์ประกอบของรัฐ: this.props.name
constructor(props){
super(props);
}
state = {
name:this.props.name
//otherwise not defined
};