twin.macro实现分页控件样式

twin.macro实现分页控件样式

【免费下载链接】twin.macro 🦹‍♂️ Twin blends the magic of Tailwind with the flexibility of css-in-js (emotion, styled-components, solid-styled-components, stitches and goober) at build time. 【免费下载链接】twin.macro 项目地址: https://gitcode.com/gh_mirrors/tw/twin.macro

你还在为前端分页控件的样式一致性和响应式适配烦恼吗?使用twin.macro(宏命令)可以完美结合Tailwind CSS的工具类便捷性与css-in-js的灵活扩展性,快速构建专业级分页组件。本文将通过实战案例,带你掌握从环境配置到交互实现的完整流程,最终得到一个支持hover状态、响应式布局且代码可维护的分页控件。

技术原理与优势

twin.macro是一个构建时工具,它能将Tailwind CSS的类名转换为css-in-js(CSS-in-JavaScript)对象,从而同时享受原子化CSS的开发效率和CSS-in-JS的组件封装能力。其核心优势在于:

  • 零运行时开销:编译阶段完成样式转换,不增加客户端负担
  • 无缝集成:支持emotion、styled-components等主流css-in-js库
  • 灵活扩展:通过自定义配置实现项目主题定制

工作流程如下:

mermaid

环境准备与基础配置

安装依赖

首先确保项目中已安装twin.macro及相关依赖:

npm install twin.macro tailwindcss @emotion/react @emotion/styled

核心依赖文件:

配置Tailwind

创建基础配置文件tailwind.config.js,定义分页控件所需的颜色和间距:

// tailwind.config.js
module.exports = {
  theme: {
    extend: {
      colors: {
        primary: '#3b82f6',
        secondary: '#64748b',
        neutral: '#f1f5f9'
      },
      spacing: {
        'pagination': '0.25rem'
      }
    }
  }
}

配置文件规范可参考官方文档:docs/customizing-config.md

分页控件实现步骤

基础结构设计

分页控件通常包含页码按钮、前后页导航和当前页高亮状态。使用React函数组件构建基础结构:

// Pagination.tsx
import tw from 'twin.macro'

const Pagination = ({ 
  currentPage, 
  totalPages, 
  onPageChange 
}) => {
  // 生成页码数组逻辑省略...
  
  return (
    <nav css={styles.container}>
      <button css={styles.button} onClick={() => onPageChange(currentPage - 1)}>
        上一页
      </button>
      
      {pageNumbers.map(page => (
        <button
          key={page}
          css={[styles.button, currentPage === page && styles.activeButton]}
          onClick={() => onPageChange(page)}
        >
          {page}
        </button>
      ))}
      
      <button css={styles.button} onClick={() => onPageChange(currentPage + 1)}>
        下一页
      </button>
    </nav>
  )
}

样式实现方案

采用twin.macro的tw标记模板字面量定义样式,结合prop-styling-guide最佳实践:

// 提取样式到单独对象
const styles = {
  container: tw`flex items-center gap-pagination`,
  button: tw`
    px-3 py-1.5 rounded border 
    text-secondary hover:bg-neutral 
    transition-colors duration-200
  `,
  activeButton: tw`
    bg-primary text-white border-primary
    hover:bg-primary/90
  `
}

这段代码利用了twin.macro的变体组合特性,通过空格分隔类名实现多状态样式定义。

响应式适配

使用twin.macro的screen导入实现不同屏幕尺寸的布局调整:

import { screen } from 'twin.macro'

const styles = {
  container: [
    tw`flex items-center gap-pagination`,
    screen`sm`(tw`justify-center`), // 小屏设备居中显示
    screen`lg`(tw`justify-end`)    // 大屏设备右对齐
  ],
  // 其他样式...
}

screen导入会自动同步Tailwind配置中的断点值,确保样式一致性。

交互状态处理

添加禁用状态和加载状态的条件样式,参考twin.macro条件样式指南

