React bootstrap没有样式化我的反应组件

Ric*_*d G 8 reactjs webpack-2

刚开始使用React昨天设置了一个演示应用程序.环境是:

  1. 打字稿
  2. 的WebPack
  3. 反应和反应DOM

我正在尝试设置Bootstrap样式.

我遵循了本教程,但修改它以适应Typescript:

https://medium.com/@victorleungtw/how-to-use-webpack-with-react-and-bootstrap-b94d33765970

一切正常,页面显示登录表单,Bootstrap HTMl由React-Bootstrap输出.但是样式不适用于元素,它只是一个纯HTML页面,没有应用任何Bootstrap样式.我不确定配置中缺少的是什么:

webpack.config.js

我已经在教程中提到的npm添加了加载器,但也调整了从css设置Typescript模块.

module.exports = {
    entry: {
        catalog: "./src/apps/CatalogApp.tsx",
        auth: "./src/apps/AuthApp.tsx"
    },
    output: {
        filename: "[name].bundle.js",
        publicPath: "/build/",
        path: __dirname + "/dist"
    },

    // Enable sourcemaps for debugging webpack's output.
    devtool: "source-map",

    resolve: {
        // Add '.ts' and '.tsx' as resolvable extensions.
        extensions: [".ts", ".tsx", ".js", ".json"]
    },

    module: {
        rules: [
            // All files with a '.ts' or '.tsx' extension will be handled by 'awesome-typescript-loader'.
            {
                test: /\.tsx?$/,
                loader: "awesome-typescript-loader"
            },

            // All output '.js' files will have any sourcemaps re-processed by 'source-map-loader'.
            {
                enforce: "pre",
                test: /\.js$/,
                loader: "source-map-loader"
            },

            // css loader
            {
                test: /\.css$/,
                loader: "typings-for-css-modules-loader?modules"
            },

            {
                test: /\.(woff|woff2)(\?v=\d+\.\d+\.\d+)?$/, 
                loader: 'url-loader?limit=10000&mimetype=application/font-woff'
              },
              {
                test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, 
                loader: 'url-loader?limit=10000&mimetype=application/octet-stream'
              },
              {
                test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, 
                loader: 'file-loader'
              },
              {
                test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, 
                loader: 'url-loader?limit=10000&mimetype=image/svg+xml'
              }
        ]
    },

    // When importing a module whose path matches one of the following, just
    // assume a corresponding global variable exists and use that instead.
    // This is important because it allows us to avoid bundling all of our
    // dependencies, which allows browsers to cache those libraries between builds.
    externals: {
        "react": "React",
        "react-dom": "ReactDOM"
    }
};
Run Code Online (Sandbox Code Playgroud)

AuthApp.tsx

这是我的应用程序入口点.

import * as React from "react";
import * as ReactDOM from "react-dom";

import { SigninForm } from "../components/users/SigninForm";
import { MiniCart } from '../components/cart/MiniCart';
import { UserMenu } from '../components/users/UserMenu';
import * as bs from 'bootstrap/dist/css/bootstrap.css';
import * as bst from 'bootstrap/dist/css/bootstrap-theme.css';

if (document.getElementById("signin-form")) {
    ReactDOM.render(
        <SigninForm />,
        document.getElementById("signin-form")
    );
}

if (document.getElementById('cart')) {
    ReactDOM.render(
        <MiniCart />,
        document.getElementById('cart')
    );
}

if (document.getElementById('user-menu')) {
    ReactDOM.render(
        <UserMenu />,
        document.getElementById('user-menu')
    );
}
Run Code Online (Sandbox Code Playgroud)

SigninForm.tsx

以及登录表单的相关UI.

import * as React from 'react';
import * as ReactDOM from "react-dom";
import { Button, Col, Row } from 'react-bootstrap';

import { Spinner } from '../shared/Spinner';

interface SigninFormProps {
}

interface SigninFormState {
  email: string;
  password: string;
}

export class SigninForm extends React.Component<SigninFormProps, SigninFormState> {

