这是一种用于分离模板 jsx 的模式,它使用 NodeJS、Browserify 或 Webpack 中的 CommonJS 模块。在 NodeJS 中,我发现 node-jsx 模块有助于避免编译 JSX。
// index.js
require('node-jsx').install({extension: '.jsx'});
var React = require('react'),
Component = require('./your-component');
// your-component.jsx
var YourComponent,
React = require('react'),
template = require('./templates/your-component.jsx');
module.exports = YourComponent = React.createClass({
render: function() {
return template.call(this);
}
});
// templates/your-component.jsx
/** @jsx React.DOM */
var React = require('react');
module.exports = function() {
return (
<div>
Your template content.
</div>
);
};
2015 年 1 月 30 日更新:在 Damon Smith 的回答中纳入了将模板函数中的 this 设置为 React 组件的建议。
2016 年 12 月更新:当前的最佳做法是使用 .js 扩展名并使用 Babel 等构建工具从您的源代码中输出最终的 javascript。如果您刚刚开始,请查看create-react-app。此外,最新的 React 最佳实践确实建议将管理状态的组件(通常称为“容器组件”)和展示性组件分开。这些表示组件现在可以编写为函数,因此它们与前面示例中使用的模板函数相差不远。以下是我现在建议解耦大部分演示 JSX 代码的方法。这些示例仍然使用ES5 React.createClass() syntax。
// index.js
var React = require('react'),
ReactDOM = require('react-dom'),
YourComponent = require('./your-component');
ReactDOM.render(
React.createElement(YourComponent, {}, null),
document.getElementById('root')
);
// your-component.js
var React = require('react'),
YourComponentTemplate = require('./templates/your-component');
var YourComponentContainer = React.createClass({
getInitialState: function() {
return {
color: 'green'
};
},
toggleColor: function() {
this.setState({
color: this.state.color === 'green' ? 'blue' : 'green'
});
},
render: function() {
var componentProps = {
color: this.state.color,
onClick: this.toggleColor
};
return <YourComponentTemplate {...componentProps} />;
}
});
module.exports = YourComponentContainer;
// templates/your-component.js
var React = require('react');
module.exports = function YourComponentTemplate(props) {
return (
<div style={{color: props.color}} onClick={props.onClick}>
Your template content.
</div>
);
};