ReactJS thêm lớp động vào tên lớp thủ công


158

Tôi cần thêm một lớp động vào danh sách các lớp thông thường, nhưng không biết làm thế nào (tôi đang sử dụng babel), đại loại như thế này:

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

Có ý kiến ​​gì không?


Câu trả lời hữu ích cho phong cách thực hành tốt nhất của Reacjs tại link
Rahil Ahmad

Câu trả lời:


240

Bạn có thể làm điều này, JavaScript bình thường:

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

hoặc phiên bản mẫu chuỗi, với backticks:

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

Cả hai loại tất nhiên chỉ là JavaScript, nhưng mẫu đầu tiên là loại truyền thống.

Dù sao, trong JSX, mọi thứ được đặt trong dấu ngoặc nhọn đều được thực thi dưới dạng JavaScript, vì vậy về cơ bản bạn có thể làm bất cứ điều gì bạn muốn ở đó. Nhưng việc kết hợp các chuỗi JSX dấu ngoặc nhọn là không có lợi cho các thuộc tính.


và những gì trong trường hợp của nhiều lớp?
Pardeep Jain

5
Trong trường hợp có nhiều lớp động, tất cả các lớp động phải đến từ trạng thái, tức là không thể sử dụng element.classList.add("my-class"); do đó cho phép:className={`wrapper searchDiv ${this.state.something ? "my-class " : ""} ${this.state.somethingElse ? "my-other-class " : ""}`}
Kevin Farrugia

className={'wrapper searchDiv} + this.state.isTrue ? 'my-class' : ' 'Điều này không hoạt động. Ai có thể nói tại sao?
kryptokinght

54

Tùy thuộc vào số lượng lớp động bạn cần thêm khi dự án của bạn phát triển, có thể đáng để kiểm tra tiện ích tên lớp của JedWatson trên GitHub. Nó cho phép bạn biểu diễn các lớp có điều kiện của bạn dưới dạng một đối tượng và trả về các lớp đánh giá là đúng.

Vì vậy, như một ví dụ từ tài liệu React của nó:

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>;

} 

Vì React kích hoạt kết xuất lại khi có thay đổi trạng thái, tên lớp động của bạn được xử lý tự nhiên và được cập nhật với trạng thái của thành phần.


5
Việc sử dụng classNames cho một điều đơn giản như vậy là quá mức cần thiết. Tránh sử dụng nó và chọn cho câu trả lời đơn giản của dannyjolie
danh sách kiểm tra

2
Bạn có chắc đó là một điều đơn giản? Gần như luôn luôn bạn muốn có toàn quyền kiểm soát hoàn toàn các lớp được áp dụng cho các phần tử.
Dragas

5
@checklist Tôi sẽ tranh luận khác, gói tên lớp là 1,1kB trước Gzipping (và nửa kB sau Gzipping), không có phụ thuộc và cung cấp API sạch hơn cho thao tác tên lớp. Không cần phải tối ưu hóa sớm một cái gì đó quá nhỏ, khi API biểu cảm hơn nhiều. Khi sử dụng thao tác chuỗi tiêu chuẩn, bạn phải nhớ tính toán khoảng cách, trước mỗi tên lớp có điều kiện hoặc sau mỗi tên lớp tiêu chuẩn.
tomhughes

classNames thật tuyệt, tôi thấy rằng việc đọc, thêm và sửa các đạo cụ dễ hơn thao tác thủ công khi thành phần này trở nên phức tạp.
MiFiHiBye

37

Một cú pháp đơn giản có thể sẽ là:

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

25

Đây là tùy chọn tốt nhất cho tên lớp động, chỉ cần thực hiện một số phép nối giống như chúng ta làm trong Javascript.

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

Đây là giải pháp tốt nhất mà không có bất kỳ vấn đề linting. Làm việc như người ở. Cảm ơn bạn.
Royal.O

3

Nếu bạn cần tên kiểu sẽ xuất hiện theo điều kiện trạng thái, tôi thích sử dụng cấu trúc này:

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

2

thử cái này bằng hook:

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

và thêm cái này trong thuộc tính className:

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

để thêm lớp:

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

để xóa lớp:

        const deleteClass= classToDelete => {

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

        }

1

Bạn có thể sử dụng gói npm này . Nó xử lý mọi thứ và có các tùy chọn cho các lớp tĩnh và động dựa trên một biến hoặc một hàm.

// 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
getBadgeClasses() {
    let classes = "badge m-2 ";
    classes += (this.state.count === 0) ? "badge-warning" : "badge-primary";
    return classes;
}

<span className={this.getBadgeClasses()}>Total Count</span>

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

Giải pháp này đã được thử và thử nghiệm trong React SPFx.

Đồng thời thêm câu lệnh nhập:

import { css } from 'office-ui-fabric-react/lib/Utilities';
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.