Material 使用 ReactJS 设计精简版(import/require 问题)
Material Design Lite with ReactJS (import/require Issue)
我正在尝试使用 Google's Material Design Lite with ReactJS. I am using 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 变量。但是,它向我展示了一个 空对象 {}。我正在使用 webpack 并安装了 Material Design Lite 和 NPM、npm install material-design-lite --save
.
我的问题是如何 import/require MDL 正确使用 componentHandler.upgradeDom()
?
我自己想出了解决办法。您可以通过两种方式实现这一目标。
The Lazy Way
在node_modules/material-design-lite/material.js
中,编辑并在最后添加以下代码,如下所述。
// You can also export just componentHandler
if (typeof module === 'object') {
module.exports = window;
}
您的 material.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;
.
The Webpack Way
就我个人而言,我更喜欢 webpack 方式,因为它更简洁而且您不需要自己编辑模块文件。
安装 exports-loader、npm install exports-loader --save-dev
。然后,在您的 webpack.config.js 中,将加载程序指定为
loaders: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'exports-loader!babel-loader'
}
]
在你的 React Component 文件中,你可以 require
componentHandler as
var componentHandler = require('exports?componentHandler!material-design-lite/material');
希望对您有所帮助!
我正在尝试使用 Google's Material Design Lite with ReactJS. I am using 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 变量。但是,它向我展示了一个 空对象 {}。我正在使用 webpack 并安装了 Material Design Lite 和 NPM、npm install material-design-lite --save
.
我的问题是如何 import/require MDL 正确使用 componentHandler.upgradeDom()
?
我自己想出了解决办法。您可以通过两种方式实现这一目标。
The Lazy Way
在node_modules/material-design-lite/material.js
中,编辑并在最后添加以下代码,如下所述。
// You can also export just componentHandler if (typeof module === 'object') { module.exports = window; }
您的 material.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;
.
The Webpack Way
就我个人而言,我更喜欢 webpack 方式,因为它更简洁而且您不需要自己编辑模块文件。
安装 exports-loader、npm install exports-loader --save-dev
。然后,在您的 webpack.config.js 中,将加载程序指定为
loaders: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'exports-loader!babel-loader'
}
]
在你的 React Component 文件中,你可以 require
componentHandler as
var componentHandler = require('exports?componentHandler!material-design-lite/material');
希望对您有所帮助!