如何重构模板变体&共享方法

时间:2018-01-02 23:44:42

标签: design-patterns vue.js vuejs2 vuex

我们有几种不同的呈现帖子的方式(例如,整页,模态视图,折叠视图,编辑模式等)。许多方法在它们之间共享。我们将所有这些变体保留为Post.vue内的模板,并传递上下文道具以使用v-if有条件地呈现某个模板:

<single-post
  :post="currPost"
  :canEditPost="canEditPost"
  :targetPageUrl="targetPageUrl"
  :mailToLink="mailToLink"
  :onAddComment="addComment"
  :onDeleteComment="deleteComment"
  :onShowMoreComments="showMoreComments"
  :onShowFewerComments="showFewerComments"
  :onGoToPost="goToPost"
  v-if="context === 'feed'"
/>

<post-full
  :post="currPost"
  :canEditPost="canEditPost"
  :targetPageUrl="targetPageUrl"
  :mailToLink="mailToLink"
  :postImage="postImage"
  :units="units"
  :divisionsByType="divisionsByType"
  v-if="context === 'permalink'"
/>

(many more versions)

然后Post.vue中的方法就像这样:

deletePost: function(){
  BootBox.confirm("Are you sure you want to delete this post?", (confirmed) => {
    if (confirmed) {
      API.deletePost(this.currPost, (err) => {
        if (!err){
          this.currPost.status = 'deleted';
        }
      });
    }
  });
},

如何重构这个更优雅,更简洁?

对我而言,这似乎超级冗长(太多道具)。我一直在为此寻找vue或vuex模式。

1 个答案:

答案 0 :(得分:2)

我认为v-bind是您的朋友,<component>PostModel

创建一个预定义可重复使用帖子的所有功能和属性的PostModel

export default {
    post: {},
    canEditPost: function() {},
    targetPageUrl: '',
    //...
}

然后导入SinglePost(或任何您需要的)以及PostModel

import SinglePost from '/path/to/SinglePost';
import PostModel from './path/to/PostModel';

export default {

    data() {
        return {
            thePostComponent: SinglePost,
            postProps: Object.assign({}, PostModel, {
                post: post,
                canEditPost: canEditPost,
                targetPageUrl: targetPageUrl
            }
        }
    }
}

上面的想法是,您使用给定帖子的任何自定义配置覆盖对象,但您不需要在组件上自行定义属性,从而创建更自包含且可重用的组件。如果您从API中传递这些属性,则可以使用Interceptor模式将模型映射到API,从而更轻松地将其集成以使其更加平坦和可重用。

最后,动态显示该组件:

For a reusable component:

<component :is="thePostComponent" v-bind="postProps">

希望这会有所帮助