傳參數的方法:1、父子組件間利用「props」和「$emit」進行傳參;2、爺爺組件間利用「provide」和「inject」進行傳參;3、兄弟組件間利用公共文件來傳參;4、路由間使用「query」和「params」來傳參。
本教學操作環境:windows7系統、vue2.9.6版,DELL G3電腦。
Vue中常見參數傳遞方式
元件通訊-vue中父子元件間的方法呼叫與參數傳遞props、$emit
元件通訊-爺孫元件間的傳參provide、inject
元件通訊-兄弟元件間的傳參bus.js
路由間的傳參query、params
一、父子元件
1.1父傳子(props)
<!-- 父组件father.vue --> <template> <div> <div>这里是father组件</div> <div>这是父组件要传给子组件的参数:{{msg}}</div> <!-- 1.传递:data1为动态参数msg的参数名,名字自定义,与子组件接收参数名同名 data2为静态参数的参数名,名字自定义,与子组件接收参数名同名 --> <child :data1="msg" data2="777"></child> </div> </template> <script> import child from "./child"; export default { data() { return { msg:"666" } }, components: { child } }; </script>
<!-- 子组件child.vue --> <template> <div> <div>这里是child组件</div> <!-- 3.使用:这里就是接收的父组件参数 --> <div>接受的父组件动态参数:{{ data1 }}</div> <div>接受的父组件静态参数:{{ data2 }}</div> <div>接受的父组件参数:{{ data }}</div> </div> </template> <script> export default { // 2.接收:props接收父组件参数,data1与data2为传递参数的参数名,与父组件内同名 props: ["data1", "data2"], data() { return { data: "默认值" }; }, // 3.使用:直接用this调用 mounted() { this.data = this.data1; } }; </script>
頁面資料效果如下
這裡要稍微注意一下,父元件所傳遞參數如果是需要在生命週期中取得賦值,就不能綁定在mounted中,否則子元件方法中this調用不會成功。生命週期順序:父beforeMount->子beforeCreate…子mounted->父mounted
1.2子傳父($emit)#
<!-- 子组件child.vue --> <template> <div> <div>这里是child组件</div> <!-- 这里就是接收的父组件参数 --> <input type="button" value="点击向父组件传参" @click="toFather"> </div> </template> <script> export default { data(){ return{ cmsg:'我是子组件的参数' } }, methods: { toFather(){ // 1.子组件触发父组件方法 // $emit第一个参数为所要触发的父组件函数,函数名可自定义但要与父组件中对应函数名同名 // $emit第二个参数就是子组件向父组件传递的参数 this.$emit('receive',this.cmsg); } }, }; </script> <style scoped></style>
<!-- father.vue --> <template> <div> <div>这里是father组件</div> <div>接收子组件参数:{{fmsg}}</div> <!-- 2.在对应子组件上绑定函数,这里“receive”是函数名,可自定义但要与子组件触发函数同名 --> <child @receive="fromChild"></child> </div> </template> <script> import child from "./child"; export default { data() { return { fmsg:'' }; }, methods: { // 接收子组件参数,赋值 fromChild(data){ this.fmsg=data; } }, components: { child } }; </script> <style scoped></style>
點選按鈕後頁面效果圖如下
#1.3父元件呼叫子元件方法($on)
#<!-- father.vue --> <template> <div> <div @click="click">点击父组件</div> <child ref="child"></child> </div> </template> <script> import child from "./child"; export default { methods: { click() { this.$refs.child.$emit('childMethod','发送给方法一的数据') // 方法1:触发监听事件 this.$refs.child.callMethod() // 方法2:直接调用 }, }, components: { child, } } </script>
<!-- child.vue --> <template> <div>子组件</div> </template> <script> export default { mounted() { this.monitoring() // 注册监听事件 }, methods: { monitoring() { // 监听事件 this.$on('childMethod', (res) => { console.log('方法1:触发监听事件监听成功') console.log(res) }) }, callMethod() { console.log('方法2:直接调用调用成功') }, } } </script>
二、爺爺組件的參數傳遞(provide和inject,不受元件層級影響)
provide
和 inject
主要提供高階外掛程式/元件庫使用案例。並不建議直接用於應用程式程式碼。
官方文件:
https://cn.vuejs.org/v2/api/#provide-inject
https://cn.vuejs.org/v2/guide/components-edge -cases.html#依賴注入
<!-- grandpa.vue --> data() { return { msg: 'A' } }, provide() { return { message: this.msg } }
<!-- father.vue --> components:{child}, inject:['message'],
<!-- child.vue --> inject: ['message'], created() { console.log(this.message) // A },
# 三、兄弟元件的參數傳遞(bus.js)
3.1建立公車bus.js
3.2像是兄弟元件傳遞參數
import Bus from "@/utils/bus"; //注意引入 export default { data(){ return { num:1 } }, methods: { handle(){ Bus.$emit("brother", this.num++, "子组件向兄弟组件传值"); } }, }
3.3接受兄弟元件的參數
#import Bus from "@/utils/bus"; //注意引入 export default { data(){ return { data1:'', data2:'' } }, mounted() { Bus.$on("brother", (val, val1) => { //取 Bus.$on this.data1 = val; this.data2 = val1; }); }, }
四、路由間的參數傳遞(query和params)
query和parmas的使用方式大致相同,這裡簡單介紹一下路由配置、參數的傳遞和呼叫
4.1params,參數顯示在url
// router的配置 { path: "/two/:id/:data", // 跳转的路由后加上/:id,多个参数继续按格式添加,数据按顺序对应 name: "two", component: two } // 跳转,这里message为123 this.$router.push({ path: `/two/${this.message}/456` // 直接把数据拼接在path后面 }); // 接收 created() { this.msg1=this.$route.params.id // 123 this.msg2=this.$route.params.data // 456 } // url显示,数据显示在url,所以这种方式传递数据仅限于一些不那么重要的参数 /two/123/456
4.2params,參數不顯示在url,刷新頁面資料消失
// router的配置 { path: "/two", name: "two", component: two } // 跳转,这里message为123 this.$router.push({ name: `two`, // 这里只能是name,对应路由 params: { id: this.message, data: 456 } }); // 接收 created() { this.msg1=this.$route.params.id // 123 this.msg2=this.$route.params.data // 456 } // url显示,数据不显示在url /two
4.3query,參數顯示在url
// router的配置 { path: "/two", name: "two", component: two } // 跳转,这里message为123 this.$router.push({ path: `/two`, // 这里可以是path也可以是name(如果是name,name:'two'),对应路由 query: { id: this.message, data: 456 } }); // 接收 created() { this.msg1=this.$route.query.id // 123 this.msg2=this.$route.query.data // 456 } // url显示,数据显示在url /two?id=123&data=456
相關推薦:《vue.js教學》
以上是vue傳參數的方法有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!