  constructor(props: SigninFormProps) {
    super(props);
    this.state = {
      email: '',
      password: ''
    };
    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleChange(event: any) {
    this.setState({ [event.target.name]: event.target.value });
  }

  handleSubmit(event: any) {
    event.preventDefault();
    console.log('Submitting form', this.state);
  }

  render() {
    return (
      <Row>
        <Col md={8}>
          <form className="signin-form" onSubmit={this.handleSubmit}>
            <div className="form-group">
              <label htmlFor="email">Email</label>
              <input id="email" name="email" type="email" value={this.state.email} onChange={this.handleChange} />
            </div>
            <div className="form-group">
              <label htmlFor="password">Password</label>
              <input id="password" name="password" type="password" value={this.state.password} onChange={this.handleChange} />
            </div>
            <Button>Submit</Button>
          </form>
        </Col>
        <Col md={4}>
          Right Side
      </Col>
      </Row>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

小智 23

首先你需要的是 使用 NPM 安装 Bootstrap

npm install --save bootstrap
Run Code Online (Sandbox Code Playgroud)

然后

去写这个语句,你必须在哪个组件中使用 bootstrap,这在我的情况下有效。

import 'bootstrap/dist/css/bootstrap.css';
Run Code Online (Sandbox Code Playgroud)

CSS 样式将开始工作。:)

快乐编码!

  • 导入'bootstrap/dist/css/bootstrap.css'; 对我有用.. (3认同)

小智 13

我遇到了同样的问题,这对我有用 - >

我最后用npm安装bootstrap:

  • 1) npm i --save bootstrap

然后,在index.js(我渲染App.js)中,我从nodes_modules导入了bootstrap的缩小的css文件,如下所示:

  • 2) import '../node_modules/bootstrap/dist/css/bootstrap.min.css';

现在,响应式定位正在发挥作用(之前我看到了react-bootstrap渲染正确的类名,但没有样式).

注意:https://react-bootstrap.github.io/getting-started/introduction说你应该把css添加到头部index.html.我没有成功这样做.


csa*_*ong 8

不确定此时是否相关,我查看了您的帖子。但是我可以使用 react-bootstrap,根据react-bootstrap,您必须添加“ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous" />

我将其添加到我的 index.html 标头标签中。

而且我还添加import "react-bootstrap/dist/react-bootstrap.min.js";了我的 app.js。


Sed*_*iwa 8

您使用的是节点 v16.15.0 及更高版本吗?

执行以下任一操作:

  1. 用纱线?跑步-yarn add react-bootstrap bootstrap
  2. 使用 npm?跑步-npm install react-bootstrap bootstrap

然后在您的 App.js 中添加这一行 -import 'bootstrap/dist/css/bootstrap.css';

然后重新启动您的反应应用程序。之后应该可以工作。


Che*_*Tai 7

你使用的webpack config 和medium 文章有点不同。

在中篇文章中,作者使用style-loadercss-loader来处理css文件。

module.exports = {
  entry: './main.js',
  output: { path: __dirname, filename: 'bundle.js' },
  module: {
    loaders: [
      ...
      { 
        test: /\.css$/, 
        loader: "style-loader!css-loader" 
      },
      ...
    ]
  },
};
Run Code Online (Sandbox Code Playgroud)

style-loader将注入 css 代码进行<style/>标记。所以这就是教程起作用的原因

在你的 webpack 配置中,你typings-for-css-modules-loader用来加载 css。使用此加载器,您需要将 css 类变量名称传递给className.

这意味着您应该编写如下代码(简化一些代码):

import * as React from "react";
import * as bs from 'bootstrap/dist/css/bootstrap.css';
import * as bst from 'bootstrap/dist/css/bootstrap-theme.css';

import { Button, Col, Row } from 'react-bootstrap';

import { Spinner } from '../shared/Spinner';

export class SigninForm extends React.Component {
  ...
  render() {
    return (
      <Row>
        <Col md={8}>
          <form className={bt["signin-form"]} onSubmit={this.handleSubmit}>
            <div className={bt["form-group"]}>
              <label htmlFor="email">Email</label>
              <input id="email" name="email" type="email" value={this.state.email} onChange={this.handleChange} />
            </div>
            <Button>Submit</Button>
          </form>
        </Col>
        <Col md={4}>
          Right Side
      </Col>
      </Row>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

通过bt[classname]className

我认为它会起作用。

顺便说一句,我找到了另一篇使用typings-for-css-modules-loader-> link 的中等文章。


Ano*_*oop 7

请尝试在index.js中添加这一行

import 'bootstrap/dist/css/bootstrap.min.css';

将其添加到App.js文件对我来说不起作用


小智 5

App.css刚粘贴以下导入:

@import "bootstrap/dist/css/bootstrap.css";
Run Code Online (Sandbox Code Playgroud)