亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Vue傳參一籮筐(頁面、組件)

2019-11-19 11:53:39
字體:
來源:轉載
供稿:網友

Vue頁面、組件之間傳參方式繁多,此處羅列出常用的幾種方式,歡迎審閱補充。

一丶路由傳參

這里的路由傳參以編程式 router.push(...) 為例,聲明式 <router-link :to="..."> 與之類似。此處模擬情景為從 componentsA.vue 頁面跳轉到 componentsB.vue 頁面傳參。首先,路由配置信息如下:

router.js

import Vue from 'vue'import Router from 'vue-router'import componentsA from './components/componentsA' //在components下創建componentsA.vueimport componentsB from './components/componentsB' //在components下創建componentsB.vueVue.use(Router)export default new Router({	routes:[		{			path:'/componentsA',			name:'componentsA',			component:componentsA		},		{			path:'/componentsB',			name:'componentsB',			component:componentsB		}	]})

1.1 路由配置傳參

首先確定自己要傳的參數名,將路由配置修改一下,傳name,age,sex三個參數:

{			path:'/componentsB/:name/:age/:sex',			name:'componentsB',			component:componentsB		}

componentsA.vue 頁面通過 this.$router.push 配置與之對應的參數:

componentsA.vue

<template>	<div>		<div>我是組件A</div>		<button @click='routerToB1'>方式一跳轉到組件B</button>	</div></template><script>	export default{		data(){			return{				person:{name:'Gene',age:'18',sex:'male'}			}		},		methods: {			routerToB1() {				this.$router.push({					path:`componentsB/${this.person.name}/${this.person.age}/${this.person.sex}`				})			}		},	}</script><style></style>

然后在 componentsB.vue 頁面用 this.$route.params 接收參數:

componentsB.vue

