有没有办法将 jsx 从组件的渲染函数移动到单独的文件?如果是这样,我如何在渲染函数中引用 jsx?
5 回答
您可以使用react-templates。它为您提供了标记和组件本身之间的这种分离,等等。
我发现它对我的需求非常有用(大型网络应用程序)。
将模板移动到单独文件中的一个问题是,如果您使用以下处理程序:
var myTemplate = (
<form onSubmit={this.handleSubmit}></form>
);
然后在您的组件中使用:
render: function() {
return myTemplate;
}
生成的模板代码将调用 this.handleSubmit(),因此“this”将是错误的,并且处理程序将无法工作。您需要做的是将它们放入一个函数中,如下所示:
var myTemplate = function() {
return (
<form onSubmit={this.handleSubmit}></form>
);
};
然后在你的组件的渲染函数中,你需要将它正确绑定到'this',然后调用它,像这样:
render: function() {
return myTemplate.bind(this)();
},
现在,您可以将该模板定义放在任何地方、一个单独的文件中,或者您想要构建和引用您自己的代码。(给你力量!不要听这些疯狂的规定框架!:))
这是一种用于分离在 NodeJS、Browserify 或 Webpack 中使用 CommonJS 模块的模板 jsx 的模式。在 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 组件的建议。
更新 12/2016:当前的最佳实践是使用 .js 扩展名并使用像 Babel 这样的构建工具从您的源代码中输出最终的 javascript。如果您刚刚开始,请查看create-react-app 。此外,最新的 React 最佳实践确实建议将管理状态的组件(通常称为“容器组件”)和展示性组件分开。这些表示组件现在可以编写为函数,因此它们与前面示例中使用的模板函数相差不远。以下是我现在建议解耦大部分演示 JSX 代码的方法。这些示例仍然使用ES5React.createClass()
语法。
// 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>
);
};
我只是将 JSX 分成匿名函数文件
模板.js
export default (component) => {
return <h1>Hello {component.props.name}</h1>
}
我的组件.js
import React, {Component} from 'react';
import template from './template';
export default MyComponent extends Component {
render() {
return template(this);
}
}
在模板中,您可以使用component
变量访问道具或状态或函数。
如果您不使用任何模块系统,即script
仅依赖标签,只需将您的 JSX 组件暴露在全局变量中并在需要时使用它:
// component.js
var Component = React.createClass({ /* your component */ });
// main.js
React.renderComponent(Component({}), domNode);
注意:component.jsscript
的标签必须出现在main.js的标签之前。script
如果您使用类似 Commonjs 的模块系统,例如 Browserify,只需导出您的组件定义并在需要时使用它。
// component.js
var React = require("react");
module.exports = React.createClass({ /* your component */ });
// main.js
var Component = require("component.js");
React.renderComponent(Component({}), domNode);