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

时间:2017-11-17 15:51:26

标签: reactjs webpack-2

昨天刚刚开始使用React,因此设置了一个演示应用。环境是:

  1. 打字稿
  2. 的WebPack
  3. 反应&反应DOM
  4. 我正在尝试设置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"
        }
    };
    

    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')
        );
    }
    

    SigninForm.tsx

    登录表格的相关用户界面。

    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>
        );
      }
    }
    

6 个答案:

答案 0 :(得分:9)

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

我最终使用npm安装了引导程序:

  • 1)g++ ... linker_flags ... -xc++ -

然后,在npm i --save bootstrap中(我渲染App.js的地方),我从nodes_modules导入了引导程序的缩小的css文件,如下所示:

  • 2)index.js

现在,响应式定位正在工作(就像之前看到import '../node_modules/bootstrap/dist/css/bootstrap.min.css';渲染正确的类名,但没有样式一样)。

注意:https://react-bootstrap.github.io/getting-started/introduction说您应该将CSS添加到react-bootstrap的开头。我这样做没有成功。

答案 1 :(得分:4)

App.css 处只需粘贴以下导入:

@import "bootstrap/dist/css/bootstrap.css";

答案 2 :(得分:2)

您使用的webpack配置与媒体文章略有不同。

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

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

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>
    );
  }
}

bt[classname]传递给className

我认为它会奏效。

顺便说一句,我发现另一篇使用typings-for-css-modules-loader的中篇文章 - &gt; link

答案 3 :(得分:1)

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

我添加到我的index.html标头标记中的

我还在我的app.js中添加了import "react-bootstrap/dist/react-bootstrap.min.js";

答案 4 :(得分:0)

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

npm install --save bootstrap

然后

开始 在必须使用引导程序的组件中编写此语句,在我的情况下有效。

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

CSS样式将开始工作。 :)

快乐编码!

答案 5 :(得分:0)

请尝试在 index.js

中添加这一行

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

将此添加到 App.js 文件对我不起作用