Vẫn chưa có nhiều "Thực tiễn tốt nhất". Những người trong chúng ta đang sử dụng kiểu nội tuyến, cho các thành phần React, vẫn còn rất nhiều thử nghiệm.
Có một số cách tiếp cận khác nhau: Biểu đồ so sánh lib kiểu nội tuyến
Tất cả hoặc không có gì?
Những gì chúng ta gọi là "phong cách" thực sự bao gồm khá nhiều khái niệm:
- Bố cục - cách một thành phần / thành phần trông trong mối quan hệ với người khác
- Ngoại hình - đặc điểm của một yếu tố / thành phần
- Hành vi và trạng thái - làm thế nào một yếu tố / thành phần trông trong một trạng thái nhất định
Bắt đầu với phong cách nhà nước
React đã quản lý trạng thái của các thành phần của bạn, điều này tạo ra các kiểu trạng thái và hành vi phù hợp tự nhiên với colocation với logic thành phần của bạn.
Thay vì xây dựng các thành phần để kết xuất với các lớp trạng thái có điều kiện, hãy xem xét thêm trực tiếp các kiểu trạng thái:
// Typical component with state-classes
<li
className={classnames({ 'todo-list__item': true, 'is-complete': item.complete })} />
// Using inline-styles for state
<li className='todo-list__item'
style={(item.complete) ? styles.complete : {}} />
Lưu ý rằng chúng tôi đang sử dụng một lớp để tạo kiểu dáng nhưng không còn sử dụng bất kỳ .is-
lớp tiền tố nào cho trạng thái và hành vi .
Chúng tôi có thể sử dụng Object.assign
(ES6) hoặc _.extend
(gạch dưới / lodash) để thêm hỗ trợ cho nhiều trạng thái:
// Supporting multiple-states with inline-styles
<li 'todo-list__item'
style={Object.assign({}, item.complete && styles.complete, item.due && styles.due )}>
Tùy biến và tái sử dụng
Bây giờ chúng tôi đang sử dụng Object.assign
nó trở nên rất đơn giản để làm cho thành phần của chúng tôi có thể tái sử dụng với các kiểu khác nhau. Nếu chúng ta muốn ghi đè các kiểu mặc định, chúng ta có thể làm như vậy tại trang gọi với đạo cụ, như vậy : <TodoItem dueStyle={ fontWeight: "bold" } />
. Thực hiện như thế này:
<li 'todo-list__item'
style={Object.assign({},
item.due && styles.due,
item.due && this.props.dueStyles)}>
Bố trí
Cá nhân, tôi không thấy lý do thuyết phục cho các kiểu bố cục nội tuyến. Có một số hệ thống bố trí CSS tuyệt vời ngoài kia. Tôi chỉ sử dụng một.
Điều đó nói rằng, không thêm kiểu bố trí trực tiếp vào thành phần của bạn. Bọc các thành phần của bạn với các thành phần bố trí. Đây là một ví dụ.
// This couples your component to the layout system
// It reduces the reusability of your component
<UserBadge
className="col-xs-12 col-sm-6 col-md-8"
firstName="Michael"
lastName="Chan" />
// This is much easier to maintain and change
<div class="col-xs-12 col-sm-6 col-md-8">
<UserBadge
firstName="Michael"
lastName="Chan" />
</div>
Để hỗ trợ bố trí, tôi thường cố gắng thiết kế các thành phần được 100%
width
và height
.
Xuất hiện
Đây là khu vực gây tranh cãi nhất trong cuộc tranh luận "kiểu nội tuyến". Cuối cùng, tùy thuộc vào thành phần thiết kế của bạn và sự thoải mái của nhóm với JavaScript.
Một điều chắc chắn, bạn sẽ cần sự trợ giúp của thư viện. Các trạng thái trình duyệt ( :hover
, :focus
) và truy vấn phương tiện rất đau trong React thô.
Tôi thích Radium vì cú pháp cho các phần cứng đó được thiết kế để mô hình hóa SASS.
Mã tổ chức
Thường thì bạn sẽ thấy một đối tượng kiểu bên ngoài mô-đun. Đối với thành phần danh sách việc cần làm, nó có thể trông giống như thế này:
var styles = {
root: {
display: "block"
},
item: {
color: "black"
complete: {
textDecoration: "line-through"
},
due: {
color: "red"
}
},
}
chức năng getter
Thêm một loạt logic kiểu vào mẫu của bạn có thể có một chút lộn xộn (như đã thấy ở trên). Tôi thích tạo các hàm getter để tính toán các kiểu:
React.createClass({
getStyles: function () {
return Object.assign(
{},
item.props.complete && styles.complete,
item.props.due && styles.due,
item.props.due && this.props.dueStyles
);
},
render: function () {
return <li style={this.getStyles()}>{this.props.item}</li>
}
});
Xem thêm
Tôi đã thảo luận tất cả những điều này một cách chi tiết hơn tại React Europe vào đầu năm nay: Kiểu nội tuyến và khi tốt nhất là 'chỉ sử dụng CSS' .
Tôi rất vui khi được giúp đỡ khi bạn thực hiện những khám phá mới trên đường đi :) Hãy đánh tôi lên -> @chantastic