创建可重用组件的模式

Posted

技术标签:

【中文标题】创建可重用组件的模式【英文标题】:Pattern for creating reuseable components 【发布时间】:2014-10-30 04:45:42 【问题描述】:

我目前正在开发一个长期的 Web 应用程序 Meteor。随着时间的推移,开发人员会来去去去。因此,为了确保整个应用程序保持相同的外观和感觉,我希望能够使用流星的模板系统创建标准组件。因此,功能模板不应包含任何 html,而这应全部包含在组件模板中。

我尝试过meteor-polymer,但它只是让我的应用程序崩溃,感觉我应该使用流星模板系统而不是添加另一个库。此外,聚合物很大程度上依赖于 Meteor 也依赖的模板标签,所以我不太确定

基本上我想在我的模板中做的是:

<template name="someRandomFeature">
    #_RadioGroup name="dataInput" context=. formData=formData
        #_setLabelTest set/_setLabel
        #_addRow
            assignValues value="random"
            #_setCaptionRandom/_setCaption
        /_addRow
        #_addRow
            assignValues value="expression"
            #_setCaptionExpression: _TextInput name="testSetExpression" inline=true/_setCaption
        /_addRow
    /_RadioGroup

    #_FormGroup
        #_Config
            assignValues numRows=2
        /_Config

        #_setRow 0
            #_SetLabelNumber of tests/_SetLabel
            #_setStageContent
                > _DropDown name="numberOfTests" items=numberOfTestsList formData=formData
            /_setStageContent
        /_setRow

        #_setRow 1
            #_SetLabelTo email address/_SetLabel
            #_setStageContent
                > _TextInput name='respondentSelection' formData=formData
                <span class="help-block text-left">Send all test mails to this email adress</span>
            /_setStageContent
        /_setRow
    /_FormGroup
</template>

组件示例:

<template name="_FormGroup">
#with numRows=0 context=. formdata=formdata stage='config'
    #with execBlock UI.contentBlock
        <div class="form-group">
            #each getRows
                #unless ../disableLabels
                    <label class="control-label">
                        #with _constructStageList 1='rows' 2=_id 3='label'
                            > UI.contentBlock stage=this stageContext=../../context
                        /with
                    </label>
                /unless

                <div class="row#unless ../disableLabels controls/unless">
                    <div class="#if ../fullWidthcol-md-16elsecol-md-8/if">
                        #with _constructStageList 1='rows' 2=_id 3='content'
                            > UI.contentBlock stage=this stageContext=../../context
                        /with
                    </div>
                </div>
            /each
        </div>
    /with
/with
</template>

这可行,但是:

    组件本身过于复杂,大量的上下文切换使得理解组件成为一个活生生的地狱 多次更新打破了这种模式

那么有人尝试过这样做吗?和/或找到适用于此的模式?

【问题讨论】:

确实是一个非常好的问题! 你考虑过使用 react 吗? 【参考方案1】:

有一个正在开发的项目可以做到这一点:UI Harness,来自Respond.ly 的创建者。不过目前是私人的。您可以通过Phil Cockfield’s talk at the July 2014 Devshop (YouTube link) 了解它。如果您不想等待 UI Harness 的发布,您应该从演讲视频中了解如何构建自己的组件。

【讨论】:

github 上的项目已经开放,它只是关闭的 .com 站点 (github.com/Respondly/meteor-ui-harness) 但是这个解决方案虽然看起来很有希望,但并不是我想要的。

以上是关于创建可重用组件的模式的主要内容,如果未能解决你的问题,请参考以下文章

Vuex 可重用模块模式。使用状态功能不起作用

用于在非 SPA 站点上构建可重用组件的 Javascript MVC 框架

使用 KnockoutJS 创建可重用组件

如何创建可重用的 Twig 组件

如何使用 Ionic 3 和 Angular 4 创建可重用组件

Magnolia 中的可重用表单组件