vue3组件传值方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue3组件传值方式相关的知识,希望对你有一定的参考价值。

参考技术A 适用于层级比较多,如爷孙组件传值。结合传函数的方式,可以让爷孙组件相互传值

用 provide 和 inject 会遇上类型问题,子组件接收到的是unknown类型
所以用 InjectionKey 类型声明来定义值(做名称)

之前的文章有独立介绍

v-model相当于传递了 modelValue ,并接收抛出的 update:modelValue 事件

父组件是不能直接访问子组件的方法。需要子组件手动的抛出:defineExpose()

vue组件之间的传值方式

一.父组件向子组件传值方式

1.1父组件向子组件传数据方式

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7     <title>Document</title>
 8     <script src="vue.js"></script>
 9 </head>
10 <body>
11     <div id="app">
12         <com1></com1>
13     </div>
14     <script>
15 
16         var vm=new  Vue({
17             el:#app,
18             data:{
19                 msg:123==啊父组件中的数据
20             },
21             methods: {
22                 
23             },
24             // 定义一个私有子的组件
25             components: {
26                 // 来看下子组件能拿到vm父组件中的data里面的msg数据吗
27                 // 结论:经过演示,发现,子组件中,默认无法访问到父组件的data上的数据和methods中的方法
28                 // 那么子组件怎么获取到父组件的数据
29                 com1:{
              //这里会报错:子组件直接引用父组件的msg数据
30 template:<h1>这是子组件--{{msg}}</h1> 31 } 32 } 33 }) 34 </script> 35 </body> 36 </html>
  // 那么子组件怎么获取到父组件的数据: 父组件,可以在引用子组件的时候,通过熟悉绑定(v-bind)的形式,把需要传递给子组件的数据,以属性绑定的形式,子组件通过props定义父组件传过来的数据才能使用
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7     <title>Document</title>
 8     <script src="vue.js"></script>
 9 </head>
10 <body>
11     <div id="app">
12         <!-- 父组件,可以在引用子组件的时候,通过熟悉绑定(v-bind)的形式,把需要传递给子组件的数据,以属性绑定的形式, -->
13         <!-- 传递到子组件内部,供子组件使用 -->
14         <com1 v-bind:parentmsg="msg"></com1>
15     </div>
16     <script>
17 
18         var vm=new  Vue({
19             el:#app,
20             data:{
21                 msg:123==啊父组件中的数据
22             },
23             methods: {
24                 
25             },
26             // 定义一个私有子的组件
27             components: {
28                 // 来看下子组件能拿到vm父组件中的data里面的msg数据吗
29                 // 结论:经过演示,发现,子组件中,默认无法访问到父组件的data上的数据和methods中的方法
30                 // 那么子组件怎么获取到父组件的数据
31                 com1:{
32                     data(){
33                         // 注意:子组件中的data数据,并不是父组件传递过来的,而是子组件自身私有的,比如:子组件子组件通过ajax,
34                         // 请求回来的数据,都可以放在data身上
35                         return{
36                             title:123,
37                             content:qqq
38                         }
39                     },
40                     template:<h1>这是子组件--{{parentmsg}}</h1>,
41                     // 注意:组件中的所有props中的数据,都是通过父组件传递给子组件的
42                      // 注意子组件中的data和props数据的区别:props只读,无法重新赋值,data数据都是可读可写
43                     // props是一个数组,把父组件传递过来的parentmsg属性,先在props数组中定义一下,这样才能使用这个数据
44                     props: [parentmsg]
45                    
46                 }
47             }
48         })
49     </script>
50 </body>
51 </html>
1.2父组件向子组件传递方法,使用的是事件绑定机制,子组件通过$emit()方法拿到父组件传过来的数据
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7     <title>Document</title>
 8     <script src="vue.js"></script>
 9 </head>
10 <body>
11     <div id="app">
12         <!-- 如果是事件的话就用事件绑定机制 -->
13         <!-- 父组件向子组件传递方法,使用的是事件绑定机制 v-on,当我们自定义一个事件属性之后, -->
14         <!-- 那么子组件就能够,通过某些方式,来调用传递这个方法了 -->
15         <com2 v-on:func="show"></com2>
16     </div>
17     <template id="tmp1">
18         <div>
19             <h1>这是子组件</h1>
20             <input type="button" value="这是子组件中的按钮,-点击它,触发父组件传递过来的func方法" @click="myclick">
21         </div>
22     </template>
23     <script>
24         // 定义一个字面量类型的组件模板对象
25         var com2={
26             // 通过指定一个ID,表示说,要去加载这个指定ID的template元素中的内容,当作组件的HTML结构
27             template:#tmp1,
28             methods:{
29                 myclick(){
30                     // 当点击子组件按钮的时候,如何拿到父组件传递过来的func方法,并调用这个方法
31                     // emit触发
32                     this.$emit(funcs)
33                 }
34             }
35         }
36         var vm=new  Vue({
37             el:#app,
38             data:{
39                show(){
40                    console.log(调用了父组件上的show方法)
41                }
42             },
43             methods: {
44                
45             },
46             components: {
47                 com2
48                 // 类似于 com2:com2
49 
50             }
51         })
52     </script>
53 </body>
54 </html>

 

 

 

 

 

 

以上是关于vue3组件传值方式的主要内容,如果未能解决你的问题,请参考以下文章

一张图说清楚Vue3父子组件传值,以及props可否改的本质问题

VUe3组件传值

vue3实现父组件向子组件传值并监听props改变触发事件

Vue3---父子组件间互相传值

Vue3 组件传值 props 和 attrs 区别

「 VUE3 + TS + Vite 」父子组件间如何通信?