私は非常に反応していて、あまりにも多くビットオフしている可能性があります。複数の要素をレンダリングする
私のアプリでは、ドキュメントビルダー(mailchimpにメールを作成するようなもの)を作ろうとしています。要素のアイコンをクリックすると、その要素のマークアップが文書ページに追加されます。
概念的には、Reactでこれを行う最善の方法はわかりません。私の質問には次のものが含まれます:
- 文書にどの要素が追加されたかをどのように追跡していますか?
- アプリレベルで状態を管理していますか?
- 最終的には、ドキュメントに追加された各要素のスタイルをカスタマイズする必要があります。そのコードはどこにあるべきですか?
- データの順序や機能に問題があるようです(この注文が変更されると破損することがあります)。これを整理するより良い方法はありますか?
今のところ、これを設定するための「反応」方法についてのアドバイスは感謝しています。
私の主なJS:
// ---------------------------------------------------------
// Elements
// ---------------------------------------------------------
var TextBlock = React.createClass({
render: function() {
return (
<p>Lorem ipsum ... laborum.</p>
);
}
});
var ImageBlock = React.createClass({
render: function() {
return (
<img src="placehold.it/360x240" alt="Image" />
);
}
});
var HeadingBlock = React.createClass({
render: function() {
return (
<h3>Heading Here</h3>
);
}
});
var TableBlock = React.createClass({
render: function() {
return (
<table>
... Table Markup Here ...
</table>
);
}
});
var ColumnsBlock = React.createClass({
render: function() {
return (
<div class="row">
<div class="col-xs-4">Col 1</div>
<div class="col-xs-4">Col 2</div>
<div class="col-xs-4">Col 3</div>
</div>
);
}
});
var Divider = React.createClass({
render: function() {
return (
<hr />
);
}
});
var elementList = [
{
'name': 'Text',
'icon': 'align-left',
'html': <TextBlock />
},
{
'name': 'Image',
'icon': 'picture-o',
'html': <ImageBlock />
},
{
'name': 'Heading',
'icon': 'header',
'html': <HeadingBlock />
},
{
'name': 'Table',
'icon': 'table',
'html': <TableBlock />
},
{
'name': 'Column',
'icon': 'columns',
'html': <ColumnsBlock />
},
{
'name': 'Divider',
'icon': 'times',
'html': <Divider />
},
];
var Element = React.createClass({
handleClick: function(e){
e.preventDefault();
this.props.handleClick();
},
render: function() {
return (
<li className="element" onClick={this.handleClick}>
<i className={'fa fa-' + this.props.icon}></i>
<span className="element__name">{this.props.name}</span>
</li>
);
}
});
var Elements = React.createClass({
getInitialState: function() {
return {
elementList: elementList,
};
},
handleClick: function(index, element){
console.log(element.html);
},
render: function() {
return (
<ul className="list-unstyled">
{this.state.elementList.map(function(element, index) {
return (
<Element
key={index}
handleClick={this.handleClick.bind(this, index, element)}
name={element.name}
icon={element.icon}
/>
);
}.bind(this))}
</ul>
);
}
});
// ---------------------------------------------------------
// Tabs
// ---------------------------------------------------------
var Tab = React.createClass({
handleClick: function(e){
e.preventDefault();
this.props.handleClick();
},
render: function() {
return (
<a className={this.props.isCurrent ? 'btn btn-primary' : 'btn btn-default'} onClick={this.handleClick}>
{this.props.name}
</a>
);
}
});
var Tabs = React.createClass({
handleClick: function(tab){
this.props.changeTab(tab);
},
render: function(){
return (
<div className="text-center">
<nav className="btn-group">
{this.props.tabList.map(function(tab, index) {
return (
<Tab
key={index}
handleClick={this.handleClick.bind(this, index)}
name={tab.name}
isCurrent={(this.props.currentTab === index)}
/>
);
}.bind(this))}
</nav>
</div>
);
}
});
var Settings = React.createClass({
render: function() {
return (
<div>test settings</div>
);
}
});
var tabList = [
{
'name': 'Content',
'content': <Elements />
},
{
'name': 'Settings',
'content': <Settings />
}
];
var Document = React.createClass({
render: function() {
return (
<article className="document__frame">
<div className="document">test</div>
</article>
);
}
});
var App = React.createClass({
getInitialState: function() {
return {
tabList: tabList,
currentTab: 0
};
},
changeTab: function(index) {
this.setState({ currentTab: index });
},
render: function() {
return (
<div>
<Document />
<div className="control">
<Tabs
currentTab={this.state.currentTab}
tabList={this.state.tabList}
changeTab={this.changeTab}
/>
<div className="control__panel">
{this.state.tabList[this.state.currentTab].content}
</div>
</div>
</div>
);
}
});
ReactDOM.render(
<App />,
document.getElementById('content')
);
良い情報、ありがとうございました!スタイリングの問題は、ドキュメントに追加できる要素がテンプレートであるという事実と関係があります。 たとえば、文書ごとに異なるスタイルを持つ複数のテキストブロックが存在する可能性があります。だから、インラインスタイルは、行く方法ですが、私はこのデータをどこに保存するのか分かりませんでした。私は 'createdElements'配列を作成し、それにスタイリングデータを追加するのはおそらく私がやっていることだと思います。 – xEmptyCanx
問題ありません!お力になれて、嬉しいです。私は本当にあなたの反応コンポーネントファイルにインポートされ、次にコンポーネントに渡すことができます基本的にちょうどjavascriptオブジェクト、スタイルのための別のファイルを持っているのが好きです: 'var transparentBG = require( '../ styles')。コンポーネントの名前を変更することはできません。 コンポーネント内: ' ' - module.exports = styles;を使用してスタイルobjをエクスポートするのを忘れないでください。 –
JordanHendrix
ああ、それはそれを行う良い方法だろう。私はjs開発者よりもウェブデザイナーの方が多いので、スタイルは別々のファイルになっているのが本当に好きです。反応の唯一の部分については私は確信していません。 – xEmptyCanx