แอตทริบิวต์แบบไดนามิกใน ReactJS


93

ฉันต้องการรวม / ละเว้นแอตทริบิวต์ที่ปิดใช้งานในองค์ประกอบปุ่มแบบไดนามิก ฉันได้เห็นตัวอย่างของค่าแอตทริบิวต์ไดนามิกมากมาย แต่ไม่ใช่ของแอตทริบิวต์เอง ฉันมีฟังก์ชันการแสดงผลดังต่อไปนี้:

render: function() {
    var maybeDisabled = AppStore.cartIsEmpty() ? "disabled" : "";
    return <button {maybeDisabled}>Clear cart</button>
}

ซึ่งทำให้เกิดข้อผิดพลาดในการแยกวิเคราะห์เนื่องจากอักขระ "{" ฉันจะรวม / ละเว้นแอตทริบิวต์ที่ปิดใช้งานตามผลลัพธ์ (บูลีน) ของ AppStore.cartIsEmpty () ได้อย่างไร

คำตอบ:


172

วิธีที่สะอาดที่สุดในการเพิ่มแอตทริบิวต์ทางเลือก (รวมถึงdisabledและอื่น ๆ ที่คุณอาจต้องการใช้) คือการใช้แอตทริบิวต์การแพร่กระจาย JSX :

var Hello = React.createClass({
    render: function() {
        var opts = {};
        if (this.props.disabled) {
            opts['disabled'] = 'disabled';
        }
        return <button {...opts}>Hello {this.props.name}</button>;
    }
});

React.render((<div><Hello name="Disabled" disabled='true' />
    <Hello name="Enabled"  />
</div>)
, document.getElementById('container'));

ด้วยการใช้แอตทริบิวต์การแพร่กระจายคุณสามารถเพิ่ม (หรือแทนที่) แอตทริบิวต์ที่คุณต้องการได้แบบไดนามิกโดยใช้อินสแตนซ์วัตถุจาวาสคริปต์ ในตัวอย่างของฉันด้านบนโค้ดจะสร้างdisabledคีย์ (ที่มีdisabledค่าในกรณีนี้) เมื่อdisabledคุณสมบัติถูกส่งไปยังHelloอินสแตนซ์คอมโพเนนต์

ถ้าคุณเพียงต้องการที่จะใช้disabledแต่นี้คำตอบที่ทำงานได้ดี


เมื่อเข้าที่แล้ว CSS like: a[disabled] { pointer-events: none; }จะหยุดการทำงานกับองค์ประกอบ / องค์ประกอบ
timbo

49

คุณสามารถส่งผ่านบูลีนไปยังdisabledแอตทริบิวต์

render: function() {
    return <button disabled={AppStore.cartIsEmpty()}>Clear cart</button>
}

8
ไม่คุณไม่สามารถ. การมีอยู่ของแอตทริบิวต์ที่ปิดใช้งานปิดใช้งานปุ่มทั้งหมด ดูhttp://jsfiddle.net/ttjhyvmt/
Timmy

20
การตอบสนองนั้นฉลาดพอที่จะตั้งค่าdisabledแอตทริบิวต์ตามเงื่อนไขบน HTML ที่เป็นผลลัพธ์ขึ้นอยู่กับค่าที่คุณส่งผ่าน jsfiddle.net/kb3gN/10379
Alexandre Kirszenberg

2
ไม่แน่ใจว่าพลาดไปได้อย่างไรขอบคุณ! ในขณะที่วิธีนี้ใช้ได้กับกรณีเฉพาะของฉันฉันได้ยอมรับคำตอบอื่นที่ละเว้น / รวมคุณสมบัติไว้
Timmy

1
มีปัญหากับ IE11 อย่างไรก็ตามเราไม่ได้ใช้การตอบสนองล่าสุด คำตอบแอตทริบิวต์การแพร่กระจาย JSX ใช้งานได้
LessQuesar

24

ฉันใช้ React 16 และใช้ได้กับฉัน ( boolการทดสอบของคุณอยู่ที่ไหน):

<fieldset {...(bool ? {disabled:true} : {})}>

โดยทั่วไปจากการทดสอบ ( bool) คุณส่งคืนวัตถุที่มีแอตทริบิวต์หรือคุณส่งคืนวัตถุว่างเปล่า

นอกจากนี้หากคุณต้องการเพิ่มหรือละเว้นแอตทริบิวต์หลายรายการคุณสามารถทำได้:

<fieldset {...(bool ? {disabled:true} : {})} {...(bool ? {something:'123'} : {})}>

สำหรับแอตทริบิวต์ที่ซับซ้อนมากขึ้นที่มีการจัดการฉันขอแนะนำให้คุณกำหนดแท็บวัตถุที่มี (หรือไม่มี) แอตทริบิวต์ภายนอก JSX


ขอบคุณสำหรับคำตอบที่เรียบง่าย แต่มีประโยชน์มาก!
tommygun

4

วิธีที่สะอาดกว่าในการทำแอตทริบิวต์แบบไดนามิกซึ่งใช้ได้กับแอตทริบิวต์ใด ๆ คือ

