我们有几种不同的呈现帖子的方式(例如,整页,模态视图,折叠视图,编辑模式等)。许多方法在它们之间共享。我们将所有这些变体保留为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模式。
答案 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">
希望这会有所帮助