Javascript クラスからコンポーネントをインスタンス化することにより、実行時に React-Bootstrap でアラート コンポーネントを動的に生成しようとしています。私がこれを行っているのは、表示するアラートがたくさんあり、Javascript クラスの作成がより簡潔であるためです。
これを行う私の試みはうまくいきません。問題が一般的に React に当てはまるのか、それとも単に React-Bootstrap に当てはまるのかはわかりません。ただし、react.js でエラーが発生し、以下がスローされます。
TypeError: undefined is not a function
スローはalert.getComponent()
、次の JSX ファイルの呼び出しで発生します。
/** @jsx React.DOM */
var Alert = ReactBootstrap.Alert;
var AlertDismissible = React.createClass({
getInitialState: function() {
return {
isVisible: true
};
},
render: function() {
if(!this.state.isVisible)
return null;
var message = this.props.message;
if(this.props.code !== null)
message = message +'(Code '+ this.props.code +')';
return (
<Alert bsStyle={this.props.level} onDismiss={this.dismissAlert}>
<p>{message}</p>
</Alert>
);
},
dismissAlert: function() {
this.setState({isVisible: false});
}
});
function AlertNotice(level, message, code) {
this.level = level;
this.message = message;
this.code = code || null;
}
AlertNotice.prototype.getComponent = function() {
// What should go here? Using React.createClass() doesn't help
return (
<AlertDismissible level={this.level} message={this.message}
code={this.code} />
);
};
function SuccessAlert(message) {
AlertNotice.call(this, 'success', message);
}
SuccessAlert.prototype = Object.create(AlertNotice);
SuccessAlert.prototype.constructor = SuccessAlert;
/* ...more kinds of alerts... */
function ErrorAlert(message, code) {
AlertNotice.call(this, 'danger', message, code);
}
ErrorAlert.prototype = Object.create(AlertNotice);
ErrorAlert.prototype.constructor = ErrorAlert;
var SomethingWithAlerts = React.createClass({
render: function() {
var alerts = [
new ErrorAlert("Goof #1", 123),
new ErrorAlert("Goof #2", 321)
].map(function(alert) {
// react.js throws "TypeError: undefined is not a function"
return alert.getComponent();
});
return (
<div>{alerts}</div>
);
}
});
var TestComponent = (
<div>
<SomethingWithAlerts />
</div>
);
React.renderComponent(
TestComponent,
document.getElementById('content')
);
Alert
コンポーネントは React-Bootstrap ライブラリから取得されます。コンポーネントは無関係に見えますdiv
が、react フレームワークを満たすために必要であることがわかりました。実際には、AlertNotice
インスタンスを反応状態で保存し、それらから反応ノードを生成します。
これについての適切な方法は何ですか?
ここにヒントがあります。次のハードコーディングされたアラートに置き換えるreturn alert.getComponent();
と、AlertDismissible コンポーネントはエラーなしで (重複して) レンダリングされますが、警告が表示されます。
return (
<AlertDismissible level="danger" message="Goof" code="777" />
);
以下は、上記の置き換えで表示される警告メッセージで、key=
アラートごとに一意に設定する必要があることを説明するリンクが含まれています。
Each child in an array should have a unique "key" prop. Check the render method
of SpecimenSetManager. See http://fb.me/react-warning-keys for more information.
AlertNotice.prototype.getComponent
ただし、内部のコードを上記のハードコードされたアラートに単純に置き換えると、TypeError
以前と同じメッセージが表示されます。
完全を期すために、ここに私の HTML ソースを示します。これは、react および react-boostv0.11.1 です。
<html>
<head>
<script src="lib/react.js"></script>
<script src="lib/react-bootstrap.js"></script>
<script src="lib/JSXTransformer.js"></script>
<link rel="stylesheet" href="css/bootstrap-theme.min.css">
<link rel="stylesheet" href="css/bootstrap.min.css">
</head>
<body>
<div id="content"></div>
<script src="components.js" type="text/jsx"></script>
</body>
</html>