ReactJS เพิ่มคลาสแบบไดนามิกให้กับชื่อคลาสแบบแมนนวล


158

ฉันต้องการเพิ่มคลาสแบบไดนามิกในรายการคลาสปกติ แต่ไม่ทราบว่า (ฉันใช้ babel) ได้อย่างไรเช่นนี้:

<div className="wrapper searchDiv {this.state.something}">
...
</div>

ความคิดใด ๆ


คำตอบที่เป็นประโยชน์สำหรับการปฏิบัติที่ดีที่สุดในการจัดแต่งสไตล์ reactjs ที่ลิงก์
Rahil Ahmad

คำตอบ:


241

คุณสามารถทำเช่นนี้ JavaScript ปกติ:

className={'wrapper searchDiv ' + this.state.something}

หรือเวอร์ชันเทมเพลตสตริงที่มี backticks:

className={`wrapper searchDiv ${this.state.something}`}

แน่นอนว่าทั้งสองประเภทนี้มีเพียง JavaScript แต่รูปแบบแรกคือรูปแบบดั้งเดิม

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


และในกรณีที่มีหลายคลาส
Pardeep Jain

5
ในกรณีของการเรียนแบบไดนามิกหลายทุกชั้นเรียนแบบไดนามิกจะต้องมาจากรัฐคือมันเป็นไปไม่ได้ที่จะใช้element.classList.add("my-class"); ดังนั้นการอนุญาตให้:className={`wrapper searchDiv ${this.state.something ? "my-class " : ""} ${this.state.somethingElse ? "my-other-class " : ""}`}
Kevin Farrugia

className={'wrapper searchDiv} + this.state.isTrue ? 'my-class' : ' 'มันใช้งานไม่ได้ มีใครบอกได้ไหมว่าทำไม
kryptokinght

54

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

ดังนั้นเป็นตัวอย่างจากเอกสารของ React

render () {

var btnClass = classNames({
  'btn': true,
  'btn-pressed': this.state.isPressed,
  'btn-over': !this.state.isPressed && this.state.isHovered
});

return <button className={btnClass}>I'm a button!</button>;

} 

เนื่องจาก React ทริกเกอร์การแสดงผลซ้ำเมื่อมีการเปลี่ยนแปลงสถานะชื่อคลาสแบบไดนามิกของคุณจะได้รับการจัดการอย่างเป็นธรรมชาติและอัพเดตด้วยสถานะขององค์ประกอบของคุณ


5
การใช้ classNames สำหรับสิ่งง่าย ๆ คือ overkill หลีกเลี่ยงการใช้และเลือกคำตอบง่ายๆจาก dannyjolie
รายการตรวจสอบ

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

5
@ รายการตรวจสอบฉันจะเถียงเป็นอย่างอื่นแพคเกจชื่อคลาสคือ 1.1kB ก่อน Gzipping (และครึ่ง kB หลังจาก Gzipping) ไม่มีการอ้างอิงและมี API ที่สะอาดมากสำหรับการจัดการชื่อคลาส ไม่จำเป็นต้องปรับบางสิ่งบางอย่างให้เล็กก่อนกำหนดเมื่อ API มีความหมายมากขึ้น เมื่อใช้การจัดการสตริงมาตรฐานคุณต้องจำไว้ว่าต้องคำนึงถึงการเว้นวรรคก่อนชื่อคลาสที่มีเงื่อนไขทุกครั้งหรือหลังชื่อคลาสมาตรฐานทั้งหมด
tomhughes

classNames ยอดเยี่ยมฉันพบว่าการอ่านการเพิ่มและการแก้ไขอุปกรณ์ประกอบฉากนั้นง่ายกว่าการปรับเปลี่ยนด้วยมือเนื่องจากส่วนประกอบมีความซับซ้อนมากขึ้น
MiFiHiBye


25

นี่คือตัวเลือกที่ดีที่สุดสำหรับ className แบบไดนามิกเพียงแค่ทำการต่อกันอย่างที่เราทำใน Javascript

     className={
        "badge " +
        (this.state.value ? "badge-primary " : "badge-danger ") +
        " m-4"
      }

นี่เป็นวิธีแก้ปัญหาที่ดีที่สุดโดยไม่มีปัญหาการทับหลัง ทำงานเหมือนจับใจ ขอบคุณ.
Royal.O

3

หากคุณต้องการชื่อสไตล์ซึ่งควรปรากฏตามสภาพของรัฐฉันชอบที่จะใช้โครงสร้างนี้:

<div className={'wrapper searchDiv' + (this.state.something === "a" ? " anotherClass" : "")'}>

2

ลองใช้ hooks:

        const [dynamicClasses, setDynamicClasses] = React.useState([
    "dynamicClass1", "dynamicClass2
]);

และเพิ่มในแอตทริบิวต์ className:

<div className=`wrapper searchDiv ${[...dynamicClasses]}`>
...
</div>

เพื่อเพิ่มคลาส:

    const addClass = newClass => {
       setDynamicClasses([...dynamicClasses, newClass])
    }

เพื่อลบคลาส:

        const deleteClass= classToDelete => {

           setDynamicClasses(dynamicClasses.filter(class = > {
             class !== classToDelete
           }));

        }

1

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

// Support for string arguments
getClassNames('class1', 'class2');

// support for Object
getClassNames({class1: true, class2 : false});

// support for all type of data
getClassNames('class1', 'class2', ['class3', 'class4'], { 
    class5 : function() { return false; },
    class6 : function() { return true; }
});

<div className={getClassNames({class1: true, class2 : false})} />


-1
className={css(styles.mainDiv, 'subContainer')}

โซลูชันนี้ได้รับการลองและทดสอบใน React SPFx

เพิ่มคำสั่งการนำเข้าด้วย:

import { css } from 'office-ui-fabric-react/lib/Utilities';
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.