อะไรคือจุดประสงค์ของการจัดฟันแบบลอนคู่ในไวยากรณ์ JSX ของ React


114

จากบทช่วยสอน react.jsเราจะเห็นการใช้วงเล็บปีกกาคู่นี้:

<span dangerouslySetInnerHTML={{ __html: rawMarkup }} />

จากนั้นในบทแนะนำที่สอง "กำลังคิดในการตอบสนอง" :

 <span style={{ color: 'red' }}>
     {this.props.product.name}
 </span>;

อย่างไรก็ตามเอกสาร React JSXไม่ได้อธิบายหรือกล่าวถึงวงเล็บปีกกาสองชั้น ไวยากรณ์นี้ (double curlies) มีไว้เพื่ออะไร? และมีวิธีอื่นในการแสดงสิ่งเดียวกันใน jsx หรือนี่เป็นเพียงการละเว้นจากเอกสาร?


9
จากเอกสารThe exterior set of curly braces are letting JSX know you want a JS expression. The interior set of curly braces represent a JavaScript object, meaning you’re passing in a object to the style attribute.
สายัณห์

คำตอบ:


117

มันเป็นเพียงตัวอักษรของวัตถุที่อยู่ในค่า prop มันเหมือนกับ

var obj = {__html: rawMarkup};

<span dangerouslySetInnerHTML={obj} />

@ BenAlpert ฉันจะมีความสุขเมื่อได้รับช่วงเวลา น่าแปลกจริงๆที่ฉันชอบแก้ไขเอกสาร (เป็นบรรณาธิการวารสารกฎหมายในชาติก่อน) และอาจมีการปรับปรุงอื่น ๆ อีกเล็กน้อยที่จะมี ปล. ยังอาศัยอยู่ในโบลเดอร์? มาจิบกาแฟหรือทานอาหารกลางวันกันบ้าง ... คงจะดีถ้าได้รู้จักใครสักคนที่มีเนื้อหาเกี่ยวกับ React เนื่องจากเราเพิ่งเริ่มโปรเจ็กต์ใหญ่กับมัน
Ben Roberts

1
@BenRoberts เยี่ยมมากขอบคุณ! น่าเสียดายที่ฉันอยู่ในแคลิฟอร์เนียในวันนี้ แต่อย่าลังเลที่จะแวะไปที่ห้อง #reactjs IRC ใน freenode และฉันยินดีที่จะตอบคำถาม
Sophie Alpert

@ BenAlpert คุณรู้หรือไม่ว่าความคิดที่อยู่เบื้องหลังทำให้มันdangerouslySetInnerHTML={__html: rawMarkup}เป็นdangerouslySetInnerHTML={rawMarkup}อย่างไร? เป็นเพราะวัตถุ{__html: rawMarkup}ไม่แน่นอนและสตริงไม่ใช่หรือ
Brian Kung


56

Curly Braces มี 2 การใช้งานที่นี่: -

  1. {.. } ประเมินเป็นนิพจน์ใน JSX
  2. {key: value} แสดงถึงวัตถุจาวาสคริปต์

ลองดูตัวอย่างง่ายๆ

<Image source={pic} style={{width: 193}}/>

หากสังเกตpicจะล้อมรอบด้วยเหล็กดัดฟัน นั่นคือวิธีการฝังตัวแปร JSX picสามารถเป็นนิพจน์ / ตัวแปร / อ็อบเจ็กต์ Javascript คุณยังสามารถทำบางสิ่งเช่น {2 + 3} และจะประเมินเป็น {5}

มาผ่าสไตล์กันที่นี่ {width: 193}เป็นวัตถุ Javascript และในการฝังวัตถุนี้ใน JSX คุณต้องใช้วงเล็บปีกกาดังนั้น{ {width: 193} }

หมายเหตุ: หากต้องการฝังนิพจน์ / ตัวแปร / อ็อบเจ็กต์ Javascript ใน JSX คุณต้องใช้วงเล็บปีกกา


@RohitMandiwal ขอบคุณครับ. ฉันรู้ว่ามันค่อนข้างสับสนเล็กน้อยเมื่อคุณมีปีกกาข้างในอีกอันหนึ่ง
Mav55

