iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
1
自我挑戰組

30 天來點 Design System系列 第 10

Day 10 實作 Button 與切換樣式

  • 分享至 

  • xImage
  •  

建立在 Styled Jss 下,開始來建立我們組件吧。

目前有三個樣式,filled, outline, text。我們將透過切換 type 的方式來實作,以下是上次的組件範例,接下來我們要開始擴充:

原本程式碼如下:

const Button = styled('input')(({theme}) => ({
    paddingTop: theme.getSpacing(1),
    paddingLeft: theme.getSpacing(2),
    paddingRight: theme.getSpacing(2),
    paddingBottom: theme.getSpacing(1),
    marginTop: theme.getSpacing(2),
    backgroundColor: theme.colors.primary,
}));

Button.propTypes = {
  value: propTypes.string,
  onClick: propTypes.func,
};

Button.defaultProps = {
  value: "",
  onClick: () => false,
};

export default Button;

利用 Stlyed jss 切出三種樣式

import styled from 'styled-jss'
import propTypes from "prop-types";

// 基本樣式
const basicStyle = (theme) => ({
  border: 'none',
  outline: 'none',
  borderRadius: theme.radius,
  paddingTop: theme.getSpacing(1),
  paddingLeft: theme.getSpacing(2),
  paddingRight: theme.getSpacing(2),
  paddingBottom: theme.getSpacing(1),
});

const textStyle = (theme) => ({
  color: theme.colors.primary,
  backgroundColor: theme.colors.transparent,
});

const filledStyle = (theme) => ({
  color: theme.colors.white,
  backgroundColor: theme.colors.primary,
});

const outlineStyle = (theme) => ({
  color: theme.colors.primary,
  border: `1px solid ${theme.colors.primary}`,
  backgroundColor: theme.colors.transparent,
});

const switchTheme = (theme, type) => {
  switch (type) {
    case 'outline':
      return outlineStyle(theme);
    case 'text':
      return textStyle(theme);
    case 'filled':
    default:
      return filledStyle(theme);
  }
}

// 傳入 style 讓使用者客製化
const Button = styled('button')(({ theme, type, style }) => ({
  ...basicStyle(theme),
  ...switchTheme(theme, type),
  ...style,
}));

Button.propTypes = {
  value: propTypes.string,
  onClick: propTypes.func,
  style: propTypes.object,
  type: propTypes.oneOfType(['filled', 'outline', 'text']),
};

Button.defaultProps = {
  value: "",
  type: 'filled',
  style: {},
  onClick: () => false,
};

export default Button;

使用方式

import React, { Fragment } from 'react';
import './App.css';
import theme from './lib/theme';
import Button from './lib/Button';
import { ThemeProvider } from 'styled-jss';

const styles = {
  button: {
    marginRight: 8
  }
}

function App() {
  return (
    <div className="App">
      <ThemeProvider theme={theme}>
        <Fragment>
          <Button type='filled' style={styles.button}>Filled Button</Button>
          <Button type='outline' style={styles.button}>Outline Button</Button>
          <Button type='text' style={styles.button}>Text Button</Button>
        </Fragment>
      </ThemeProvider>
    </div>
  );
}

export default App;

成果如下圖:

小結

利用 Styled jss 來切分組件感覺可以分得滿乾淨的,之後會開始一步一步實作所以的組件。


上一篇
Day 09 選擇使用 React-jss 或是 Styled-jss
下一篇
Day 11 建立 Storybook
系列文
30 天來點 Design System30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言