【问题标题】:Meteor dynamic content without routing无需路由的流星动态内容
【发布时间】:2019-10-25 00:29:52
【问题描述】:

在不创建路由的情况下更改页面内容的最佳做法是什么?

BlazeLayout.render('mainLayout', { top: 'header', menu: 'menu', main: 'dashboard', bottom: 'footer' });

如何在不创建新路由的情况下在仪表板内隐藏/显示模板组件?这是否应该在帮助程序中使用 html 中的某种 if/else 逻辑并使用帮助程序来单击按钮?假设我想根据按钮点击(href)在仪表板模板中显示不同的内容。

请提供一个包含大量组件的最佳实践和良好解决方案。

【问题讨论】:

    标签: meteor meteor-blaze


    【解决方案1】:

    如何在仪表板中隐藏/显示模板组件 创建新路线?这是否应该在使用某种类型的助手中完成 html 中的 if/else 逻辑以及在按钮单击时使用助手?

    你可以这样做,但你应该注意一些要点来保持你的代码干净和模块化:

    • 尝试将仪表板的某些部分封装到自己的模板中,以保持代码整洁
    • 使用ReactiveDict 支持许多ReactiveVar 实例
    • 将重复出现的部分也包含在模板中以减少重复代码
    • 在全局范围内或在仪表板的最上方模板中注册经常性助手
    • 在父模板上订阅在仪表板所有部分之间共享的数据,并订阅各个组件中的本地数据
    • 使用autorunsubscription.ready() 并显示加载指示器,直到订阅准备就绪。不要等到所有内容都加载完毕后再进行渲染,因为这可能会显着降低用户体验。

    假设我想在仪表板模板中显示不同的内容 基于按钮点击 (href)。

    您可以将数据属性附加到按钮,该属性具有要切换的目标的特定 ID:

    <template name="dashboardComponent">
      <a href class="toggleButton" data-target="targetId">My Link</a>
    </template>
    

    然后您可以读取此 ID 并在您的 ReactiveDict 中切换它的状态:

    Template.dashboardComponent.events({
      'click .toggleButton'(event, templateInstance) {
        event.preventDefault();
    
        // get the value of 'data-target'
        const targetId = $(event.currentTarget).attr('data-target');
    
        // get the current toggle state of target by targetId
        const toggleState = templateInstance.state.get( targetId );
    
        // toggle the state of target by targetId
        templateInstance.state.set( targetId, !toggleState );
      }
    });
    

    在您的模板中,您可以要求通过简单的 if / else 进行渲染:

    <template name="dashboardComponent">
      <a href class="toggleButton" data-target="targetId">My Link</a>
      {{#if visible 'targetId'}}
        <div>target is visible</div>
      {{/if}}
    </template>
    

    你的助手正在返回状态:

    Template.dashboardComponent.helpers({
      visible(targetName) {
        return Template.instance().state.get(targetName);
      }
    });
    

    可能存在在父模板和子模板之间共享状态的问题,我建议您尽可能避免使用Session。然而,作为初学者,首先使用Session 会容易得多,然后一步一步地朝着更加解耦(参数化模板)的解决方案工作。

    请提供易于使用的最佳实践和良好解决方案 很多组件。

    这是一个很高的要求,你有能力为这两者努力!然而,这里有一个简短的介绍:

    • 最佳实践是对您有用的方法,并且在其他用例中也适用于其他人。尝试与其他人分享您的工作,看看他们的用例会在哪里失败。

    • 使用路由的好处是可以使用查询参数将当前视图状态保存在 url 中。这增加了一个优势,即在重新加载页面或通过链接共享时,可以完全恢复页面状态。

    • 易于使用很多组件是一个矛盾,我不知道您是否期望一些神奇的粉扑可以为您解决这种复杂性。作为一名软件工程师,您有能力将复杂性抽象成更小的部分,直到您能够在一定范围内解决问题。

    【讨论】:

    • 很好的答案!非常感谢!
    猜你喜欢
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    相关资源
    最近更新 更多