Vue.js - 从 API 获取数据并在 Vuex 状态更改时重新加载组件

Posted

技术标签:

【中文标题】Vue.js - 从 API 获取数据并在 Vuex 状态更改时重新加载组件【英文标题】:Vue.js - Fetch Data from API and reload component on Vuex state change 【发布时间】:2021-09-28 01:20:07 【问题描述】:

我来自 jQuery 背景,最近才开始使用 Vue。我正在尝试尽可能多地学习,并且正在尝试开发一个简单的用户搜索和查看详细信息应用程序,但是我遇到了困难,似乎找不到继续前进的出路。

我有一个包含三个组件的布局 - Nav.vue、Search.vue、UserProfile.vue,如图所示。 UserProfile.vue 在路由器视图中。我正在使用状态为 userId 和 username 的 Vuex 存储,并且我已经定义了突变来提交状态更改。

当用户通过在搜索组件中提供用户名进行搜索时,我将从左侧边栏的 API 获取用户列表。当用户单击其中一个搜索结果时,我正在提交 userId 状态并希望从 API 中获取并使用从 Vuex 商店检索到的 userId 在 UserProfile 组件上显示用户配置文件。 UserProfile 组件位于路由器视图内。

Vuex store.js:

export default new Vuex.Store(

state: 
    userId:"",
    username: ""


mutations: 

  setUserId (state, payload) 
    state.userId = payload
  ,

  setUsername (state, payload) 
    state.user.username = payload
  ,


);

在 Search.vue

Search.vue (outside  <router-view />)
-------------------------------------
<a href="#" @click="viewProfile" class="btn btn-info" >View Profile</a>

methods: 

    viewProfile() 
        this.$store.commit("setUserId", this.userId);
        this.$store.commit("setUsername", this.username);
    

在 UserProfile.vue

我正在从计算属性的状态中获取 userId。

UserProfile.vue (inside  <router-view />)
-------------------------------------------

computed: 
    userId () 
      return this.$store.state.userId
    
  

现在我想从 API 获取数据并根据从 Vuex 存储中检索到的选定 userId 在 UserProfile 组件中显示数据,但我被卡住了。任何指针都会有所帮助。 提前致谢。

【问题讨论】:

做了哪些部分?你做过搜索吗?如果是这样,那么 @click="viewProfile(item)",在 viewProfile 中使用像 axios 这样的 HTTP 客户端来获取用户,但是你已经有了它们的详细信息,所以只需设置它,理想情况下你想针对命名空间存储,比如this.$store.commit("user/set", item);,然后设置成this.$store.state.user。然后它将保存为每个可以快速填写的用户属性添加修改器,还可以查看 mapState,它将 this.$store.state.user.username 减少为 this.user.username 【参考方案1】:

您的商店应包含状态、getter、突变和操作。 Getter 用于检索状态。 突变用于更新状态。 (突变只能从动作中使用) 操作用于提交突变。

您还可以在操作中从您的 Api 获取数据。 要使用操作,您可以使用以下语法: $store.dispach("action-name",payload) 载荷是可选的。

有关 vuex 的更多文档,请访问: https://vuex.vuejs.org/guide/actions.html#composing-actions

【讨论】:

【参考方案2】:

这就是我要做的。

viewProfile 方法中,在改变userIdusername 之后,我将从API 获取数据。实际上,我使用 Vuex actionsetUserIdsetUsername 突变将在 Vuex 操作中。 API 调用的参数将是userId,我们需要保存响应(配置文件数据),可以在 Vuex 或组件中。

我说当我们从搜索用户的结果中选择用户时,我们不需要更改 url。 UserProfile 组件只会渲染响应数据。

如果我们应该转到其他页面,例如localhost://users/:id,那么我们必须使用mounted 挂钩。 mounted 钩子是我们必须调用 fetch 函数以根据路由器参数 id 获取配置文件数据的地方。

【讨论】:

除了您的回答之外,我还按照 Traversy Media 的这个 Vuex 速成课程教程 youtube.com/watch?v=5lVQgZzLMHc 完全理解了流程。

以上是关于Vue.js - 从 API 获取数据并在 Vuex 状态更改时重新加载组件的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 api 从 axios 获取数据 - vue js

无法将 API JSON 数据呈现到 vue js 中的表

如何将从 API 获取的数组分配给 Vue.js 中的数据属性?

Vue js将数据从api发送到新页面

Vue.js 获取 Laravel API JSON 数据

Vue.js - 应该使用哪个组件生命周期来获取数据?