vuex-router-sync 是做什么用的?

2024-06-19

据我所知vuex-router-sync只是为了同步routevuex store并且开发者可以访问route如下:

store.state.route.path
store.state.route.params

不过我也能应付route by this.$route哪个更简洁。

什么时候需要使用商店中的路由,什么场景下需要使用vuex-router-sync?


这是我的两分钱。你不需要导入vuex-router-sync如果您无法弄清楚它在项目中的用例,但当您尝试使用时可能需要它route对象在你的vuex的方法(this.$route在 vuex 领域不能很好地工作)。

我想在这里举一个例子。
假设您想在一个组件中显示一条消息。您想要显示一条消息,例如Have a nice day, Jack几乎在每个页面中,除了以下情况Welcome back, Jack当用户浏览首页时应该显示。

您可以在以下工具的帮助下轻松实现vuex-router-sync.

const Top = {
  template: '<div>{{message}}</div>',
  computed: {
    message() {
      return this.$store.getters.getMessage;
    }
  },
};
const Bar = {
  template: '<div>{{message}}</div>',
  computed: {
    message() {
      return this.$store.getters.getMessage;
    }
  }
};

const routes = [{
    path: '/top',
    component: Top,
    name: 'top'
  },
  {
    path: '/bar',
    component: Bar,
    name: 'bar'
  },
];

const router = new VueRouter({
  routes
});

const store = new Vuex.Store({
  state: {
    username: 'Jack',
    phrases: ['Welcome back', 'Have a nice day'],
  },
  getters: {
    getMessage(state) {
      return state.route.name === 'top' ?
        `${state.phrases[0]}, ${state.username}` :
        `${state.phrases[1]}, ${state.username}`;
    },
  },
});

// sync store and router by using `vuex-router-sync`
sync(store, router);

const app = new Vue({
  router,
  store,
}).$mount('#app');












// vuex-router-sync source code pasted here because no proper cdn service found
function sync(store, router, options) {
  var moduleName = (options || {}).moduleName || 'route'

  store.registerModule(moduleName, {
    namespaced: true,
    state: cloneRoute(router.currentRoute),
    mutations: {
      'ROUTE_CHANGED': function(state, transition) {
        store.state[moduleName] = cloneRoute(transition.to, transition.from)
      }
    }
  })

  var isTimeTraveling = false
  var currentPath

  // sync router on store change
  store.watch(
    function(state) {
      return state[moduleName]
    },
    function(route) {
      if (route.fullPath === currentPath) {
        return
      }
      isTimeTraveling = true
      var methodToUse = currentPath == null ?
        'replace' :
        'push'
      currentPath = route.fullPath
      router[methodToUse](route)
    }, {
      sync: true
    }
  )

  // sync store on router navigation
  router.afterEach(function(to, from) {
    if (isTimeTraveling) {
      isTimeTraveling = false
      return
    }
    currentPath = to.fullPath
    store.commit(moduleName + '/ROUTE_CHANGED', {
      to: to,
      from: from
    })
  })
}

function cloneRoute(to, from) {
  var clone = {
    name: to.name,
    path: to.path,
    hash: to.hash,
    query: to.query,
    params: to.params,
    fullPath: to.fullPath,
    meta: to.meta
  }
  if (from) {
    clone.from = cloneRoute(from)
  }
  return Object.freeze(clone)
}
.router-link-active {
  color: red;
}
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<script src="https://unpkg.com/vuex/dist/vuex.js"></script>

<div id="app">
  <p>
    <router-link to="/top">Go to Top</router-link>
    <router-link to="/bar">Go to Bar</router-link>
  </p>
  <router-view></router-view>
</div>

fiddle here http://jsfiddle.net/choasia/ej9jaaf4/

正如您所看到的,这些组件与vuex and vue-router的逻辑。
这种模式有时对于您不关心当前路由和 vuex getter 返回值之间的关系的情况非常有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vuex-router-sync 是做什么用的? 的相关文章