ช่างเป็นคำอธิบายที่ยอดเยี่ยมของการจัดฟันแบบลอนคู่ใน React! ขอบคุณมาก! ฉันจะให้คะแนนคำตอบนี้เป็นคำอธิบายที่ใช้ได้จริงที่สุด
skiabox


6

React ใช้ JSX ใน JSX ตัวแปรใด ๆ state object นิพจน์และอื่น ๆ จะต้องอยู่ใน {}

ในขณะที่ให้สไตล์อินไลน์ใน JSX ต้องระบุเป็นอ็อบเจ็กต์ดังนั้นจึงต้องอยู่ในวงเล็บปีกกาอีกครั้ง {}

นี่คือเหตุผลที่มีวงเล็บปีกกาสองคู่


4

หมายความว่าแทนที่จะประกาศตัวแปรสไตล์ที่ตั้งค่าเป็นอ็อบเจ็กต์ของคุณสมบัติสไตล์ที่ต้องการคุณสามารถตั้งค่าคุณสมบัติสไตล์ในอ็อบเจ็กต์แทนได้ ... นี่เป็นแนวทางปฏิบัติที่ดีที่สุดเมื่อสไตล์ที่คุณต้องการเพิ่มมีน้อย องค์ประกอบที่ต้องการรูปแบบมากขึ้นการประกาศตัวแปรลักษณะจะสะอาดกว่า

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

<span style={{color: 'red'}}>
  {this.props.product.name}
</span>

สำหรับองค์ประกอบ HTML ที่มีคุณสมบัติสไตล์เพิ่มเติมให้ทำเช่นนี้

const spanStyle = {
   backgroundColor: 'red',
   color: 'grey',
   margin: '-25px'
}

จากนั้นคุณเรียกมันด้วยไวยากรณ์ jsx

<span style={spanStyle}>
  {this.props.product.name}
</span>

1

ฉันพยายามบอกเป็นคำง่ายๆเพื่อให้ทุกคนเข้าใจ รหัสด้านล่าง:

<span dangerouslySetInnerHTML={{__html: rawMarkup}} />

เท่ากับ

<span 
     dangerouslySetInnerHTML={ {__html: rawMarkup} } 
/>

ดังนั้นเราควรใช้นิพจน์การตอบสนองหากเราจะกำหนดวัตถุตามตัวอักษรให้กับคุณสมบัติ

สำหรับบางคนที่ส่วนใหญ่จะย้ายจาก AngularJs เพื่อ ReactJs มันอาจจะเป็นส่วนหนึ่งของความสับสนกับการแสดงออกของผู้ประกอบการที่มีผลผูกพัน AngularJs' a {{}} ดังนั้นลองดูมันแตกต่างกันใน ReactJs


7
ส่วนรหัสสองชิ้นของคุณดูเหมือนจะเหมือนกันทุกประการยกเว้นการจัดรูปแบบ
jcollum

4
@jcollum - นั่นคือประเด็นของเขา "ตัวดำเนินการ" วงเล็บปีกกาคู่ไม่ใช่ตัวดำเนินการซึ่งเป็นสิ่งที่เขาแสดง มันเป็นเรื่องธรรมดามากในเครื่องมือสร้างเทมเพลต html ซึ่งมันดูแปลก ๆ ในการตอบสนอง
aaaaaa

ฉันยังไม่เข้าใจ
Andrew Lam

@AndrewLam - เพิ่งแก้ไข ตอนนี้เข้าใจได้หรือยัง?
Ehsan

1

การตีความวงเล็บปีกกาคู่ของฉันคือสไตล์อ็อบเจ็กต์ยอมรับเฉพาะออบเจ็กต์ JavaScript ดังนั้นอ็อบเจ็กต์จะต้องอยู่ในวงเล็บปีกกาเดี่ยว

style={jsObj}

อ็อบเจ็กต์สำหรับสไตล์อาร์ติแฟกต์เป็นคีย์: คู่ค่า (พจนานุกรมเทียบกับอาร์เรย์) และอ็อบเจ็กต์นั้นแสดงเป็นตัวอย่างเช่น {color:'#ffffff'}และวัตถุที่แสดงเป็นตัวอย่างเช่น

คุณมี:

style = { jsObj }

และ

jsObj = {color:'#ffffff'}

เช่นเดียวกับพีชคณิตเมื่อคุณแทนที่มันหมายถึง:

style = { {color:'#ffffff'} }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.