向路由组件传递数据

1、需求:点击对应的message显示该message的详情

2、步骤

2.1、在src/router/index.js中配置路由时使用占位符指定需要的传参

/*
路由器模块
 */

// 引入Vue
import Vue from ‘vue‘

// 引入路由器插件
import VueRouter from ‘vue-router‘

// 引入路由组件
import About from ‘../views/About‘
import Home from ‘../views/Home‘
import News from ‘../views/News‘
import Message from ‘../views/Message‘
import MessageDetail from ‘../views/MessageDetail‘

// 声明使用路由器插件
Vue.use(VueRouter)

// 向外暴露路由器对象。这里为默认暴露,则引入的时候可使用任何名字
export default new VueRouter({
  // 配置N个路由
  // path指定路由地址
  // component指定路由地址对应的路由组件
  // redirect重定向到某个路由
  routes: [
    {
      path: ‘/about‘,
      component: About
    },
    {
      path: ‘/home‘,
      component: Home,
      // children配置嵌套路由
      children: [
        {
          path: ‘/home/news‘,
          component: News
        },
        {
          path: ‘message‘, // 等效于/home/message
          component: Message,
          children: [
            {
              path: ‘/home/message/detail/:id‘, // 使用占位符向路由组件传递参数,参数名为id
              component: MessageDetail
            }
          ]
        },
        {
          path: ‘‘, // 路径/home时会自动跳转到路径/home/news
          redirect: ‘/home/news‘
        }
      ]
    },
    {
      // 访问项目根路径时重定向到/about路由
      path: ‘/‘,
      redirect: ‘/about‘
    }
  ]
})

2.2、在message详情组件的父组件Message组件中为message详情组件传参

<template>
  <div>
    <ul>
      <li v-for="item in messages" :key="item.id">
        <!--向message详情组件传参-->
        <router-link :to="`/home/message/detail/${item.id}`">{{item.title}}</router-link>
      </li>
    </ul>
    <hr>
    <router-view></router-view>
  </div>
</template>

<script>
export default {
  data () {
    return {
      messages: []
    }
  },
  mounted () {
    setTimeout(() => {
      this.messages = [
        {
          id: 1,
          title: ‘message01‘
        },
        {
          id: 2,
          title: ‘message02‘
        },
        {
          id: 3,
          title: ‘message03‘
        }
      ]
    }, 1000)
  }
}
</script>

<style scoped>

</style>

2.3、在message详情组件MessageDetail中通过$route获取传参的值

<template>
  <ul>
    <!--显示路由组件传参-->
    <p>id:{{$route.params.id}}</p>
    <li v-for="(value, key) in messageDetail" :key="key">
      {{key}} : {{value}}
    </li>
  </ul>
</template>

<script>
export default {
  data () {
    return {
      messageDetails: [],
      messageDetail: {}
    }
  },
  mounted () {
    setTimeout(() => {
      this.messageDetails = [
        {
          id: 1,
          title: ‘message01‘,
          content: ‘content01‘
        },
        {
          id: 2,
          title: ‘message02‘,
          content: ‘content02‘
        },
        {
          id: 3,
          title: ‘message03‘,
          content: ‘content03‘
        }
      ]
      // 数据的find方法,当detail.id === this.$route.params.id * 1成立时返回
      // this.$route.params.id * 1 时将this.$route.params.id转为Number类型
      this.messageDetail = this.messageDetails.find(detail => detail.id === this.$route.params.id * 1)
    }, 1000)
  },
  watch: {
    // 由于只有参数值发生变化时,不会重新加在路由组件
    // 因此这里通过监视$route来实现重新加在路由组件的效果
    $route: function (value) {
      this.messageDetail = this.messageDetails.find(detail => detail.id === value.params.id * 1)
    }
  }
}
</script>

<style scoped>

</style>

3、使用query参数传参相关代码

3.1、src/router/index.js

/*
路由器模块
 */

// 引入Vue
import Vue from ‘vue‘

// 引入路由器插件
import VueRouter from ‘vue-router‘

// 引入路由组件
import About from ‘../views/About‘
import Home from ‘../views/Home‘
import News from ‘../views/News‘
import Message from ‘../views/Message‘
import MessageDetail from ‘../views/MessageDetail‘

// 声明使用路由器插件
Vue.use(VueRouter)

