免责声明:抱歉这会有点长
所以我正在使用Vue JS和Vuex开发一个中等复杂的应用程序。
这是我的第一个Vue SPA项目,所以我在建筑选择方面面临一些困难,特别是问题“谁应该了解商店?”
我将用一个虚拟的例子描述我的问题:
假设我们有一个Post
组件,它有3个状态可以通过按钮切换:
title
和text
。title
输入和text
输入现在,为了显示和更新帖子,组件获得id
道具,并从商店内的帖子列表中选择帖子对象,并在必要时调度操作。它具有update
内部属性,可在显示和更新状态之间切换。
对于创建状态,将null id
传递给组件,因此它不会从存储中获取任何内容并显示输入,而是调度插入操作。
const KnowledgebalePost = {
name: 'Post',
props: ['id'],
data() {
return {
post: {
title: '',
text: '',
},
state: 'show'
}
},
methods: {
updateClicked() {
this.state = 'update';
},
saveClicked() {
this.state = 'show';
const postObject = { id: this.id, ...this.post };
const action = this.id ? 'updatePost' : 'addPost';
this.$store.dispatch(action, postObject);
},
},
created() {
if(this.id) {
// just to simplify
this.post = this.$store.state.posts[this.id];
}
}
};
我在此看到的好处主要是封装与组件相关的所有内容。它知道如何获取数据并且它是独立的,我只需要传递一个id。
另一方面,了解太多是有问题的,组件范围之外的很多东西都可能会破坏它。
在这种方法中,组件会将所有内容作为属性:id
,title
,text
和state
告诉它是否应该呈现输入或只是文本字段。
而不是派遣行动,它可能会发出事件。
const IgnorantPost = {
name: 'Post',
props: ['id', 'title', 'text', 'state'],
data() {
return {
post: {
title: '',
text: '',
},
internalState: 'show'
}
},
methods: {
updateClicked() {
this.internalState = 'update';
},
saveClicked() {
this.internalState = 'show';
this.$emit('saving', { id: this.id, ...this.post });
},
},
created() {
this.post.title = this.title;
this.post.text = this.text;
this.internalState = this.state;
}
};
虽然这解决了依赖性问题,但它只是将一些逻辑推送到父组件,就像处理Post
组件的状态一样。
此外,如果此父级有许多除Post
以外的子级,它将成为一个非常胖的逻辑容器。
请注意,我的组件要复杂得多,有关如何处理此特定问题的任何想法吗?
提前致谢,到目前为止,我感谢您的阅读。