<template>	<div>		<div>我是組件B</div>	</div></template><script>	export default{		created(){			this.getRouterData()		},		methods: {			getRouterData(){				const param = this.$route.params				console.log(param)//{name:'Gene',age:'18',sex:'male'}			}		},	}</script><style></style>

點擊按鈕"方式一跳轉到組件B",componentsB頁面打印出 {name:'Gene',age:'18',sex:'male'} ,成功獲取到A頁面傳過來的參數,并且地址欄顯示為 localhost:8889/#/componentsB/Gene/18/male (端口號根據自己設置的來),表明這種傳參方式url會攜帶參數。

1.2 params傳參

首先將剛才路由配置修改部分還原,在 componentsA.vue 頁面添加按鈕"方式二跳轉到組件B":

componentsA.vue

<template>	<div>		<div>我是組件A</div>		<button @click='routerToB1'>方式一跳轉到組件B</button>		<button @click='routerToB2'>方式二跳轉到組件B</button>	</div></template>

methods 中添加方法 routerToB2 ,使用路由屬性 name 來確定匹配的路由,使用屬性 params 來傳遞參數:

componentsA.vue

		routerToB2(){				this.$router.push({					name:'componentsB',					params:{						exa:'我是傳到組件B的參數'					}				})			},

componentsB.vue 保持不變,params傳參方式獲取參數也是通過 this.$route.params ,點擊A頁面新添加的按鈕"方式二跳轉到組件B",在B頁面打印出 {exa: "我是傳到組件B的參數"} ,傳參成功,地址欄為 localhost:8889/#/componentsB ,表明這種方式url不會攜帶參數。

1.3 query傳參

這種方式和params傳參方式類似,在 componentsA.vue 頁面繼續添加按鈕"方式三跳轉到組件B":

componentsA.vue

<template>	<div>		<div>我是組件A</div>		<button @click='routerToB1'>方式一跳轉到組件B</button>		<button @click='routerToB2'>方式二跳轉到組件B</button>		<button @click='routerToB3'>方式三跳轉到組件B</button>	</div></template>

methods 中添加方法 routerToB3 ,使用路由屬性 name 或者 path 來確定匹配的路由,使用屬性 query 來傳參:

componentsA.vue

routerToB3(){				this.$router.push({					name:'componentsB',// path:'/componentsB'					query:{						que:'我是通過query傳到組件B的參數'					}				})			}

componentsB.vue 頁面通過 this.$route.query 來獲取參數:

componentsB.vue

getRouterData(){				const query = this.$route.query				console.log(query)//{que: "我是通過query傳到組件B的參數"}			}

查看地址欄為 localhost:8889/#/componentsB?que=我是通過query傳到組件B的參數 ,顯然這種方式url會攜帶參數。

1.4 小結

  • 路由配置傳參注意書寫格式 /:id ,獲取參數都是通過 $route 而不是 $router
  • params 傳參和 query 傳參區別類似于 postget 方法。 params 傳參地址欄不會顯示參數,而 query 傳參會將參數顯示在地址欄中
  • params 傳參刷新頁面參數會丟失,另外兩種不會
  • params 傳參對應的路由屬性是 name ,而 query 傳參對應的路由屬性既可以是 name ,也可以是 path

二丶使用緩存

緩存方式即通過 sessionStorage 、 localStorage 、 Cookie 方式傳參,這種方式和是不是用Vue無關,因此,不談。

三丶父子組件之間傳值

在components目錄下創建父組件 parent.vue 和子組件 children.vue ,在父組件中引入子組件。為了演示方便,在路由配置中加入 /parent 路徑。

3.1 父組件向子組件傳值 props

parent.vue 的子組件標簽上注冊message1,在 children.vue 中通過 props 接收message1,如果傳遞的值為變量,則使用 v-bind: 或直接用 : ,參考如下:

parent.vue

<template>	<div>		<div>我是父組件</div>		<children message1='我是直接參數' v-bind:message2='msg' :message3='obj'></children>	</div></template><script>	import Children from './children'	export default{		components:{			Children		},		data(){			return{				msg:'我是父組件的參數'			}		},		created(){			this.obj = {a:'1',b:'2',c:'3'}		}	}</script><style></style>

children.vue

<template>	<div>		<div>我是子組件</div>		<div>{{message1}}</div>		<div>{{message2}}</div>		<div>{{message3}}</div>	</div></template><script>	export default{		props:['message1','message2','message3'],		created(){			console.log(this.message3)		}	}</script><style></style>

在瀏覽器中打開:

3.2 子組件向父組件傳值 $emit

子組件通過vm.$emit( event, […args] ),觸發當前實例上的事件。附加參數都會傳給監聽器回調。父組件在子組件標簽上監聽事件獲得參數。

children.vue

<template>	<div style="margin-top: 100px;">		<div>我是子組件</div>		<div>{{message1}}</div>		<div>{{message2}}</div>		<div>{{message3}}</div>		<button @click='ChildToParent'>點我傳愛</button>	</div></template><script>	export default{		props:['message1','message2','message3'],		data(){			return{				loud:'I love xx'			}		},		methods:{			ChildToParent(){				this.$emit('emitToParent',this.loud)			}		},		created(){			console.log(this.message3)		}	}</script><style></style>

parent.vue

<template>	<div>		<div>我是父組件</div>		<div>大聲告訴我你愛誰:{{loveWho}}</div>		<children @emitToParent='parentSayLove' message1='我是直接參數' v-bind:message2='msg' :message3='obj'></children>	</div></template><script>	import Children from './children'	export default{		components:{			Children		},		data(){			return{				msg:'我是父組件的參數',				loveWho:''			}		},		methods:{			parentSayLove(data){				this.loveWho = data			}		},		created(){			this.obj = {a:'1',b:'2',c:'3'}		}	}</script><style></style>

點擊按鈕瀏覽器顯示:

3.3 小結

props 可以是字符串數組,也可以是對象(可以類型驗證、設置默認值等) ;

使用 .native 修飾監聽事件,開發中使用了 element-ui 的框架標簽時候,使用事件綁定無效。這時候需要使用 .native 修飾 v-on:event ,可以在框架標簽或組件的根元素 上監聽一個原生事件,例如 <my-component v-on:click.native="doTheThing"></my-component> 。

 四丶非父子(兄弟)組件之間傳值

非父子組件之間傳值,需要定義公共實例文件 bus.js ,作為中間倉庫來傳值,不然路由組件之間達不到傳值的效果。在components目錄下新建 first.vuesecond.vue 以及公共文件 bus.js 。

bus.js

import Vue from 'vue'export default new Vue()

first.vuesecond.vue 中分別引入bus.js。

import Bus from '../bus.js'

模擬情景: first.vuesecond.vue 傳值。在 first.vue 通過在事件中添加 Bus.$emit( event, […args] ) 進行傳值,在 second.vue 中通過 Bus.$on(event,callBack) 進行監聽。

first.vue

<template>	<div>		<div>我是first.vue</div>		<button @click="firstToSecond">點擊傳值給second.vue</button>	</div></template><script>	import Bus from '../bus.js'	export default{		data(){			return{				msg:'我是first.vue傳到second.vue的參數'			}		},		methods:{			firstToSecond(){				Bus.$emit('emitToSecond',this.msg)			}		}	}</script><style></style>

second.vue

<template>	<div>		<div>我是second.vue</div>		{{info}}	</div></template><script>	import Bus from '../bus.js'	export default{		data(){			return{				info:''			}		},		mounted(){			const that = this;			Bus.$on('emitToSecond',function(data){				that.info = data			})		}	}</script><style></style>

點擊按鈕,瀏覽器中顯示:

小結

兄弟組件之間與父子組件之間的數據交互,兩者相比較,兄弟組件之間的通信其實和子組件向父組件傳值有些類似,他們的通信原理都是相同的,例如子向父傳值也是 $emit$on 的形式,只是沒有 Bus ,但若我們仔細想想,此時父組件其實就充當了 Bus 這個事件總線的角色。

五丶使用Vuex

何為Vuex,看一下官網的解釋:

Vuex 是一個專為 Vue.js 應用程序開發的 狀態管理模式 。它采用集中式存儲管理應用的所有組件的狀態,并以相應的規則保證狀態以一種可預測的方式發生變化。

什么情況下使用Vuex?

Vuex 可以幫助我們管理共享狀態,并附帶了更多的概念和框架。這需要對短期和長期效益進行權衡。

如果您不打算開發大型單頁應用,使用 Vuex 可能是繁瑣冗余的。確實是如此――如果您的應用夠簡單,您最好不要使用 Vuex。一個簡單的store 模式就足夠您所需了。但是,如果您需要構建一個中大型單頁應用,您很可能會考慮如何更好地在組件外部管理狀態,Vuex 將會成為自然而然的選擇。

在components目錄下新建 vuexA.vuevuexB.vue ,模擬場景: vuexA.vuevuexB.vue 傳值。

首先我們安裝vuex, npm install vuex --save ,在src目錄下創建vuex目錄,然后在vuex目錄下新建 index.js 、 state.jsgetters.js 、 actions.jsmutations.js

vuex/index.js

import Vue from 'vue'import Vuex from 'vuex'import state from './state.js'import mutations from './mutations.js'import getters from './getters.js'import actions from './actions.js'Vue.use(Vuex)export default new Vuex.Store({	state,	getters,	mutations,	actions})

在main.js中引入vuex/index.js并注入到Vue中:

main.js

import Vue from 'vue'import App from './App.vue'import router from './router'import store from './vuex'Vue.config.productionTip = falsenew Vue({	store,	router, render: h => h(App),}).$mount('#app')

state.js

export default{	city:'nanjing'}

vuexA.vue

<template>	  <div>		<div>我是vuexA中city參數:{{city}}</div>		<input type="text" :value="city" @change="change">	</div></template><script>	export default{		methods:{			change(e){				this.$store.dispatch('setCityName',e.target.value)			}		},		computed:{			city(){				return this.$store.getters.getCity			}		}	}</script><style></style>

vuexB.vue

<template>	<div>		<div>我是vuexB中的city參數:{{city}}</div>	</div></template><script>	export default{		data(){			return{							}		},		computed:{			city(){				return this.$store.state.city			}		}	}</script><style></style>

actions.js

export default{	setCityName({commit,state},name){		commit('setCity',name)	}}

mutations.js

export default{	setCity(state,name){		state.city = name//設置新的值	}}

getter.js

export default{	getCity(state){		return state.city//返回目前城市名稱	}}

在瀏覽器中打開:

修改input中的值:

顯而易見,當vuexA頁面中input值改變時,可同時改變vuexB頁面中的值,即將city參數從vuexA頁面傳到了vuexB頁面,從而實現用vuex在組件中傳值。

vuex更多詳細功能請參考Vuex中文官方文檔

全部實例代碼已上傳至 我的GitHub,歡迎訪問Fork。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产伦精品一区二区三区精品视频| 午夜伦理精品一区| 亚洲国产精品久久| 日韩av在线免费观看一区| 国产精品96久久久久久| 国产小视频国产精品| 成人动漫网站在线观看| 亚洲精品国精品久久99热| 97婷婷大伊香蕉精品视频| 亚洲自拍av在线| 色综合久久88色综合天天看泰| 一本色道久久综合狠狠躁篇怎么玩| 国产精品女主播视频| 精品欧美aⅴ在线网站| 菠萝蜜影院一区二区免费| 久久久成人的性感天堂| 91禁外国网站| 国产日韩欧美综合| 日韩国产精品亚洲а∨天堂免| 中文字幕精品视频| 久久人人97超碰精品888| 77777少妇光屁股久久一区| 成人免费网站在线观看| 成人有码在线视频| 欧美大片va欧美在线播放| 97国产成人精品视频| 欧美小视频在线| 视频直播国产精品| 日韩电影网在线| 欧美大片免费看| 日韩在线观看免费高清| 亚洲成年网站在线观看| 日韩一区av在线| 国产成人91久久精品| 日韩亚洲欧美成人| 日韩风俗一区 二区| 久久精品久久精品亚洲人| 亚洲色图综合久久| 色婷婷成人综合| 91深夜福利视频| 亚洲全黄一级网站| 在线成人一区二区| 精品亚洲一区二区三区在线观看| 欧美综合第一页| 一区二区福利视频| 97热在线精品视频在线观看| 国产精品国产三级国产专播精品人| 欧美电影在线免费观看网站| 日韩欧美精品网站| 中文字幕日韩欧美在线| 国产亚洲欧美日韩美女| 日韩黄在线观看| 久久久久国产一区二区三区| 亚洲美女视频网站| 欧美丰满少妇xxxxx| 久久视频这里只有精品| 欧美丝袜一区二区| 一本色道久久综合亚洲精品小说| 日韩成人av网址| 色99之美女主播在线视频| 正在播放亚洲1区| 国产精品av在线播放| 欧美一区二区三区免费观看| 国产日韩中文在线| 中文字幕视频一区二区在线有码| 伊人久久久久久久久久| 亚洲国产精品久久久久秋霞蜜臀| www.亚洲成人| 国产一区二区成人| 国产精品成人一区| 国产亚洲精品久久久久久777| 亚洲大胆人体av| 欧美在线视频导航| 中文字幕一精品亚洲无线一区| 国产精品久久久久av| 日韩av在线免费| 成人欧美一区二区三区在线| 国产精品影片在线观看| 日韩欧美aⅴ综合网站发布| 最近2019中文字幕在线高清| 亚洲美女在线视频| 欧美激情区在线播放| 亚洲奶大毛多的老太婆| 精品美女永久免费视频| 国产精品久久久久久亚洲影视| 精品久久久久久久久久久久久| 欧美在线视频播放| 国产性猛交xxxx免费看久久| 影音先锋欧美在线资源| 亚洲精品成a人在线观看| 亚洲国产精彩中文乱码av在线播放| 国产精品热视频| 欧美国产精品日韩| 51ⅴ精品国产91久久久久久| 91系列在线播放| 国产精品久久中文| 欧美一区二区三区四区在线| 欧美激情视频在线免费观看 欧美视频免费一| 日韩免费在线看| 国产a级全部精品| 一区二区中文字幕| 成人激情在线播放| 日韩成人黄色av| 亚洲人成在线观看网站高清| 一本色道久久88综合亚洲精品ⅰ| yellow中文字幕久久| 国产z一区二区三区| 亚州精品天堂中文字幕| 日韩欧美亚洲综合| 国产成人精品综合| 黄色一区二区三区| 国产精品私拍pans大尺度在线| 亚洲精品小视频在线观看| 久久夜色精品国产| 伦伦影院午夜日韩欧美限制| 最新的欧美黄色| 亚洲人免费视频| 中文字幕欧美日韩在线| 亚洲免费电影在线观看| 日本精品va在线观看| 亚洲激情视频在线观看| 久久人体大胆视频| 亚洲人成网站在线播| www.日本久久久久com.| 亚洲最大福利网站| 在线精品国产欧美| 久久影视免费观看| 国产精品一区二区在线| 成人福利在线观看| 国产精品日韩在线观看| 精品国产依人香蕉在线精品| 日韩欧美国产高清91| 久久成人综合视频| 亚洲第一色中文字幕| 欧美专区国产专区| 51精品在线观看| 国产亚洲精品久久| 精品av在线播放| 国产精品美女视频网站| 欧美壮男野外gaytube| 色噜噜狠狠狠综合曰曰曰| 中文字幕亚洲第一| 国产精品视频精品| 亚洲人午夜色婷婷| 久久影视电视剧免费网站清宫辞电视| 亚洲一区二区三区毛片| 国产精品爽爽爽| 欧美限制级电影在线观看| www.日韩视频| 大荫蒂欧美视频另类xxxx| 国产成人福利网站| 成人福利视频在线观看| 亚洲免费视频在线观看| 日本中文字幕久久看| 日韩精品在线免费| 国产精品一区二区女厕厕| 深夜福利91大全| 日韩精品视频在线播放| 日韩av网址在线观看| 亚洲精品久久久一区二区三区| 不卡av电影院| 国产自产女人91一区在线观看| 欧美专区中文字幕| 日韩精品免费在线视频观看|