// 向外暴露路由器对象。这里为默认暴露,则引入的时候可使用任何名字
export default new VueRouter({
  // 配置N个路由
  // path指定路由地址
  // component指定路由地址对应的路由组件
  // redirect重定向到某个路由
  routes: [
    {
      path: ‘/about‘,
      component: About
    },
    {
      path: ‘/home‘,
      component: Home,
      // children配置嵌套路由
      children: [
        {
          path: ‘/home/news‘,
          component: News
        },
        {
          path: ‘message‘, // 等效于/home/message
          component: Message,
          children: [
            {
              path: ‘/home/message/detail‘,
              component: MessageDetail
            }
          ]
        },
        {
          path: ‘‘, // 路径/home时会自动跳转到路径/home/news
          redirect: ‘/home/news‘
        }
      ]
    },
    {
      // 访问项目根路径时重定向到/about路由
      path: ‘/‘,
      redirect: ‘/about‘
    }
  ]
})

3.1、Message组件

<template>
  <div>
    <ul>
      <li v-for="item in messages" :key="item.id">
        <!--向message详情组件传参,使用query参数-->
        <router-link :to="`/home/message/detail/?id=${item.id}`">{{item.title}}</router-link>
      </li>
    </ul>
    <hr>
    <router-view></router-view>
  </div>
</template>

<script>
export default {
  data () {
    return {
      messages: []
    }
  },
  mounted () {
    setTimeout(() => {
      this.messages = [
        {
          id: 1,
          title: ‘message01‘
        },
        {
          id: 2,
          title: ‘message02‘
        },
        {
          id: 3,
          title: ‘message03‘
        }
      ]
    }, 1000)
  }
}
</script>

<style scoped>

</style>

3.2、MessageDetail组件

<template>
  <ul>
    <!--显示路由组件传参-->
    <p>id:{{$route.query.id}}</p>
    <li v-for="(value, key) in messageDetail" :key="key">
      {{key}} : {{value}}
    </li>
  </ul>
</template>

<script>
export default {
  data () {
    return {
      messageDetails: [],
      messageDetail: {}
    }
  },
  mounted () {
    setTimeout(() => {
      this.messageDetails = [
        {
          id: 1,
          title: ‘message01‘,
          content: ‘content01‘
        },
        {
          id: 2,
          title: ‘message02‘,
          content: ‘content02‘
        },
        {
          id: 3,
          title: ‘message03‘,
          content: ‘content03‘
        }
      ]
      // 数组的find方法,当detail.id === this.$route.query.id * 1成立时返回
      // this.$route.query.id * 1 是将this.$route.query.id转为Number类型
      this.messageDetail = this.messageDetails.find(detail => detail.id === this.$route.query.id * 1)
    }, 1000)
  },
  watch: {
    // 由于只有参数值发生变化时,不会重新加在路由组件
    // 因此这里通过监视$route来实现重新加在路由组件的效果
    $route: function (value) {
      this.messageDetail = this.messageDetails.find(detail => detail.id === value.query.id * 1)
    }
  }
}
</script>

<style scoped>

</style>

4、通过<router-view msg="aaa"></router-view>向路由组件传参

备注:参数名只能为msg,且在路由组件中需通过props接收,比如props: [‘msg‘]

4.1、传参相关代码

<router-view msg="aaa"></router-view>

4.2、接收参数相关代码

<template>
  <ul>
    <!--显示通过router-view传参的参数值-->
    <p>{{msg}}</p>
    <!--显示路由组件传参-->
    <p>id:{{$route.query.id}}</p>
    <li v-for="(value, key) in messageDetail" :key="key">
      {{key}} : {{value}}
    </li>
  </ul>
</template>

<script>
export default {
  props: [‘msg‘], // 接收router-view传参
  data () {
    return {
      messageDetails: [],
      messageDetail: {}
    }
  },
  mounted () {
    setTimeout(() => {
      this.messageDetails = [
        {
          id: 1,
          title: ‘message01‘,
          content: ‘content01‘
        },
        {
          id: 2,
          title: ‘message02‘,
          content: ‘content02‘
        },
        {
          id: 3,
          title: ‘message03‘,
          content: ‘content03‘
        }
      ]
      // 数组的find方法,当detail.id === this.$route.query.id * 1成立时返回
      // this.$route.query.id * 1 是将this.$route.query.id转为Number类型
      this.messageDetail = this.messageDetails.find(detail => detail.id === this.$route.query.id * 1)
    }, 1000)
  },
  watch: {
    // 由于只有参数值发生变化时,不会重新加在路由组件
    // 因此这里通过监视$route来实现重新加在路由组件的效果
    $route: function (value) {
      this.messageDetail = this.messageDetails.find(detail => detail.id === value.query.id * 1)
    }
  }
}
</script>

