【问题标题】:Material Design Lite with ReactJS (import/require Issue)带有 ReactJS 的 Material Design Lite(导入/需要问题)
【发布时间】:2016-08-17 00:07:55
【问题描述】:

我正在尝试将Google's Material Design Lite 与 ReactJS 一起使用。我正在使用 Spinner Loading & Text Field MDL 库的组件。

但是,当我使用 React Router 切换路由时,动画不会发生,当我刷新页面时,它工作正常。我想,这可能是因为 MDL 组件没有升级。然后,我尝试使用componentHandler.upgradeDom(),但控制台抛出错误,app.js:27160 Uncaught TypeError: Cannot read property 'upgradeDom' of undefined

这是代码,

var React = require('react');
var ReactDOM = require('react-dom');
var PropTypes = React.PropTypes;
var MDLite = require('material-design-lite');
var componentHandler = MDLite.componentHandler;

var styles = {
  loader: {
    marginTop: '70px',
  }
}

var Loading = React.createClass({
  render: function() {
    return (
      <div className="mdl-spinner mdl-js-spinner is-active" style={styles.loader}></div>
    );
  },
  componentDidMount: function() {
    componentHandler.upgradeDom();
  },
});

module.exports = Loading;

我还尝试使用console.log(MDLite) 在控制台中记录 MDLite 变量。但是,它向我展示了一个 empty Object {}。我正在使用 webpack 并安装了带有 NPM 的 Material Design Lite,npm install material-design-lite --save

我的问题是如何正确导入/要求 MDL 并使用 componentHandler.upgradeDom()

【问题讨论】:

    标签: javascript reactjs npm webpack material-design-lite


    【解决方案1】:

    我自己想出了解决方案。有两种方法可以实现这一目标。

    懒惰的方式

    node_modules/material-design-lite/material.js中,编辑并添加如下代码,如下所述。

    // You can also export just componentHandler
    if (typeof module === 'object') {
      module.exports = window;
    }
    

    您的 ma​​terial.js 文件将如下所示。

    ;(function() {
      .
      .
      .
      componentHandler.register({
        constructor: MaterialRipple,
        classAsString: 'MaterialRipple',
        cssClass: 'mdl-js-ripple-effect',
        widget: false
      });
    
      // You can also export just componentHandler
      if (typeof module === 'object') {
        module.exports = window;
      }
    
    }());
    

    在你的 React 组件文件中,require 像这样,

    var MDLite = require('material-design-lite/material');
    var componentHandler = MDLite.componentHandler;
    

    然后,您可以拨打componentHandler.upgradeDom()升级MDL元素。

    注意,如果你只想导入componentHandler,也可以写module.exports = componentHandler;

    Webpack 方式

    就我个人而言,我更喜欢 webpack 的方式,因为它更简洁,而且你不需要自己编辑模块文件。

    安装exports-loadernpm install exports-loader --save-dev。然后,在您的 webpack.config.js 中,将加载器指定为

    loaders: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'exports-loader!babel-loader'
      }
    ]
    

    在你的 React Component 文件中,你可以requirecomponentHandler 为

    var componentHandler = require('exports?componentHandler!material-design-lite/material');
    

    希望对你有帮助!

    【讨论】:

    • 您的解决方案运行良好,但我们需要升级 DOM,您认为这会影响性能吗?
    猜你喜欢
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    相关资源
    最近更新 更多