Thứ tư, 09/05/2018 | 00:00 GMT+7

Tạo kiểu cho các thành phần React bằng cách sử dụng quyến rũ


💄 quyến rũ là một thư viện nhẹ cho CSS-in-JS với một API đơn giản đó là tương tự như kiểu-linh kiện và làm cho việc sử dụng sự quyến rũ dưới mui xe. Hai trong số những điểm khác biệt chính so với các thành phần theo kiểu là việc sử dụng các ký tự đối tượng JavaScript và một API bổ sung cho phép sử dụng trực tiếp các phần tử DOM mà không cần tạo thêm các thành phần được đặt tên.

Hãy xem qua cách sử dụng glam để tạo phong cách cho các thành phần của ta .

Cài đặt

Để bắt đầu, bạn cần một vài gói: quyến rũ , quyến rũcác loại chống đỡ :

$ npm install glamorous glamor prop-types

# or, using Yarn
$ yarn add glamorous glamor prop-types

Sau đó, tất cả những gì bạn phải làm để bắt đầu sử dụng nó là nhập file xuất mặc định từ thư viện:

SomeComponent.js
import glamorous from 'glamorous';

// ...

Cách sử dụng cơ bản

Bạn tạo một thành phần quyến rũ và tạo cho nó một số phong cách bằng cách sử dụng tên của bất kỳ phần tử DOM nào và cung cấp một đối tượng theo nghĩa đen với tên thuộc tính CSS (vỏ camel) và các giá trị:

import React from 'react';
import glamorous from 'glamorous';

const Box = glamorous.div({
  background: 'pink',
  marginTop: 30, // defaults to pixels
  padding: '2rem 3rem'
});

const MyComponent = () => {
  return (
    <Box>
      <h1>A title inside a pink box! 🌸</h1>
    </Box>
  );
};

export default MyComponent;

Đạo cụ

Bạn có thể truy cập các đạo cụ được truyền vào một thành phần quyến rũ bằng cách sử dụng hàm gọi lại làm đối số thứ hai khi tạo thành phần:

import React from 'react';
import glamorous from 'glamorous';

const Box = glamorous.div(
  {
    marginTop: 30, // defaults to pixels
    padding: '2rem 3rem'
  },
  props => ({
    background: props.bg
  })
);

const MyComponent = () => {
  return (
    <Box bg="purple">
      <h1>A title inside a purple box! 🌸</h1>
    </Box>
  );
};

export default MyComponent;

Media query , phần tử giả & lớp giả

Các media query bằng cách sử dụng quyến rũ thực sự dễ dàng:

// ...

const Box = glamorous.div({
  maxWidth: '60%',
  background: 'antiquewhite',
  margin: '1rem auto',
  padding: '2rem 3rem',
  ['@media (max-width: 600px)']: {
    maxWidth: '90%',
    background: 'lightseagreen'
  }
});

// ...

Và tương tự như vậy đối với phần tử giả và lớp giả :

// ...

const Box = glamorous.div({
  maxWidth: '60%',
  background: 'antiquewhite',
  margin: '1rem auto',
  padding: '2rem 3rem',
  transition: 'background .3s',
  [':hover']: {
    background: 'lightseagreen'
  },
  [':before']: {
    content: '"Hello"',
    background: 'pink',
    padding: '.5rem 1rem'
  }
});

// ...

Lưu ý việc sử dụng dấu ngoặc kép bên trong dấu nháy đơn cho phần tử : before pseudo-element. Cú pháp đó rất quan trọng để phần tử giả hoạt động chính xác.

Sử dụng thay thế

Đối với các thành phần đơn giản hơn và nhỏ hơn, bạn cũng có thể sử dụng một API thay thế để nhập các thành phần tương ứng với một phần tử DOM cụ thể và sử dụng chúng trực tiếp. Bằng cách này, bạn tránh phải nghĩ ra một loạt các tên cho các thành phần quyến rũ của bạn :

import React from 'react';
import { Div, H1 } from 'glamorous';

const MyComponent = () => {
  return (
    <Div background="antiquewhite" margin="1rem auto" maxWidth="60%">
      <H1 className="card-title" borderBottom="2px solid purple">
        A title inside an antique white box! 🌸
      </H1>
    </Div>
  );
};
import React, { Component } from 'react';
import { ThemeProvider } from 'glamorous';

import Card from './Card';

const theme = {
  default: {
    background: '#f3f3f3',
    color: '#525252'
  },
  dark: {
    background: '#231919',
    color: '#FFDABC'
  }
};

class App extends Component {
  state = {
    currentTheme: 'default'
  };

  handleClick = () => {
    this.setState(state => ({
      currentTheme: state.currentTheme === 'default' ? 'dark' : 'default'
    }));
  };

  render() {
    const currentTheme = this.state.currentTheme;

    return (
      <ThemeProvider theme={theme[currentTheme]}>
        <React.Fragment>
          <Card />
          <Card />
          <button onClick={this.handleClick}>Toggle theme</button>
        </React.Fragment>
      </ThemeProvider>
    );
  }
}

export default App;

Trình xử lý onClick của lựa chọn đổi giữa hai chủ đề của ta và các thành phần con của ThemeProvider sẽ tự động có quyền truy cập vào dữ liệu chủ đề.

Bạn có thể truy cập chủ đề từ các đạo cụ được truyền vào lệnh gọi lại khi tạo một thành phần quyến rũ:

Card.js
import React from 'react';
import glamorous from 'glamorous';

const Box = glamorous.div(
  {
    maxWidth: '60%',
    margin: '1rem auto',
    padding: '2rem 3rem'
  },
  ({ theme }) => ({
    background: theme.background,
    color: theme.color
  })
);

const MyComponent = () => {
  return (
    <Box>
      <h1>A title inside a pink box! 🌸</h1>
    </Box>
  );
};

export default MyComponent;

Tạo kiểu global

quyến rũ không bận tâm đến phong cách global và thay vào đó bạn có thể hoàn nguyên về css.global của quyến rũ để đưa một số phong cách global vào ứng dụng của bạn :

App.js
// ...other imports
import { css } from 'glamor';

css.global('html, body', {
  background: '#f3f3f3',
  margin: 0
});

// ...

🤓 Và đó là phần giới thiệu nhỏ của ta trở nên hấp dẫn. Tham khảo tài liệu chính thức để biết các trường hợp sử dụng nâng cao hơn.


Tags:

Các tin liên quan