<style scoped>

</style>

原文地址:https://www.cnblogs.com/liuyang-520/p/12681166.html

时间: 2024-08-30 00:15:07

向路由组件传递数据的相关文章

(尚043) vue_向路由组件传递数据+vue param和query两种传参方式

效果展示: ============================================================================ 应写成下图这种形式: :id为占位 现在是通过什么路径向路由组件传递数据的? 通过请求参数${message.id}传递的 请求参数有两种: 1).Param 2).Query  (?后面,类似于get) ================================================================

vuejs子组件向父组件传递数据

子组件通过$emit方法向父组件发送数据,子组件在父组件的模板中,通过自定义事件接收到数据,并通过自定义函数操作数据 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script type="text/javascript" src="

vue组件-#构成组件-父组件向子组件传递数据

组件对于vue来说非常重要,学习学习了基础vue后,再回过头来把组件弄透! 一.概念 组件意味着协同工作,通常父子组件会是这样的关系:组件 A 在它的模版中使用了组件 B . 它们之间必然需要相互通信:父组件要给子组件传递数据,子组件需要将它内部发生的事情告知给父组件. 在 Vue.js 中,父子组件的关系可以总结为 props down, events up . 父组件通过 props 向下传递数据给子组件,子组件通过 events 给父组件发送消息. 看看它们是怎么工作的.        

Angular 4 路由时传递数据

路由时传递数据的方式有 1. 在查询参数中传递数据 2. 在路由路径中传递参数 3. 在路由配置中传递参数 一.在查询参数中传递数据 在前一节的基础上,我们增加路由数据传递 2. 接收参数的地方 3. 显示产品ID 4. 效果图 二.路径中传递参数 1. 修改路由配置 2. 使用路径调用 3. 接收 4. 效果图 三.参数快照和参数订阅 snapshot参数快照 参数订阅  可以自己路由到自己 如product/1 路由到prodct/2

总结一下微信小程序中父子兄弟组件传递数据

常规的这种写法就是父组件在向子组件传递数据 子组件向父组件传递数据主要通过监听事件 比如like点赞功能触发了一个like事件 父组件通过绑定like事件来监听 对应事件: 原文地址:https://www.cnblogs.com/rmty/p/10914342.html

vue2中component父子组件传递数据props的使用

子组件使用父亲传过来的数据,我们需要通过子组件的 props 选项. 组件实例的作用域是孤立的,不能在子组件的模板内直接引用父组件的数据.修改父亲传过来的props数据的时候 父亲必须传递对象,否则不能修改. 现在是传递对象的语法 app.vue(父组件): <style scoped lang='stylus'> </style> <template> <div> <h1>我是app组件</h1> <zujian :data=

vue兄弟组件传递数据

在main.js里面设置data{eventHub:new Vue() } new Vue({ el: '#app', router, store, template: '<App/>', components: { App }, data:{ eventHub:new Vue() // 在main.js设置所有组件都能用调用 }, }) 我们再组件一设置一个事件调用组件二的事件,传递数据给组件二 <template> <div v-on:click="on()&q

vue组件-子组件向父组件传递数据-自定义事件

自定义事件 我们知道,父组件是使用 props 传递数据给子组件,但如果子组件要把数据传递回去,应该怎样做?那就是自定义事件!

vue 父子组件传递数据

单向数据流: 数据从父级组件传递给子组件,只能单向绑定. 子组件内部不能直接修改从父级传递过来的数据. 解决方法: 可以使用data将父组件传递过来的数据拷贝一份存放起来,再修改拷贝的数据就可以了 //用data来解决不能修改父组件传递的数据的问题, // 我们新增一个number保存父组件传递过来的数据,这样就可以修改数据的值了 data:function(){ return { number: this.count } }, 数据就可以修改了: methods:{ handleclick:f