【问题标题】:Structuring a Vue + Vuex project构建一个 Vue + Vuex 项目
【发布时间】:2016-10-30 13:12:28
【问题描述】:

我对在哪里放置全局函数有点困惑。在许多示例中,main.js 文件指向一个应用程序组件,它位于 html 中的某个位置。如果我只是在这个应用程序组件中包含我的所有逻辑,那么这个工作流程对我来说会很好。但是我将组件与 Laravel 功能相结合,所以这对我不起作用。

目前我的 main.js 文件包含一堆方法,我需要从我的应用程序的任何地方访问这些方法。这些方法不包含任何广播事件,因此只要它们获得 vue-resource 实例,它们就可以有效地放置在任何地方。

我的 main.js 文件:

https://github.com/stephan-v/BeerQuest/blob/develop/resources/assets/js/main.js

希望有人能告诉我,如果我要使用 vuex 或一般情况下,我可以将我的友谊方法放在哪里,因为这似乎根本不是最佳实践。

谢谢。

【问题讨论】:

  • 请在链接的 main.js 中添加至少一些带有通用抽象函数名称的项目符号(因为链接已损坏)。另外,我不清楚您是指 Vue.js 的全局函数/助手还是商店(vuex)或两者(根据您的最后一段,它只是 vuex)。请说清楚。 (考虑去掉多余的标签)

标签: javascript vue.js vue-resource vuex


【解决方案1】:

Vuex 管理应用程序中的所有数据。它是前端数据的“单一事实来源”。因此,任何改变应用程序状态的事情,例如添加朋友或拒绝朋友,都需要通过 Vuex。这通过三种主要的函数类型来实现:getter、action 和 mutation。

查看:https://github.com/vuejs/vuex/tree/master/examples/shopping-cart/vuex

Getter 用于从 Vuex 的存储中获取数据。它们对变化有反应,这意味着如果 Vuex 数据发生变化,组件中的信息也会更新。你可以把它们放在getters.js 这样的地方,这样你就可以在你需要它们的任何模块中导入它们。

动作是您直接调用的函数,即。 acceptFriendRequest 当用户单击按钮时。它们与您的数据库交互,然后发送突变。在这个应用程序中,所有操作都在actions.js 中。

所以你会在你的组件中调用this.acceptFriendRequest(recipient)。这将告诉您的数据库更新朋友状态,然后您会收到确认信息已发生。那是当你发送一个突变来更新当前用户在 Vuex 中的朋友列表时。

突变会更新 Vuex 中的数据以反映新状态。发生这种情况时,您在 getter 中检索的任何数据也会更新。以下是整个流程的示例:

import {addFriend} from './actions.js';
import {friends} from './getters.js';
new Vue({
  vuex:{
    getters:{
      friends
    }
  },
  methods:{
    addFriend
  }
}

store.js:

export default {
  state:{
    friends: []
  },
  mutations:{
    ADD_FRIEND(state, friend) {
      state.friends.push(friend);
    }
  }
}

actions.js:

export default {
  addFriend(friend){
    Vue.http.post('/users/1/friends',friend)
      .then((response)=>{
        dispatch("ADD_FRIEND", response) //response is the new friend
      })
  }
}

getters.js

export default {
  friends(state) {
    return state.friends;
  }
}

因此,所有这些都被组织到自己的文件中,您可以将它们导入到您需要的任何组件中。您可以从任何组件调用this.addFriend(friend),然后从this.friends 访问的getter 将在发生突变时自动更新为新朋友。您始终可以在应用的任何视图中使用相同的数据,并且知道这些数据是您的数据库中的最新数据。

一些杂七杂八的东西:

  • getter 会自动接收 state 作为变量,因此您始终可以引用 Vuex 存储的状态
  • 突变不应该是异步的。在操作中获取/更新,然后派发突变只是为了更新您的数据
  • 使用Vue Resource 创建服务(或资源)将使获取/更新/删除资源更加容易。您可以将它们放在单独的文件中并将它们导入您的actions.js 以保持数据库检索逻辑分离。然后你会写FriendService.get({id: 1})而不是Vue.http.get('/users/1')。见https://github.com/vuejs/vue-resource/blob/master/docs/resource.md
  • Vuex 与 vue devtools 一起用于“时间旅行”。您可以查看已发生的每个突变的列表并倒带/重做它们。它非常适合调试和查看数据更改的位置。

【讨论】:

  • 感谢冗长的解释和帮助我,对我来说意义重大。只是一个问题;在这种情况下,我的友谊 API 调用方法实际上不必更新 vuex 存储。这些调用只是向 api 端点发出独立请求。我的应用程序的其他部分将使用 vuex。当这些方法实际上不需要更新商店时,是否仍然建议按照您的建议进行操作?
  • 如果您的应用程序中有任何其他视图想要了解好友列表,那么使用 Vuex 将是您的最佳选择。这样您就不必重新获取不同地方的朋友列表,并且您始终知道您已与数据库同步。但是,如果它超出了您的需要,那么涉及 Vuex 将只是额外的工作。在这种情况下,我会创建类似/services/Friends.js 的东西,它具有管理友谊的所有功能,因此您可以在任何需要的地方导入它。
  • 如果分开(vuex和本地组件数据),应该把数据库逻辑存放在哪里,才能从API获取数据?我认为不在 Vuex 目录中?在名为 api 的单独目录中?
  • 我应该只将 /services/ 目录用于不使用 Vuex 的组件的脚本吗?还是应该将此目录用于所有组件作为全局操作目录?并且,如果需要,从该脚本更新 Vuex?
猜你喜欢
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 2020-11-12
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多