วิธีการเพิ่มหลายคลาสให้กับส่วนประกอบ ReactJS


348

ฉันใหม่สำหรับ ReactJS และ JSX และฉันมีปัญหาเล็กน้อยกับรหัสด้านล่าง

ฉันกำลังพยายามเพิ่มคลาสหลายคลาสให้กับclassNameแอตทริบิวต์ของแต่ละรายการli:

<li key={index} className={activeClass, data.class, "main-class"}></li>

องค์ประกอบ React ของฉันคือ:

var AccountMainMenu = React.createClass({
  getInitialState: function() {
    return { focused: 0 };
  },

  clicked: function(index) {
    this.setState({ focused: index });
  },

  render: function() {
    var self = this;
    var accountMenuData = [
      {
        name: "My Account",
        icon: "icon-account"
      },
      {
        name: "Messages",
        icon: "icon-message"
      },
      {
        name: "Settings",
        icon: "icon-settings"
      }
    /*{
        name:"Help &amp; Support &nbsp; <span class='font-awesome icon-support'></span>(888) 664.6261",
        listClass:"no-mobile last help-support last"
      }*/
    ];

    return (
      <div className="acc-header-wrapper clearfix">
        <ul className="acc-btns-container">
          {accountMenuData.map(function(data, index) {
            var activeClass = "";

            if (self.state.focused == index) {
              activeClass = "active";
            }

            return (
              <li
                key={index}
                className={activeClass}
                onClick={self.clicked.bind(self, index)}
              >
                <a href="#" className={data.icon}>
                  {data.name}
                </a>
              </li>
            );
          })}
        </ul>
      </div>
    );
  }
});

ReactDOM.render(<AccountMainMenu />, document.getElementById("app-container"));

ฉันพบคำตอบ breif ที่นี่stackoverflow.com/a/36209517/4125588เพียงใช้ JavaScript เพื่อเข้าร่วมคลาสนี้แบบคงที่หรือแบบไดนามิกด้วยตัวดำเนินการ '+' อย่าลืมแทรก '' ก่อนคลาสยกเว้นตัวแรก คลาสใน HTML ควรเป็น 'ab c' และเว้นวรรคระหว่างกัน
Fadeoc Khaos

ซ้ำซ้อนที่เป็นไปได้ของการส่งในชื่อคลาสเพื่อตอบสนองส่วนประกอบ
dashdashzako

1
ทำไมไม่classNames={{foo: true, bar: true, baz: false}}และclassNames={["foo", "bar"]}เพียงแค่การทำงาน ?
Peter V. Mørch

คำตอบ:


221

ฉันใช้ชื่อคลาสเมื่อมีจำนวนตรรกะพอสมควรสำหรับการตัดสินใจว่าจะใช้ (ไม่) สำหรับชั้นเรียน ตัวอย่างง่ายๆสุดเหวี่ยง :

...
    var liClasses = classNames({
      'main-class': true,
      'activeClass': self.state.focused === index
    });

    return (<li className={liClasses}>{data.name}</li>);
...

ที่กล่าวว่าหากคุณไม่ต้องการรวมการพึ่งพามีคำตอบที่ดีกว่าด้านล่าง


