使用styled-components开发组件库时如何配置全局公共样式
解答
结论
不需要为每个组件手动添加公共样式,针对组件库场景有两种更简便的实现方案,你可以根据是否要污染用户全局样式选择。
方案1:组件隔离型(组件库推荐)
该方案只会让reset样式作用于你组件库自身的组件,完全不会影响组件库使用者项目中的其他元素,是最适配组件库开发的方案。
实现逻辑是封装一个自带reset样式的styled工厂函数,后续所有组件都用这个封装后的函数创建即可,无需重复引入reset:
import styled, { css } from 'styled-components'; // 公共reset样式片段 const resetCss = css` box-sizing: border-box; outline: 0; margin: 0; padding: 0; border: 0; `; // 封装带默认reset的styled生成器 const styledWithReset = (tag) => { return (...args) => styled(tag)` ${resetCss} ${args} `; }; // 后续所有组件都用styledWithReset创建,不需要再手动加reset const RealButton = styledWithReset.button` /* 仅写组件自身的业务样式即可 */ background: #1677ff; color: #fff; padding: 6px 16px; border-radius: 4px; `;
如果你需要让reset覆盖组件内部的所有后代元素,可以把resetCss调整为:
const resetCss = css` *, *::before, *::after { box-sizing: border-box; outline: 0; margin: 0; padding: 0; border: 0; } `;
方案2:全局注入型
如果你可以接受reset样式注入到组件库使用者的全局环境,或者你的组件库本身就要求用户全局引入基础样式,可以用styled-components官方提供的createGlobalStyle实现:
- 首先在你的组件库中导出全局样式组件:
import { createGlobalStyle } from 'styled-components'; export const MyComponentLibGlobalStyle = createGlobalStyle` * { box-sizing: border-box; outline: 0; margin: 0; padding: 0; border: 0; } `;
- 要求组件库使用者在项目入口根组件处引入一次该组件即可,所有元素都会自动应用reset样式,不需要每个组件单独配置。
该方案的缺点是全局样式可能和用户自己的reset规则冲突,需要在组件库文档中明确说明。
内容的提问来源于stack exchange,提问作者Elase Huang
相关产品推荐
相关产品推荐

