【问题标题】:How persist some state between routes with vue & vue-router如何使用 vue 和 vue-router 在路由之间保持一些状态
【发布时间】:2019-02-28 11:12:51
【问题描述】:

我有一个导航流程包含在

SearchPage -> ...Others or SearchPage -> ...Others or SearchPage ->

并且想要在返回时保留搜索字符串。

<template id="ListCustomersPage">
<q-layout>
  <q-layout-header>
    <toolbar :title="title" :action="doCreate" label="New"></toolbar>
    <q-search inverted placeholder="Type Name, Code, Nit, Phone Number or Email" float-label="Search" v-model="search" />
    <q-btn icon="search" color="secondary" @click="doSearch" />
  </q-layout-header>
</q-layout>
</template>

现在的问题是,当用户可以在其他地方导航时,如何将查询堆栈与路由器之一关联起来。

P.D 全部在一个页面中。如果可以保留屏幕而不刷新它们(但仅限于搜索页面,直到弹出)会更好。

【问题讨论】:

    标签: vue.js vue-router quasar-framework


    【解决方案1】:

    选项 1:导航守卫

    您可以使用所谓的Navigation Guard,它允许您在路由更新之前、之后和之后添加全局操作。您还可以使用In-component Guards 将其直接添加到您的组件中,这将允许您保留search 数据的内容。

    const VueFoo = {
       // I guess your search attribute is in your data
        data() {
          return {
            search: ''
          }
      },
      mounted() {
          // retrieve your information from your persistance layer
      },
      beforeRouteLeave (to, from, next) {
        // called when the route that renders this component is about to
        // be navigated away from.
        // has access to `this` component instance.
    
         // persist this.search in localstorage or wherever you like it to be stored
      }
    }
    

    选项 2:使用 (Vuex) 存储

    如果您能够添加 Vuex Store 或任何类似的商店,我强烈建议您这样做。既然你标记了类星体,我想链接到那里提供的Vuex Store Documentation。您基本上可以将您的 search 属性外包,并让 Store 在您的应用程序中为您持久保存它。

    import Vue from 'vue'
    import Vuex from 'vuex'
    Vue.use(Vuex)
    const store = new Vuex.Store({
      state: {
        search_term: ''
      },
      mutations: {
        SET_SEARCH_TERM (state, payload) {
          state.search_term = payload.search_term
        }
      },
      actions: {
        SEARCH ({ commit, state }, payload) {
          commit('SET_SEARCH_TERM', payload.search_term)
    
          // your api call to search which can also be stored in the state
        }
      }
    })
    export default store
    

    在您希望使用突变(未绑定到操作)保留搜索查询的组件中:

    store.commit('SET_SEARCH_TERM', {
      search_term: this.search // your local search query
    })
    

    在您的代码中,如果您想在每次搜索期间都坚持,您会触发搜索 ACTION

    store.dispatch('SEARCH', {
      search_term: this.search
    })
    

    访问属性search_term 或者您想调用它可以使用计算属性来完成。你也可以直接绑定状态和突变,而不需要导航守卫:

    // your Vue component
    computed: {
      search: {
        get () {
          return this.$store.state.search_term
        },
        set (val) {
          this.$store.commit('SET_SEARCH_TERM', { search_term: val })
        }
      }
    }
    

    使用前请务必了解基本概念:https://vuex.vuejs.org/

    【讨论】:

    • 我有一家商店,但问题是当用户完成工作流程时,搜索必须重置为下一个。那么如何知道循环何时开始或清除搜索呢?
    • 为什么不让用户决定呢?您可以选择一个复选框,允许它们保留并引入一个明确的搜索词按钮,或者您可以默认保留并仅添加该按钮 - 如果您无法确定它是否是新搜索的开始,这些是在不了解您的项目的情况下我能想到的选项。
    • 对于这种情况,每次都必须清除搜索。用于创建发票/订单。我的主要问题是如何检测我何时启动工作流并清除堆栈中的其余搜索。
    猜你喜欢
    • 2023-02-09
    • 2019-09-29
    • 2020-07-19
    • 2017-06-05
    • 2023-03-06
    • 2019-08-13
    • 2017-07-25
    • 2020-08-11
    • 2019-01-05
    相关资源
    最近更新 更多