随机推荐

  • django-rest-framework - POST 请求返回“不允许使用方法\”GET\”。”

    我已经按照安装教程设置了 django rest auth 但我无法使用登录 API 端点 当我发送包含正确信息的 POST 请求时 我收到 405 状态错误 响应为 不允许方法 GET 但是 当我导航到实际 URL 并从在线表单发布它时
  • scala中的协变类型参数需要在java接口中保持不变

    我有一个看起来像这样的特征 一些进一步的信息可以在我自己提出了这个相关问题 https stackoverflow com questions 3695990 inheritance and automatic type conversio
  • TypeScript 中的类型安全谓词函数

    我的目标是编写谓词函数 isNull and isUndefined例如 在 TypeScript 中满足以下条件 可以独立使用 array filter isNull 可以逻辑组合 array filter and not isNull
  • 通过批处理文件自动化 cygwin

    长话短说 我们有多个服务器 我们每晚都在其上运行 perflog 监控 我的工作是将这些日志转换为 csv 格式并将它们发送到我的电子邮件 这一点已经通过前员工编写的 sh 脚本实现了自动化 我想要自动化的是在 perfmon 日志记录之后
  • 如何在ListView的TextCell中换行文本?

    如何在ListView的TextCell中换行文本 我尝试设置HasUnevenRows to True但这没有帮助 您不能使用 Xamarin 的 开箱即用 TextCell 功能 但是 您应该能够创建一个 ViewCell 并利用换行模
  • 无法从 iOS 中的框架访问 .nib(XIB) 文件

    我已经从现有的代码库中创建了一个框架 并尝试在新的代码库中使用它 这很好用 但是当我尝试访问属于我的框架包的一部分的 nib 文件时 我的应用程序崩溃了 这是我用来访问视图控制器 XIB 文件的代码 testViewController c
  • 显示班级图片 10 秒

    我有下面给出的代码显示9 boxes 其值如下digital time 还有一个班级box002显示digits相当于随机选择的九个盒子的值 box002 can be dragged to digital time starting wi
  • 将 VLMC 拟合到很长的序列

    我正在尝试将 VLMC 拟合到最长序列为 296 个状态的数据集 我这样做如下所示 Load libraries library PST library RCurl library TraMineR Load and transform d
  • 连接到 Revolut 沙盒

    我正在尝试创建与 Revolut 的客户端连接 我正在关注他们的tutorial https revolutdev github io business api getting started 但是我被困在兑换授权码 到目前为止我所做的 在
  • 为什么从 openAI 导入 Universe 模块时出现“无效语法”错误

    当我导入时universe来自 openAI 的模块 我收到以下错误 Traceback most recent call last File
  • iOS Safari Mobile 禁用上一个和下一个选择输入

    上周五我发现了关于此问题的类似问题 但似乎无法再次找到它 如果有人能指出我正确的方向 那就太好了 本质上我在一个页面上有多个选择菜单 第一个在加载时填充 第二个在第一个选择时填充 够简单的 但是 在 iOS 设备中 当您点击选择元素时 它会
  • 查找配对的 Android 蓝牙设备是否在范围内的正确方法?

    我想编写一个充当蓝牙客户端的应用程序 我想做的是找出最好的方法来确定我支持的特定设备是否在范围内 而不是一直尝试在其上执行 BluetoothDevice connect 并失败如果不在范围内 这里我们假设设备已经配对 恐怕在特定设备处于范
  • SQLAlchemy 与 count、group_by 和 order_by 使用 ORM

    我有几个函数需要使用 count group by 和 order by 进行一对多连接 我使用 sqlalchemy select 函数生成一个查询 该查询将返回一组 id 然后我对其进行迭代以对各个记录执行 ORM 选择 我想知道是否有
  • 从命令行运行 Maven 插件的语法是什么。

    我看到这里已经有人问过这个问题 如何从命令行执行maven插件 https stackoverflow com questions 12930656 how to execute maven plugin from command line
  • 每次我执行 docker compose up 时,Docker 都会创建一个新卷

    我有一个 docker compose 文件 可以启动多个服务 我刚刚收到一条错误消息 指出我的磁盘空间不足 因此我输入 docker system df 并看到我有 21 个卷 如果我有 3 个 docker 容器 每个容器都附加一个卷
  • Bazel:输出目录的genrule

    我刚刚开始与 Bazel 合作 所以 我提前道歉 我没能弄清楚这一点 我正在尝试运行一个命令 将一堆文件输出到一个目录 并使该目录可用于后续目标 我有两种不同的尝试 使用正则 写我自己的规则 我天真地希望能用一个来做到这一点genrule
  • 如何修复 getImageData() 错误画布已被跨源数据污染?

    我的代码在本地主机上运行得很好 但在网站上却不起作用 我从控制台收到此错误 对于这一行 getImageData x y 1 1 data Uncaught SecurityError Failed to execute getImageD
  • 在另一个 Rmd 中运行选定的块

    我已经在源 Rmd 文件中运行了分析 并且希望仅使用few来自源的块 我已经看到了一些关于从源 Rmd 中提取所有块的答案来自另一个 Rmd 中的 Rmd 文件的源代码 https stackoverflow com questions 4
  • 使用 Laravel 4 验证多个文件上传

    如何在 Laravel 4 中验证上传文件的数组 我已将其设置为允许多个文件 并且已测试这些文件是否存在于 Input file files 数组中 但如何验证每个文件呢 这是我尝试过的 notesData array date gt In
  • vuex-router-sync 是做什么用的?

    据我所知vuex router sync只是为了同步route与vuex store并且开发者可以访问route如下 store state route path store state route params 不过我也能应付route