如何在 create-react-app 中自定义 blueprintjs 外观

Posted

技术标签:

【中文标题】如何在 create-react-app 中自定义 blueprintjs 外观【英文标题】:how to customize blueprintjs appearance in create-react-app 【发布时间】:2018-02-22 07:18:59 【问题描述】:

我是新手,我使用以下代码构建我的应用程序:

create-react-app applicationame --scripts-version=react-scripts-ts

我不使用 webpack,因为 create-react-app 为我完成了所有工作,我认为这很好!

当然,我需要一个用于智能组件的工具箱。感谢 Palantir 免费提供这么好的库。 Blueprintjs 与 React/Typescript 配合得很好,[即使许多类仍未在 typescript 中创建(例如:我必须将 用于“pt-breadcrumbs”,而为“pt-breadcrumb”提供类 Breadcrumb)。但除此之外,工具箱还可以。]

现在我想自定义应用程序的外观和感觉,以满足客户的约束:

背景和文字颜色 圆角与否 字体系列和大小 图标列表 组件的填充 转换延迟 等

我在任何地方都找不到自定义所有这些的文档。 (在 github 中查看文档,在 *** 中进行大量谷歌搜索)

我应该在我的项目中添加一个 css 文件并覆盖 blueprintjs 类吗? 我可以在我的项目之外编写一个“主题”,并将其复制到一些不同的项目中吗? (就像我以前对 jqueryui 所做的那样) 我可以在不使用 webpack 的情况下做到这一点吗? (我觉得这个工具太复杂了)

感谢您的帮助。

【问题讨论】:

我尝试将 node_modules/testlib-blueprint/node_modules/@blueprintjs/core/src 复制到项目的 src/theme 并让 IntelliJ 使用文件监视器编译 scss,但我有很多我无法解决的错误。任何想法将不胜感激。 【参考方案1】:

我正在评估公司标准化 React 组件库的蓝图,我们可以让开发人员使用通用的外观和感觉。蓝图可让您对组件的某些视觉元素进行样式设置,但(有意)在不覆盖全局标准样式表的情况下(有意地)无法让您完全控制(这是其他答案本质上所暗示的)。我建议您使用公开的 SASS/LESS 变量。这是一种不使用 webpack 或弹出 create-react-app 项目的方法。

注意:这是针对 Blueprint v2 的,我使用的是 react-app-rewired 和 SASS

npm install node-sass-chokidar 和 node-sass-tilde-importer(第一个将预处理您的 SASS 文件,您需要第二个,因为 Blueprint 对 webpack 使用的导入使用“~”约定,但默认的 node-sass 不支持)

为你的包添加一个“build-css”脚本引用,看起来与此类似(它告诉 node-sass-chokidar 使用 tilde-importer 包):

"build-css": "node-sass-chokidar --importer=node_modules/node-sass-tilde-importer --include-path ./src --include-path ./node_modules src/ -o src/"

将 SASS 文件(如 App.scss)添加到上面引用的位置 (src/):

`

// override the blueprint default variable values first
$pt-intent-danger:  #ff3d00;
$pt-intent-primary: #076461;

// then pull in top-level blueprint sass file (it imports all the sub-files)
@import "@blueprintjs/core/src/blueprint.scss";

// add custom variables (optional)
$sassy-text: #ff3d7f;
$sassy-background: #c2a34f;

//add your own custom styles (optional)
.sassy-hello 
   color:$sassy-text;
   background:$sassy-background;
   padding: 5px;

运行您的构建 css 脚本:

npm run build-css

注意 node-sass-chokidar 文件观察器和一些编辑器存在一个已知问题。它非常轻巧且快速;如果您的编辑器在更新的 .scss 文件上锁定了片刻(如 VS Code),则自动构建脚本将失败。只需运行上面的手动构建步骤,手表触发的重建就会正常工作。

参考(或查看)您生成的 .css 文件。它将是蓝图 css 文件和您的自定义项的组合。可以在html中正常引用:

<link href="App.css" rel="stylesheet" />

或在您的代码中:

import './App.css';

然后根据需要使用它:

<h1 className="sassy-hello">Hey, Good-Looking!</h1>

您始终可以添加自定义样式表来覆盖或补充核心样式,但是如果您尝试在蓝图之上构建自己的一致主题,我认为这是要走的路。您还可以根据需要/要求内联或 CSS-to-JS 您的样式。

【讨论】:

步骤很多!对于 blueprintJs3,我只需要:1) 安装 node-saas:npm install node-sass --save 2) 导入 blueprint 的 SASS 文件:@import "~@blueprintjs/core/src/blueprint.scss"; 它可以工作! @Kiruahxh 是对的!如果您使用 Gatsby,请按照gatsbyjs.com/docs/sass/#installing-and-configuring-sass 设置 saas 编译器,然后创建您自己的 saas 文件来修改 Blueprint 的样式。【参考方案2】:

所以最简单的方法是通过React's Component Styles 传递您的自定义样式。

假设我们要更改 <Button> 组件中文本的字体大小和颜色。

我们首先声明我们的风格:

const buttonStyle = 
 fontSize: '30pt',
 color: 'pink',
 height: '40pt'

然后在 React 类中 render() 将新样式传递给您的 <Button> 组件:

<Button className="pt-intent-primary" text="My button" style=buttonStyle/>

【讨论】:

感谢 Shahzeb,我知道这是一种可能性。同时,这是 javascript 代码。如果我想构建一个可以从一个项目复制到另一个项目的主题,我不能使用这种方式。如果我可以在项目中添加一个 css,那么我可以将这个 css 复制到其他项目中。使用 css 文件,我只能用 !important 覆盖 Blueprint css,这并不完美...... 如果您想要应用style.css 文件并希望它覆盖Blueprint 的一些css,那么您想使用&lt;link rel... 在index.html 函数中链接到您的样式表。然后使用它们的className 引用各种元素以更改它们的样式。【参考方案3】:

我建议在(即 myTheme.css)中创建您自己的主题。

.pt-myTheme 
  .pt-navbar 
    background-color: #2364f0;
  

在 React 中直接将其添加到蓝图组件中:

render() 
  <Navbar className="pt-myTheme"></Navbar>

或者到您的应用根目录中的容器:

render() 
  <div className="container pt-myTheme">
    <Navbar>
      ...
    </Navbar>
  </div>

【讨论】:

以上是关于如何在 create-react-app 中自定义 blueprintjs 外观的主要内容,如果未能解决你的问题,请参考以下文章

如何在 BlackBerry 中自定义 ListField?

如何在Android中自定义动画

如何在 Qt 中自定义列表视图

如何在 JavaScript 中自定义警报?

如何在 Flutter 中自定义 Slider 小部件?

如何在BlackBerry中自定义ListField?