我正在评估将 react.js 添加到我们即将开始的新 Web 项目中。到目前为止,我很喜欢以数据为中心的方法(感觉有点像 MVVM,因为它通过更改对象的数据/状态来间接更新视图,然后视图知道代表那个新状态)。我有一些担忧,其中一个我想在这里得到一些反馈,因为我正在尝试为这个项目的编码制定一套标准。
我想建立一个模式/规范,我们尝试以一种被调用和明确的方式声明我们的视觉输出/HTML。我觉得要使维护变得足够容易,您需要能够浏览这些 JSX 文件之一(我依赖 JSX)并很快看到基本输出将是什么。我还希望维护或标记与用于构建它的任何逻辑尽可能不同。
因此,我一直在尝试将条件标记“块”拆分为渲染方法内的变量 - 在 return 语句之前 - 然后将它们内联到主标记中。我希望我可以在任何我想要的地方使用 JSX 标记混合技巧(呃,显然是我的名字......仍然不确定所有这些新概念的词典),就像这样:
var sIcon = (<i className='alert-success'></i>);
然后,类似:
<input type='tel' id="userPhone" onChange={this._handleInputChange('userPhone')} />{sIcon}
所以我希望使用“(....)”来创建内联 HTML 并将其存储在一个变量中(因为它具有在 IDE 中被格式化为 HTML 并且更突出的优点),然后再输出它使用大括号。对我来说,更清楚的是这是输出,我更喜欢它而不是“React.DOM.div”等。根本没有渲染任何东西,但是,它只是{sIcon}
在渲染时完全忽略了''。
这可能吗?我只是在破坏它的语法吗?
还是其他人设计了另一种方法来在我应该尝试的反应组件中实现更大的 HTML/逻辑分离?
当我在渲染方法中声明一个变量时,它特别失败,但是将它初始化为 null 然后有条件地尝试稍后设置它。所以简单地用 JSX 声明一个变量然后引用它就可以了,但是声明一个没有值的变量然后尝试将 JSX 分配给它会失败:
var authorizedBlock = "";
var sessionIdBlock = "";
var eventCountBlock = "";
var sIcon = "";
var tempIcon = <i className='fa fa-check-square-o' />;
var tempIcon2;
if (this.state.loginAttempted) {
if (this.state.loginSuccessful) {
authorizedBlock = React.DOM.div (null, "Success! Ye be logged in.");
sessionIdBlock = React.DOM.div (null, "SessionId: " + this.state.sessionId);
eventCountBlock = React.DOM.div(null, "Your events: " + this.state.userEventCount);
tempIcon2 = <i className='fa fa-check-square-o' />;
}
};
return (
<div id='loginContainer'>
<div className='row'>
<div className='col-md-2'>
Phone:
</div>
<div className='col-md-2'>
<div>
<input type='tel' id="userPhone" onChange={this._handleInputChange('userPhone') } />
{tempIcon}{tempIcon2}
</div>
{attemptedBlock}
</div>
<div className='col-md-1'>
<button onClick={this._requestCode} >Get code</button>
</div>
</div>
</div>);
请注意,这里的 HTML 格式可能不是完全正确的;这是一个部分片段,我不想包含整个喇叭文件,所以请原谅任何复制/粘贴错误。但这里的重点是,给定上面的代码,tempIcon
将显示在输出中,但tempIcon2
不会。