vue router传参方式、接受方式

三:冒号的形式传递传参

优势:页面刷新参数不会丢失, 劣势: 需要一一配置

在router路由配置文件里路径后面加上传递的参数: /:id/:title

{
 path: '/infoDetailed/:id/:title',
  name: "InfoDetailed",
  hidden: true,
  meta: {
    name: "信息详情"
  },
  component: ()=> import("../views/Info/detailed")
}

在.vue文件里:
传参数方式:

methods: {
	//路由跳转传参
	lookCategoryItem(data) {
	  this.$router.push({
	    path:`/infoDetailed/${daata.id}/${data.title}`
	  })
	}
}

接收方式:
可以直接在template标签上接收,但不建议
{{ $route.params.newsId }}
{{ $route.params.newsTitle }}

四: vuex结合HTML本地存储

优势:参数不显示, 劣势: 稍微有点大材小用(解决第二种传参参数丢失)

在store文件下创建一个 modules 文件,文件下在创建一个infoDetailed.js文件
在这里插入图片描述

infoDetailed.js:

const state = {
    // 定义变量
     // 一开始跳转时,这里的 id值 和 title值 是从跟下面mutations里SET_ID方法获取的,
     // 刷新页面时,因为是使用this.$router.push({name: 'InfoDetailed', params: {id: data.id,title: data.title}}),这种方式去跳转传参的,页面刷新时不会保留数据,
    //  页面刷新后,vuex的值就不存在了,然后获取到的值是空值的时候,就从本地存储中获取
    id: '' || JSON.parse(sessionStorage.getItem('infoId')), 
    title: '' || JSON.parse(sessionStorage.getItem('infoTitle'))
}
const getters = {
	// 从这里就知道是否拿到值了, 配置好这里,就可以在页面中获取值了
    infoId: state => state.id,
    infoTitle: state => state.title
}
const mutations = {
	// 比较传统的方法
    // 把传进来的值存储起来
    SET_ID (state, value) {
        // 把传进来的值赋值给上面state定义的变量中
        state.id = value
        // HTML5本地存储,把传过来的值存到本地, 因为本地存储只能存储的是字符串类型的数据,
        // 所以需要用 JSON.stringify(value) 把格式转换一下
        sessionStorage.setItem('infoId', JSON.stringify(value))
    },
    SET_TITLE (state, value) {
        state.title = value
        // HTML5本地存储,把传过来的值存到本地
        sessionStorage.setItem('infoTitle', value)
    },
    // 改良的方法, 二选一
    UPDATE_STATE_VALUE (state, params) {
        // JSON的 (for in) 循环方法
        for (let key in params) {
            // 因为传过来的值是一一对应的,所以
            // 存值
            state[key] = params[key].value
            // 是否存储session
            if (params[key].session) {
                // HTML5本地存储,把传过来的值存到本地
                sessionStorage.setItem(params[key].sessionKey, params[key].value)
            }
        }
    }
}
const actions = {

}

export default {
    namespaced: true, // 解决命名空间问题,防止命名冲突
    // 把上面的都暴露出去
    state,
    getters,
    mutations,
    actions
}

然后,在store文件下的index.js文件中引入

index.js::

import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);

import app from './modules/app.js'
import login from './modules/login.js'
import common from './modules/common.js'
// 路由跳转传参
import infoDetailed from './modules/infoDetailed'

export default new Vuex.Store({
  modules: {
    app,
    login,
    common,
    infoDetailed
  }
});

跳转后的页面index.vue 页面:

// 方法
  methods: {
    getData () {
      1./**
       * 当页面刷新时,所有的值全部都被清空了,vuex和sessionStorage的都被清空了,为什么呢?
       * 因为这里的代码又被执行了一次,当再次执行时,已经拿不到  this.$route.params.id  这个值了,因为传参方式页面刷新不保留
       * 然后执行 this.$store.commit('infoDetailed/SET_ID', id)和
       * this.$store.commit('infoDetailed/SET_TITLE', title) 时,是空的
       */
      //  进来发现 this.$route.params.id 有值,就使用,没有,则执行后面  this.$store.getters['infoDetailed/infoId'] 拿值
      //          vuex的值                          sessionStorage的值
      let id = this.$route.params.id || this.$store.getters['infoDetailed/infoId']
      let title = this.$route.params.title || this.$store.getters['infoDetailed/infoTitle']
      // console.log('id' + id)
      // console.log('title' + title)
      // 调用store/modules/infoDetailed.js里的 SET_ID 和 SET_TITLE 这两个方法
      2. // 这两行代码放到跳转前的页面里,看下面 ⬇
      // this.$store.commit('infoDetailed/SET_ID', id)          
      // this.$store.commit('infoDetailed/SET_TITLE', title)
      
      console.log('infoId:' + this.$store.getters['infoDetailed/infoId'])
      console.log('infoTitle:' + this.$store.getters['infoDetailed/infoTitle'])
    }
  }

跳转前的页面 index.vue:

// 查看信息列表
lookCategoryItem(index, data) {
  console.log('跳转信息详情页',  data )
  3.// 所以把存值的步骤放到这里来
  // this.$store.commit('infoDetailed/SET_ID', data.id)
  // this.$store.commit('infoDetailed/SET_TITLE', data.id) 

// 改良的方法, 二选一
  this.$store.commit('infoDetailed/UPDATE_STATE_VALUE',  {
    id: {
      value: data.id,
      sessionKey: 'infoId',
      session: true
    },
    title: {
      value: data.title,
      sessionKey: 'infoTitle',
      session: true
    }
  });
  this.$router.push({
    name: 'InfoDetailed',
    params: {
      id: data.id,
      title: data.title
    }
  })
}

五、新窗口打开

优势:参数不显示, 劣势: 稍微有点大材小用(解决第二种传参参数丢失)

这种方法用的比较少,因为vue是一个单页面应用,所以不是很符合,但有些特殊情况需要用到,还是要这么做

HTML标签传参方法

<router-link tag="a" target="_blank" to="{name:'searchGoods', params: {catId: 0}, query: {keywords: '手机'}}">热门好货</router-link>

注意: vue1 不支持

js传参方法


 let routerData = this.$route.resole({
    name: "searchGoods",
    // 第一种传参方式
    query: params,
    // 第二种传参方式, 两者二选一
    params: {
      catId: params.catId
    }
  })

获取数据方法

window.open(routerData.href, '_blank')
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值