【问题标题】:Passing data from route to router-view body将数据从路由传递到路由器视图主体
【发布时间】:2021-12-28 23:20:00
【问题描述】:

我有一个具有以下结构的单页应用程序。

|- App.vue
|- + Views  
|  |- Page.vue  
|- + Components  
|  |- Slider.vue  

编辑 1:感谢@gengar.value 的解决方案 我通过从Page.vue 传递参数解决了这个问题

 methods: {
    emitIndex: function (index) {
      this.$router.push({
        name: "visualization",
        params: { imgCat: "visualization", imgIndex: index },
      });
    },
  }

App.vue 包含路由Page.vuerouter-view 容器
Slider.vueApp.vue 的一个组件

我想将点击图像的索引和整个图像数据从Page.vue 传递给App.vue,然后再传递给Slider.vue,以实现Slider 与Page 的解耦以实现可重用性目的。

如何从Page.vue 也传递用户选择的索引App.vue

我尝试过使用paramspropsemit但失败了。

示例Page.vue

<template>
    <div v-for="(item, index) in 3" :key="index"></div>
</template>

<script>

export default ({
    data() {
        return {
            urls: ['url1', 'url2', 'url3']
        }
    }
})
</script>

提前致谢

编辑 1:感谢@gengar.value 的解决方案

通过Page.vue 将参数推送到路由器并从Slider.vue 监听它解决了问题,如下所示:

Page.vue

 methods: {
    passIndex: function (index) {
      this.$router.push({
        name: "visualization",
        params: { imgCat: "visualization", imgIndex: index },
      });
    },
  }

Slider.vue

watch: {
    "$route.params.imgCat": function (val) {
      this.state = val;
    },
    "$route.params.imgIndex": function (newVal) {
      if (newVal != -1) this.imgState = newVal;
      this.$router.push({ params: { imgIndex: -1 } });
    }

【问题讨论】:

标签: vue.js parameter-passing vue-router


【解决方案1】:

我的解决方案有点复杂,但非常原生,因为我只使用了 Props 和 Emit。

您想在兄弟组件之间传递值,因此您可以简单地尝试以下方式:

App.vue

<template>
  <div>
    <Page :data="data" @syncData="syncData" />
    <Slider :data="data" />
  </div>
<template>

<script>
import Page from './Views/Page.vue'
import Slider from './Components/Slider.vue'

export default ({
  components: {
    Page,
    Silder
  },
  data() {
    return {
      data: []  // init data in the parent component
    }
  },
  methods: {
    syncData(updatedImages) {
      this.data = updatedImages
    }
  }
})
</script>

页面.vue

<template>
  <div></div>
<template>

<script>

export default ({
  props: {
    data: { type: Array, default: () => [] }
  },
  methods: {
    onSelectImage(images) {
      this.$emit('syncData', images) // update selected data to App.vue
    }
  }
})
</script>

Slider.vue

<template>
  <div></div>
<template>

<script>

export default ({
  props: {
    data: { type: Array, default: () => [] }
  },
  watch: {
    data: {
      handler(val) {
        // when Page.vue emits updated data to App.vue,
        // App.vue will pass data to Slider.vue
        // and you could receive the updated data 'val' here
      },
      deep: true
    }
  }
})
</script>

更新:对不起,我之前误解了。如果你使用 vue-router 组件并分配了不同的路径(例如'/page'和'/slider'),你可以使用

this.$router.push({ path: '/path', query: selectedImage })

在 Page.vue 中并在 Slider.vue 中获取 url 查询。

替代方法可以使用 Cookie.js 或 sessionStorage(虽然不太好)。如果具体情况适合你,你也可以试试 Vuex。

【讨论】:

  • App.vue 中缺少 syncData 函数。 onSelectImage 未在 Page.vue 中设置单击事件。您没有将所选图像的索引传递给Slider.vue。 OP 说他尝试使用 emit,但无法使其工作。我很确定他需要有关如何使这项工作的微小细节的帮助。他不是在寻找大纲。
  • 感谢您的努力。但是,我不能将 Page.vue 声明为组件,它是路由对象。我不想在模板中使用它,而是直接听它的发射。
  • @bassxzero 你是对的。感谢您的评论。
  • @Mimayuki 那么我认为你可以在 Page.vue 中使用 this.$router.push({ path: '/path', query: selectedImage }) 并在 Slider.vue 中获取 url 查询,如果你正在为两个组件路由不同的路径。
  • @Mimayuki 您需要使用 vue-router 并在 router.js 中配置路由。在 main.js 中类似于 import Router from 'vue-router'export default new Router({ routes: [ { path: '/page', component: Page }, { path: '/slider', component: Slider } ] })。然后你可以通过查询推送 $router 并引导你在路由内重定向。
猜你喜欢
  • 2019-04-01
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-22
  • 2020-05-10
  • 1970-01-01
  • 2017-08-16
相关资源
最近更新 更多