How to use materialize-css with React?

后端 未结 13 1802
太阳男子
太阳男子 2020-12-07 17:52

I have a Meteor/React project, using ES6 modules. I\'ve installed materialize-css using npm, but I\'m not sure how to actually use the Materialize classes in my JSX code. Wh

相关标签:
13条回答
  • 2020-12-07 18:06

    With NPM:

    Step 1) Install materialize

    npm install materialize-css@next 
    

    Check the materialize documentation for any updates. Don't miss the @next at the end. The installed version will be something like: ^1.0.0-rc.2 or ^1.0.0-alpha.4

    Step 2) Import materialize JS:

    import M from 'materialize-css'
    

    Or if that doesn't work you can try import M from 'materialize-css/dist/js/materialize.min.js'

    Step 3) Import materialize CSS:

    In index.html

    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0-rc.2/css/materialize.min.css">
    

    OR in javascript

    import 'materialize-css/dist/css/materialize.min.css'
    

    In order for the css import to work, you would need a css loader. Note that this loader is already included in projects built using create-react-app so you don't need the next steps. If instead, you are using custom webpack config, then run:

    npm install --save-dev style-loader css-loader
    

    Now add css-loader and style-loader in webpack config

    const path = require("path");
    
    module.exports = {
        entry: "./src/index.js",
        output: {
            filename: "bundle.js",
            path: path.join(__dirname, "build")
        },
        module: {
            rules: [
                {
                    test: /\.css$/,
                    use: [
                        'style-loader',
                        'css-loader'
                    ]
                },
                {
                    test: /.js$/,
                    exclude: /(node_modules)/,
                    use: {
                        loader: "babel-loader",
                        options: {
                            presets: ["env", "react"]
                        }
                    }
                }
            ]
        }
    }
    

    Now you can initialize components individually, or all at once using M.AutoInit();

    Step 4) Import materialize icons:

    <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
    

    With CDN:

    Add the following in your HTML file.

    <!-- Materialize CSS -->
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0-rc.2/css/materialize.min.css">
    
    <!-- Materialize JS -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0-rc.2/js/materialize.min.js"></script>
    
    <!-- Materialize Icons -->
    <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
    

    Then, in the webpack config, add externals: https://webpack.js.org/configuration/externals/

    0 讨论(0)
  • 2020-12-07 18:11

    Since I use CSS Modules, importing materialize css would scope it to that particular component. So I did the following

    Step 1) install materialise

    npm install materialize-css@next 
    

    Step 2) in index.html

    <!--Import Google Icon Font-->
    <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
    <!-- Compiled and minified CSS -->
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0-alpha.3/css/materialize.min.css">
    

    Step 3) import materialise.js in whichever component its needed

    for e.g. in SomeComponent.js (for e.g. if this is about a sidenav)

    import React from 'react';
    import M from 'materialize-css';
    ....
    // ref can only be used on class components
    class SomeComponent extends Component {
      // get a reference to the element after the component has mounted
      componentDidMount(){
        M.Sidenav.init(this.sidenav);
      }
    
      render(){
        return (
          <ul className={this.props.classes}
              ref={ (sidenav) => {this.sidenav = sidenav} }
              id={this.props.id}>
            // menuItems
          </ul>
        )
      }
    }
    

    just a beginner, so I would appreciate any comments on downsides of this method

    0 讨论(0)
  • 2020-12-07 18:11

    You can use https://react-materialize.github.io/#/, why to reinvent the wheel.

    installation react-materialize

    npm install react-materialize

    Usage

    import {Button, Icon} from 'react-materialize'
    
    export default () => (
      <Button waves='light'>
        <Icon>thumb_up</Icon>
      </Button>
    )
    

    Sample

    https://github.com/hiteshsahu/react-materializecss-template

    Screenshot

    0 讨论(0)
  • 2020-12-07 18:13

    I don't know am I too late to put this answer. You can use componentDidMount like this video

    However, It does not use react-hooks. You'd better use react hooks (useEffects)

    0 讨论(0)
  • 2020-12-07 18:16

    Inorder to address the concern of bundle size, the easiest way to use it is as follows:

    1. Include the CDN links in your index.html file
    2. Initialize M in your React Component's constructor this.M = window.M
    3. All the other required initializations in case of Modals and other Materialize Components can be done as mentioned in their Documentation using this.M
    4. I like to do those initialization in the componentDidMount lifecycle method.
    5. When unmounting i.e. inside componentWillUnmount, i use the destroy() method on the instances of initialized Materialize Components.
    0 讨论(0)
  • 2020-12-07 18:16

    These answers didn't satisfy my biggest concern which was bundle size and importing a ton of code in order to use a few components. I've written up a solution here that includes code splitting and an easy compilation step.

    The key points are:

    1. Compile base JS files (there are 4)
    2. Ensure the base JS is included before your imports / bundler runs
    3. Change the CSS imports to only what you need
    4. Run materialize.scss through your bundler if it supports Sass or run the compilation step to get a minified css file.
    5. Import individual components and activate them manually

    Read post for more details.

    0 讨论(0)
提交回复
热议问题