190
มันแย่มากที่คุณจะต้องนำไลบรารีชื่อคลาสมาใส่เพื่อเพิ่มสองคลาสในองค์ประกอบ :(
user959690

4
@ user959690 นี่คือตัวอย่าง ห้องสมุดนี้ดีมากเมื่อคุณทำสิ่งเหล่านี้มากมายและคุณมีตรรกะที่ซับซ้อนเมื่อต้องใช้คลาสหรือไม่ หากคุณกำลังทำอะไรง่าย ๆ ให้แน่ใจว่าใช้เทมเพลต แต่ทุกกรณีแตกต่างกันและผู้อ่านควรเลือกเครื่องมือที่เหมาะสมสำหรับงานของพวกเขา
แจ็ค

7
@ user959690 มันเป็นมูลค่า noting ว่าขณะนี้การติดตั้งโดย NPM เมื่อใช้ Webpackดังนั้นแล้วการใช้งานในองค์ประกอบimport classNames from 'classnames' className={classNames(classes.myFirstClass, classes.mySecondClass)}
Hooligancat

5
ไม่จำเป็นต้องใช้ห้องสมุดภายนอกดูคำตอบของฉันด้านล่าง
Huw Davies

1
ห้องสมุดมีข้อดีอื่น ๆ : var btnClass = classNames({ btn: true, 'btn-pressed': this.state.isPressed, 'btn-over': !this.state.isPressed && this.state.isHovered }); return <button className={btnClass}>{this.props.label}</button>;
AmitJS94

396

ผมใช้ตัวอักษรแม่แบบES6 ตัวอย่างเช่น:

const error = this.state.valid ? '' : 'error'
const classes = `form-control round-lg ${error}`

จากนั้นให้แสดง:

<input className={classes} />

รุ่นหนึ่งซับ:

<input className={`form-control round-lg ${this.state.valid ? '' : 'error'}`} />

158
ยัง:<input className={`class1 ${class2}`}>
โคดี้โมนิซ

3
@unyo กรุณาโพสต์ความคิดเห็นของคุณเป็นคำตอบเพื่อที่ฉันจะได้โหวตขึ้น มันสมควรได้รับมันมาก ฉันกำลังมองหาสิ่งที่ง่ายอย่างนี้ 1 ชั่วโมงและตอนนี้ฉันก็พบว่าสิ่งนี้ฝังอยู่ในความคิดเห็น ขอบคุณ.
Souvik Ghosh

<input class=" form-control input-lg round-lg" />ผลนี้ใน อย่าสังเกตพื้นที่พิเศษในการเริ่มต้น สิ่งนี้ถูกต้อง แต่น่าเกลียด แม้การตอบคำถามที่พบบ่อยแนะนำวิธีอื่นหรือใช้แพคเกจชื่อคลาส: reactjs.org/docs/faq-styling.html
Nakedible

ฉันไม่สามารถเข้าใจได้ว่าทำไมคุณถึงนำเข้าห้องสมุด (เช่นเดียวกับคำตอบที่ยอมรับ) เพื่อตั้งค่าบางคลาสที่สามารถตั้งค่าได้โดยใช้ Vanilla JavaScript ซึ่งเป็นโซลูชันที่มีประสิทธิภาพมากกว่า
Marcus Parsons

2
นี่คือคำตอบที่ถูกต้อง การใช้การขึ้นต่อกันสำหรับสิ่งนี้ตามที่แนะนำในคำตอบ "ถูกต้อง" คือ overkill
TheDarkIn1978

171

เพียงใช้จาวาสคริปต์

<li className={[activeClass, data.klass, "main-class"].join(' ')} />

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

function classNames(classes) {
  return Object.entries(classes)
    .filter(([key, value]) => value)
    .map(([key, value]) => key)
    .join(' ');
}

const classes = {
  'maybeClass': true,
  'otherClass': true,
  'probablyNotClass': false,
};

const myClassNames = classNames(classes);
// Output: "maybeClass otherClass"

<li className={myClassNames} />

หรือง่ายกว่า:

const isEnabled = true;
const isChecked = false;

<li className={[isEnabled && 'enabled', isChecked && 'checked']
  .filter(e => !!e)
  .join(' ')
} />
// Output:
// <li className={'enabled'} />

นี่คือบรรทัดที่เหมาะกับฉัน:className={['terra-Table', medOrder.resource.status]}
Doug Wilhelm

1
@DougWilhelm ฉันไม่คิดว่าใช้งานได้ โดยปริยายเรียก toString และสร้างรายการคลาสที่คั่นด้วยเครื่องหมายจุลภาค github.com/facebook/react/issues/3138
0xcaff

6
ความคิดที่ดีที่จะใช้className={[listOfClasses].join(' ')}มันใช้งานได้สำหรับฉันขอบคุณ!
Ala Eddine JEBALI

98

concat

ไม่จำเป็นต้องแฟนซีฉันกำลังใช้โมดูล CSS และมันก็ง่าย

import style from '/css/style.css';

<div className={style.style1+ ' ' + style.style2} />

สิ่งนี้จะส่งผลให้:

<div class="src-client-css-pages-style1-selectionItem src-client-css-pages-style2">

กล่าวอีกนัยหนึ่งทั้งสไตล์

เงื่อนไข

มันจะง่ายต่อการใช้ความคิดเดียวกันกับถ้าเป็น

const class1 = doIHaveSomething ? style.style1 : 'backupClass';

<div className={class1 + ' ' + style.style2} />

1
สิ่งนี้ใช้ได้กับฉันพร้อมกับชื่อ '-' เช่น: <nav className = {styles.navbar + "" + styles ['navbar-default']}>
Flinkman

ฮ่า ๆ ๆ ฉันหัวแตกและคำตอบนั้นง่าย concat: D Btw นี้ยังใช้งานได้กับ CSS Loader Module
GusDeCooL

ปัญหาที่เกิดขึ้นคือคุณไม่สามารถมีคลาสเสริม (หากไม่ได้กำหนดจะไม่มีการเพิ่มคลาส) ดังนั้นขึ้นอยู่กับว่าคุณแน่ใจว่าคลาสของคุณไม่ว่างเปล่า (ไม่ใช่ทางเลือก) ในกรณีที่เป็นตัวเลือกก็ไม่ได้ดีไปกว่าผู้ช่วยเช่นคลาส () เราสามารถใช้className={เทอร์นารีกับเทมเพลตอย่างเช่นตัวเลื่อนนั้น$ {className? `$ {className} : ''}}` ` แต่มันเยอะมาก [หมายเหตุ: 'some' + undefined = 'บางสิ่งบางอย่างที่อยู่ภายใต้' การแปลง Js แบบไดนามิก
Mohamed Allal

แน่ใจว่าคุณสามารถเพียงแค่ประกาศตัวแปรข้างต้นและใช้เงื่อนไข :)
เจมี่ Hutber

42

สิ่งนี้สามารถทำได้ด้วยตัวอักษรเทมเพลต ES6:

<input className={`class1 ${class2}`}>

1
นี่เกือบจะใช้ได้สำหรับฉันฉันแค่ต้องสอดแทรก class1 ด้วยและไม่มีข้อผิดพลาดเพิ่มเติมดังนั้นจึงมีลักษณะเช่นนี้ <input className={`${class1} ${class2}`}>
Kingston Fortune

35

คุณสามารถสร้างองค์ประกอบที่มีชื่อคลาสได้หลายแบบดังนี้:

<li className="class1 class2 class3">foo</li>

โดยปกติคุณสามารถใช้สตริงที่มีชื่อคลาสและจัดการสตริงนี้เพื่ออัปเดตชื่อคลาสขององค์ประกอบ

var myClassNammes = 'class1 class2 class3';
...
<li className={myClassNames}>foo</li>

1
คุณทดสอบสิ่งนี้หรือไม่? ฉันทำ :)
กา

ใช่ฉันทำ. อันที่จริงฉันใช้มันบ่อย แต่เพิ่งเห็นและแก้ไขข้อผิดพลาด แน่นอนสตริงที่มีชื่อชั้นในบรรทัดแรกจะต้องมีการทำโดยใช้แทน" 'ขอโทษด้วยกับเรื่องนั้น.
nightlyop

20

นี่คือวิธีที่คุณสามารถทำได้ด้วย ES6:

className = {`
      text-right
      ${itemId === activeItemId ? 'active' : ''}
      ${anotherProperty === true ? 'class1' : 'class2'}
`}

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

โชคดี ;)


2
สิ่งนี้ส่งผลให้ HTML น่าเกลียดมากพิจารณาพื้นที่ว่างทั้งหมด
Nakedible

2
ไม่จำเป็นต้องเขียนเช่นนี้ นี่เป็นเพียงตัวอย่างที่อธิบายการแก้ปัญหาได้ดีกว่า และมักจะใช้ในการผลิตคุณมีรุ่น minified :)
Hristo Eftimov

18

วานิลลา JS

ไม่จำเป็นสำหรับไลบรารี่ภายนอก - เพียงแค่ใช้เทมเพลตสตริง ES6 :

<i className={`${styles['foo-bar-baz']} fa fa-user fa-2x`}/>

วานิลลา JS ไม่ใช่ ES6 แต่ฉันชอบตัวอย่างของคุณ
RyanNerd

8
@RyanNerd คุณหมายถึง "ES6 ไม่ใช่ vanilla JS" หรือไม่ อย่างไรก็ตามมันเป็นเพราะวนิลา js หมายถึงจาวาสคริปต์โดยไม่มีกรอบ ES6 เป็นจาวาสคริปต์รุ่นใหม่ - stackoverflow.com/a/20435685/5111113
Huw Davies

ไม่ใช่คำตอบที่ผิด แต่อาจปรับปรุงได้มาก ตัวอย่างเช่นทุกคนเพิ่มตัวอย่างเกี่ยวกับสถานะ
JGallardo

10

บางทีชื่อคลาสอาจช่วยคุณได้

var classNames = require('classnames');
classNames('foo', {'xx-test': true, bar: false}, {'ox-test': false}); // => 'foo xx-test'

1
คุณสามารถทำให้ตัวอย่างนี้ใช้งานได้มากขึ้น
JGallardo

9

ฉันไม่คิดว่าเราต้องใช้แพ็คเกจภายนอกเพื่อเพิ่มคลาสหลายคลาส

ฉันใช้เป็นการส่วนตัว

<li className={`li active`}>Stacy</li>

หรือ

<li className={`li ${this.state.isActive ? 'active' : ''}`}>Stacy<li>

อันที่สองในกรณีที่คุณต้องการเพิ่มหรือลบคลาสที่มีเงื่อนไข


1
สิ่งนี้จะเพิ่มคลาสเดียวเท่านั้น
TrickOrTreat

6

เพียงเพิ่มเราสามารถกรองสตริงว่าง

className={[
    'read-more-box',
    this.props.className,
    this.state.isExpanded ? 'open' : 'close',
].filter(x => !!x).join(' ')}

6

คุณสามารถสร้างองค์ประกอบที่มีชื่อคลาสหลายแบบได้ฉันลองทั้งสองวิธีแล้วมันใช้งานได้ดี ...

หากคุณนำเข้า css ใด ๆ คุณสามารถทำตามวิธีนี้ได้วิธีที่ 1:

import React, { Component, PropTypes } from 'react';
import csjs from 'csjs';
import styles from './styles';
import insertCss from 'insert-css';
import classNames from 'classnames';
insertCss(csjs.getCss(styles));
export default class Foo extends Component {
  render() {
    return (
      <div className={[styles.class1, styles.class2].join(' ')}>
        { 'text' }
      </div>
    );
  }
}

วิธีที่ 2:

import React, { Component, PropTypes } from 'react';
import csjs from 'csjs';
import styles from './styles';
import insertCss from 'insert-css';
import classNames from 'classnames';
insertCss(csjs.getCss(styles));
export default class Foo extends Component {
  render() {
    return (
      <div className={styles.class1 + ' ' + styles.class2}>
        { 'text' }
      </div>
    );
  }
}

**

หากคุณใช้ css เป็นแบบภายใน:

const myStyle = {
  color: "#fff"
};

// React Element using Jsx
const myReactElement = (
  <h1 style={myStyle} className="myClassName myClassName1">
    Hello World!
  </h1>
);

ReactDOM.render(myReactElement, document.getElementById("app"));
.myClassName {
  background-color: #333;
  padding: 10px;
}
.myClassName1{
  border: 2px solid #000;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.4.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.4.0/umd/react-dom.production.min.js"></script>
<div id="app">
  
</div>



5

สามารถทำได้ด้วยhttps://www.npmjs.com/package/clsx :

https://www.npmjs.com/package/clsx

ก่อนติดตั้ง:

npm install --save clsx

จากนั้นนำเข้ามาไว้ในไฟล์คอมโพเนนต์ของคุณ:

import clsx from  'clsx';

จากนั้นใช้ฟังก์ชั่นที่นำเข้ามาในองค์ประกอบของคุณ:

<div className={ clsx(classes.class1, classes.class2)}>

4

ไปงานปาร์ตี้สาย แต่ทำไมใช้บุคคลที่สามสำหรับปัญหาง่าย ๆ

คุณสามารถทำได้ตามที่ @Huw Davies พูดถึง - วิธีที่ดีที่สุด

1. <i className={`${styles['foo-bar-baz']} fa fa-user fa-2x`}/>
2. <i className={[styles['foo-bar-baz'], 'fa fa-user', 'fa-2x'].join(' ')}

ทั้งสองอย่างดี แต่การเขียนอาจซับซ้อนสำหรับแอพขนาดใหญ่ เพื่อให้ดีที่สุดฉันทำสิ่งเดียวกันกับข้างบน แต่ใส่ไว้ในคลาสผู้ช่วย

การใช้ฟังก์ชั่นตัวช่วยด้านล่างช่วยให้ฉันสามารถแยกลอจิกเพื่อการแก้ไขในอนาคตและยังให้ฉันเพิ่มวิธีได้หลายวิธี

classNames(styles['foo-bar-baz], 'fa fa-user', 'fa-2x')

หรือ

classNames([styles['foo-bar-baz], 'fa fa-user', 'fa-2x'])

นี่คือฟังก์ชันผู้ช่วยของฉันด้านล่าง ฉันใส่ไว้ใน helper.js ที่ฉันใช้วิธีการทั่วไปของฉัน เป็นฟังก์ชั่นที่เรียบง่ายฉันหลีกเลี่ยงการใช้บุคคลที่สามเพื่อควบคุม

export function classNames (classes) {
    if(classes && classes.constructor === Array) {
        return classes.join(' ')
    } else if(arguments[0] !== undefined) {
        return [...arguments].join(' ')
    }
    return ''
}

3

คุณสามารถใช้อาร์เรย์แล้วเข้าร่วมได้โดยใช้ช่องว่าง

<li key={index} className={[activeClass, data.class, "main-class"].join(' ')}></li>

สิ่งนี้จะส่งผลให้:

<li key={index} class="activeClass data.class main-class"></li>

3

ฉันรู้ว่านี่เป็นคำตอบที่ล่าช้า แต่ฉันหวังว่านี่จะช่วยให้ใครบางคน

พิจารณาว่าคุณได้กำหนดคลาสต่อไปนี้ในไฟล์ css ' primary ', ' font-i ', ' font-xl '

  • ขั้นตอนแรกคือการนำเข้าไฟล์ CSS
  • แล้วก็

<h3 class = {` ${'primary'} ${'font-i'} font-xl`}> HELLO WORLD </h3>

จะทำเคล็ดลับ!

สำหรับข้อมูลเพิ่มเติม: https://www.youtube.com/watch?v=j5P9FHiBVNo&list=PLC3y8-rFHvwgg3vaYJgGGGGGGGGGGMMBB



2

ใช้ตัวอย่าง TodoTextInput.js ของ facebook

render() {
    return (
      <input className={
        classnames({
          edit: this.props.editing,
          'new-todo': this.props.newTodo
        })}
        type="text"
        placeholder={this.props.placeholder}
        autoFocus="true"
        value={this.state.text}
        onBlur={this.handleBlur}
        onChange={this.handleChange}
        onKeyDown={this.handleSubmit} />
    )
  } 

การแทนที่ชื่อคลาสด้วยรหัสวานิลลาธรรมดา js จะมีลักษณะดังนี้:

render() {
    return (
      <input
        className={`
          ${this.props.editing ? 'edit' : ''} ${this.props.newTodo ? 'new-todo' : ''}
        `}
        type="text"
        placeholder={this.props.placeholder}
        autoFocus="true"
        value={this.state.text}
        onBlur={this.handleBlur}
        onChange={this.handleChange}
        onKeyDown={this.handleSubmit} />
    )
  }

2

หากคุณไม่รู้สึกอยากนำเข้าโมดูลอื่นฟังก์ชั่นนี้จะทำงานเหมือนclassNamesโมดูล

function classNames(rules) {
    var classes = ''

    Object.keys(rules).forEach(item => {    
        if (rules[item])
            classes += (classes.length ? ' ' : '') + item
    })

    return classes
} 

คุณสามารถใช้สิ่งนี้:

render() {
    var classes = classNames({
        'storeInfoDiv': true,  
        'hover': this.state.isHovered == this.props.store.store_id
    })   

    return (
        <SomeComponent style={classes} />
    )
}

เหตุใดจึงใช้การปิดหากคุณสามารถทำเช่นเดียวกันกับแผนที่หรือลดขนาดได้ function classNames(rules) { return Object.entries(rules) .reduce( (arr, [cls, flag]) => { if (flag) arr.push(cls); return arr }, [] ).join(" ") }
ЕвгенийСавичев

1

นั่นคือสิ่งที่ฉันทำ:

ส่วนประกอบคือ:

const Button = ({ className }) => (
  <div className={ className }> </div>
);

องค์ประกอบการโทร:

<Button className = 'hashButton free anotherClass' />

1

ฉันใช้ React 16.6.3 และ @Material UI 3.5.1 และสามารถใช้อาร์เรย์ใน className ได้ className={[classes.tableCell, classes.capitalize]}

ดังนั้นในตัวอย่างของคุณสิ่งต่อไปนี้จะคล้ายกัน

<li key={index} className={[activeClass, data.class, "main-class"]}></li>

นี่คือสิ่งที่ฉันทำ (แม้ว่าจะไม่ใช่ MUI) และใช้งานไม่ได้ใช้เฉพาะชั้นเฟิร์สคลาส - ไม่มีคำเตือนหรือบ่น
Juan Lanus

1

ใช้https://www.npmjs.com/package/classnames

นำเข้า classNames จาก 'classnames';

  1. สามารถใช้หลายคลาสโดยใช้ comas คั่น:

    <li className={classNames(classes.tableCellLabel, classes.tableCell)}>Total</li>
  2. สามารถใช้หลายคลาสโดยใช้ comas คั่นด้วยเงื่อนไข:

    <li className={classNames(classes.buttonArea, !nodes.length && classes.buttonAreaHidden)}>Hello World</li> 

การใช้อาเรย์เป็นอุปกรณ์ประกอบฉากกับ classNames จะใช้งานได้ แต่ให้คำเตือนเช่น

className={[classes.tableCellLabel, classes.tableCell]}

ซ้ำอีกคำตอบที่มีอยู่
Jack Bashford

0

ฉันใช้แพ็คเกจชื่อ rc-class

// ES6
import c from 'rc-classnames';

// CommonJS
var c = require('rc-classnames');

<button className={c('button', {
  'button--disabled': isDisabled,
  'button--no-radius': !hasRadius
})} />

คุณสามารถเพิ่มคลาสในรูปแบบใด ๆ (Array, Object, Argument) ค่าความจริงทั้งหมดจากอาร์เรย์หรืออาร์กิวเมนต์รวมถึงคีย์ในวัตถุที่เท่ากับการtrueรวมเข้าด้วยกัน

ตัวอย่างเช่น:

ReactClassNames('a', 'b', 'c') // => "a b c"
ReactClassNames({ 'a': true, 'b': false, c: 'true' }) // => "a c"
ReactClassNames(undefined, null, 'a', 0, 'b') // => "a b"

0

I bind classNamesไปยังโมดูล css ที่อิมพอร์ตไปยังคอมโพเนนต์

import classNames from 'classnames'; 
import * as styles from './[STYLES PATH];
const cx = classNames.bind(styles); 

classnamesให้ความสามารถในการประกาศclassNameสำหรับองค์ประกอบปฏิกิริยาในลักษณะที่เปิดเผย

อดีต:

<div classNames={cx(styles.titleText)}> Lorem </div>

<div classNames={cx('float-left')}> Lorem </div> // global css declared without css modules
<div classNames={cx( (test === 0) ?
             styles.titleText : 
             styles.subTitleText)}>  Lorem </div> // conditionally assign classes

<div classNames={cx(styles.titleText, 'float-left')}> Lorem </div> //combine multiple classes

0

ฉันมักจะใช้มันในลักษณะนี้: (ในกรณีของคุณ)

    <li  key={index} className={
        "component " +
        `${activeClass? activeClass: " not-an-active-class "}` +
        `${data.class? " " + data.class : " no-data-class "}`
   } />

เมื่อมาถึง JSX และ (ปกติ) เรามี JSON บางอย่าง ... กว่าที่คุณห่วงมัน ... องค์ประกอบ แผนที่บวกเงื่อนไขบางอย่างเพื่อตรวจสอบว่าคุณสมบัติ json มีอยู่ในการแสดงชื่อชั้นขึ้นอยู่กับมูลค่าทรัพย์สินจาก JSON ในตัวอย่างด้านล่างcomponent_color และcomponent_dark_shade คือคุณสมบัติจาก component.map ()

   <div className={
        "component " +
        `${component_color? component_color: " no-color "}` +
        `${component_dark_shade? " " + component_dark_shade : " light "}`
   }/>

ผลลัพธ์: <div class="component no-color light" .... หรือ: <div class="component blue dark" ....ขึ้นอยู่กับค่าจากแผนที่ ...


0

เมื่อฉันมีคลาสที่แตกต่างกันจำนวนมากฉันพบว่าต่อไปนี้จะเป็นประโยชน์

ตัวกรองจะลบค่าใด ๆnullและการรวมจะทำให้ค่าที่เหลือทั้งหมดลงในสตริงที่คั่นด้วยช่องว่าง

const buttonClasses = [
    "Button", 
    disabled ? "disabled" : null,
    active ? "active" : null
].filter((class) => class).join(" ")

<button className={buttonClasses} onClick={onClick} disabled={disabled ? disabled : false}>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.