const Pagination = ({ 
  currentPage, 
  totalPages, 
  onPageChange,
  isLoading 
}) => {
  return (
    <nav css={styles.container}>
      <button 
        css={[
          styles.button,
          currentPage === 1 && tw`opacity-50 cursor-not-allowed`,
          isLoading && tw`pointer-events-none`
        ]}
        onClick={() => onPageChange(currentPage - 1)}
        disabled={currentPage === 1 || isLoading}
      >
        上一页
      </button>
      {/* 页码按钮组 */}
    </nav>
  )
}

完整代码与效果

最终实现代码

// Pagination.tsx
import tw, { screen } from 'twin.macro'

const styles = {
  container: [
    tw`flex items-center gap-pagination`,
    screen`sm`(tw`justify-center`),
    screen`lg`(tw`justify-end`)
  ],
  button: tw`
    px-3 py-1.5 rounded border text-secondary 
    hover:bg-neutral transition-colors duration-200
    disabled:opacity-50 disabled:cursor-not-allowed
  `,
  activeButton: tw`
    bg-primary text-white border-primary
    hover:bg-primary/90
  `,
  ellipsis: tw`px-2 text-secondary`
}

const Pagination = ({ 
  currentPage, 
  totalPages, 
  onPageChange,
  isLoading = false 
}) => {
  // 生成显示页码范围(省略逻辑)
  const pageNumbers = [1, 2, currentPage, totalPages - 1, totalPages]
  
  return (
    <nav css={styles.container}>
      <button 
        css={styles.button}
        onClick={() => onPageChange(currentPage - 1)}
        disabled={currentPage === 1 || isLoading}
      >
        上一页
      </button>
      
      {pageNumbers.map((page, index) => (
        <React.Fragment key={page}>
          {index > 0 && tw`mx-1`}
          {page === '...' ? (
            <span css={styles.ellipsis}>...</span>
          ) : (
            <button
              css={[styles.button, currentPage === page && styles.activeButton]}
              onClick={() => onPageChange(page)}
              disabled={isLoading}
            >
              {page}
            </button>
          )}
        </React.Fragment>
      ))}
      
      <button 
        css={styles.button}
        onClick={() => onPageChange(currentPage + 1)}
        disabled={currentPage === totalPages || isLoading}
      >
        下一页
      </button>
    </nav>
  )
}

export default Pagination

关键样式说明

  • 状态管理:通过activeButton样式实现当前页高亮,利用Tailwind的disabled:变体处理禁用状态
  • 响应式设计:使用screen宏实现不同断点的布局调整,参考屏幕适配文档
  • 交互反馈:添加transition-colors实现颜色平滑过渡,提升用户体验

扩展功能与最佳实践

高级主题定制

通过twin.macro主题导入功能,可以实现动态主题切换:

import { theme } from 'twin.macro'

const dynamicStyles = {
  button: tw`border ${theme`colors.primary`}`
}

主题定制详细方法可参考:docs/advanced-theming.md

性能优化建议

  1. 组件拆分:将页码按钮拆分为独立组件src/macro/styled.ts
  2. 样式缓存:使用memo缓存静态样式对象
  3. 按需渲染:仅显示当前页附近的页码,减少DOM节点

测试与验证

分页控件测试案例可参考项目测试模板:tests/fixtures/configTS/configTS.tsx,建议覆盖以下场景:

  • 边界情况:第一页/最后一页的禁用状态
  • 交互测试:页码点击和页码变更回调
  • 响应式测试:不同屏幕尺寸下的布局变化

总结与资源

通过twin.macro实现分页控件,我们既获得了Tailwind CSS的开发效率,又保留了CSS-in-JS的组件化优势。关键要点包括:

更多高级用法可参考:

建议将分页组件封装到UI组件库中,结合自定义配置实现项目风格统一。如需进一步优化,可探索twin.macro性能优化指南中的高级配置项。


<footer>
  本文示例代码已同步至项目仓库:<项目路径>gh_mirrors/tw/twin.macro</项目路径>
</footer>

【免费下载链接】twin.macro 🦹‍♂️ Twin blends the magic of Tailwind with the flexibility of css-in-js (emotion, styled-components, solid-styled-components, stitches and goober) at build time. 【免费下载链接】twin.macro 项目地址: https://gitcode.com/gh_mirrors/tw/twin.macro

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值