function dynamicAttributes(attribute, value){
  var opts = {};
  if(typeof value !== 'undefined' && value !== null) {
    opts['"'+attribute+'"'] = value;
    return opts;
  }
  return false;
};

โทรในองค์ประกอบการตอบสนองของคุณดังต่อไปนี้

<ReactComponent {...dynamicAttributes("disabled",false)}
{...dynamicAttributes("data-url",dataURL)}
{...dynamicAttributes("data-modal",true)} />

เคล็ดลับ:

  1. คุณสามารถมีdynamicAttributesฟังก์ชั่นในสถานที่ / ยูทิลิตี้ทั่วไปและนำเข้าเพื่อใช้ในทุกองค์ประกอบ

  2. คุณสามารถส่งผ่านค่าnullเพื่อไม่ให้แสดงแอตทริบิวต์แบบไดนามิก


ทำไมไม่ทำเช่นนี้: <ReactComponent {... {"data-url": dataURL}} /> มันง่ายกว่าและไม่จำเป็นต้องมี "dynamicAttributes"
gdbdable

ในกรณีที่แอตทริบิวต์เป็นโมฆะเราไม่ต้องการตอบสนองต่อการแสดงผลแอตทริบิวต์นั้น ตัวอย่าง: "data-modal": null เราไม่ต้องการตอบสนองเพื่อแสดง data-model = "null" ในกรณีนี้รหัสข้างต้นของฉันจะไม่แสดงแอตทริบิวต์เช่นแอตทริบิวต์แบบไดนามิกตามค่า
Venkat Reddy

4

สะอาดกว่าโซลูชันที่ยอมรับได้คือโซลูชันที่ AnilRedshift กล่าวถึง แต่ที่ฉันจะขยายต่อไป

พูดง่ายๆคือแอตทริบิวต์ HTML มีชื่อและค่า คุณสามารถใช้ชื่อเฉพาะสำหรับ "ปิดใช้งาน", "หลายรายการ" เป็นต้น แต่เวอร์ชัน longhand ยังใช้งานได้และอนุญาตให้ React ทำงานในลักษณะที่ต้องการ

disabled={disabled ? 'disabled' : undefined} เป็นวิธีแก้ปัญหาที่ชัดเจนที่สุด


3

เวอร์ชันที่ฉันใช้คือ:

<button disabled={disabled ? 'disabled' : undefined}>
    Click me (or dont)
</button>

การใช้ที่ไม่ได้กำหนดไว้ในโค้ดของคุณเป็นแนวทางปฏิบัติที่ไม่ดี นอกจากนี้ยังไม่จำเป็นเนื่องจากคุณสามารถเขียน <button disabled = {disabled}> เนื่องจากปิดใช้งานเป็นตัวแปรบูลีนมากกว่าที่จะส่งกลับจริงหรือเท็จ
Raphael Pinel

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

2

คุณสามารถค้นหาสิ่งที่คล้ายกับสิ่งนี้ได้ที่เอกสารประกอบ

https://facebook.github.io/react/docs/transferring-props.html

ในกรณีของคุณอาจเป็นเช่นนี้

function MyComponent(props) {
    let { disabled, ...attrs } = props;
    if (disabled) {
        // thus, it will has the disabled attribute only if it
        // is disabled
        attrs = {
            ...attrs,
            disabled: true
        }
    };

    return (
        <button {...attrs}>MyLabel</button>
    )
}

รหัสนี้ใช้ ES6 แต่ฉันคิดว่าคุณมีความคิด

สิ่งนี้ยอดเยี่ยมเพราะคุณสามารถส่งต่อคุณลักษณะอื่น ๆ มากมายให้กับส่วนประกอบนี้ได้


2

วิธีทำที่ง่ายและสะอาด

<button {...disabled && {disabled: true}}>Clear cart</button>

พิการควรมาจากอุปกรณ์ประกอบฉากเช่นนี้

<MyComponent disabled />

0

ก่อนอื่นคุณสามารถตรวจสอบได้

<button disabled={true}>Button 1</button>
<button disabled={false}>Button 2</button>

หมายเหตุ: ค่าพิการ ** ไม่ String มันควรจะเป็นแบบบูล

ตอนนี้สำหรับไดนามิก คุณสามารถเขียน

<button type="button" disabled={disable}  
        onClick={()=>this.setSelectValue('sms')} >{this.state.sms}</button>

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


-3

สิ่งนี้สามารถใช้งานได้ปัญหาเกี่ยวกับการปิดใช้งานคือเราไม่สามารถตั้งค่าบูลีนให้มันได้

if(AppStore.cartIsEmpty()){
  return "<button disabled>Clear cart</button>"
}
else
{
  return "<button>Clear cart</button>"
}

ฉันกลัวฉันอาจจะต้องหันไปนี้ .. ฉันจะรอดูว่าใครมีข้อเสนอแนะใด ๆ ก่อนที่จะยอมรับคำตอบของคุณ
ทิม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.