a标签传值到另一个页面_vue通信、传值的多种方式(详细)

本文详细介绍了Vue中不同组件间通信和传值的多种方式,包括通过路由带参数、Session Storage缓存、props父子传值、eventBus以及vuex状态管理。重点讲解了如何在实际场景中运用这些方法,帮助开发者理解并掌握Vue组件间数据流动的策略。
摘要由CSDN通过智能技术生成

后台看见有人需要了解vue传值,今天就来了解下

一、通过路由带参数进行传值

①两个组件 A和B,A组件通过query把orderId传递给B组件(触发事件可以是点击事件、钩子函数等)

this.$router.push({ path: '/conponentsB', query: { orderId: 123 } })

②在B组件中获取A组件传递过来的参数

this.$route.query.orderId

二、通过设置 Session Storage缓存的形式进行传递

①两个组件A和B,在A组件中设置缓存orderData

const orderData = { 'orderId': 123, 'price': 88 }

sessionStorage.setItem('缓存名称', JSON.stringify(orderData)

②B组件就可以获取在A中设置的缓存了

const dataB = JSON.parse(sessionStorage.getItem('缓存名称'))

此时 dataB 就是数据 orderData

朋友们可以百度下 Session Storage(程序退出销毁) 和 Local Storage(长期保存) 的区别。

三、父子组件之间的传值

1.父组件往子组件传值props

①定义父组件,父组件传递 number这个数值给子组件,如果传递的参数很多,推荐使用json数组{}的形式

0f8473f38c3069eed853eb80f28a0705.png

②定义子组件,子组件通过 props方法获取父组件传递过来的值。props中可以定义能接收的数据类型,如果不符合会报错。

e80f185d48a6dc6feee539e9d9b368ad.png

["number","string"]就可以了,中括号包裹,多个值使用,分隔。

③假如接收的参数 是动态的,比如 input输入的内容 v-model的形式

注意:传递的参数名称 支持驼峰命名,下图 描述不正确(1.0是不支持的)

b3472fa56e1607f4da4f36e70a7b2da4.png

5c4713e40f39bc70511fefb55bb576b2.png

④父子组件传值,数据是异步请求,有可能数据渲染时报错 原因:异步请求时,数据还没有获取到但是此时已经渲染节点了

解决方案:可以在 父组件需要传递数据的节点加上  v-if = false,异步请求获取数据后,v-if = true

(二)、子组件往父组件传值,通过emit事件

e353bf8c37b29c4721d8a3e4144fdcc3.png

e8065177c6f666737e81ee1a43e50304.png

四、不同组件之间传值,通过eventBus(小项目少页面用eventBus,大项目多页面使用 vuex)

①定义一个新的vue实例专门用于传递数据,并导出

98bfc69558f591499ef98217f1f88ee4.png

②定义传递的方法名和传输内容,点击事件或钩子函数触发eventBus.emit事件

a203fa6f6fb6cac4d9feafd0041e35e3.png

③接收传递过来的数据

注意:enentBus是一个另一个新的Vue实例,区分两个this所代表得vue实例

90cc19e185552c662eefa2c85b0f0b75.png

五、vuex进行传值

为什么使用vuex?

vuex主要是是做数据交互,父子组件传值可以很容易办到,但是兄弟组件间传值(兄弟组件下又有父子组件),或者大型spa单页面框架项目,页面多并且一层嵌套一层的传值,异常麻烦,用vuex来维护共有的状态或数据会显得得心应手。

需求:两个组件A和B,vuex维护的公共数据是 餐馆的名称 resturantName,默认餐馆名称是 飞歌餐馆,那么现在A和B页面显示的就是飞歌餐馆。如果A修改餐馆名称 为 A餐馆,则B页面显示的将会是 A餐馆,反之B修改同理。这就是vuex维护公共状态或数据的魅力,在一个地方修改了数据,在这个项目的其他页面都会变成这个数据。

4cc83228e3e9173a9a15010edd3fcee3.png

①使用 vue-cli脚手架工具创建一个工程项目,工程目录,创建组件A和组件B路由如下:

7d8a1976cc42722b2309d59481d9862b.png

路由如下:

import Vue from 'vue'

import Router from 'vue-router'

import componentsA from '@/components/componentsA'

import componentsB from '@/components/componentsB'

Vue.use(Router)

export default new Router({

mode: 'history',

routes: [

{

path: '/',

name: 'componentsA',

component: componentsA

},

{

path: '/componentsA',

name: 'componentsA',

component: componentsA

},

{

path: '/componentsB',

name: 'componentsB',

component: componentsB

}

]

})

app.vue

id="app">

export default {

name: 'App'

}

#app {

font-family: 'Avenir', Helvetica, Arial, sans-serif;

-webkit-font-smoothing: antialiased;

-moz-osx-font-smoothing: grayscale;

text-align: center;

color: #2c3e50;

margin-top: 60px;

}

②开始使用vuex,新建一个 sotre文件夹,分开维护 actions mutations getters

7f6128bbf0e76fb78986d3ec84c97677.png

②在store/index.js文件中新建vuex 的store实例

*as的意思是 导入这个文件里面的所有内容,就不用一个个实例来导入了。

import Vue from 'vue'

import Vuex from 'vuex'

import * as getters from './getters' // 导入响应的模块,*相当于引入了这个组件下所有导出的事例

import * as acti

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值