温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Vue3的7种种组件通信是怎样的

发布时间:2021-09-24 14:46:01 来源:亿速云 阅读:146 作者:柒染 栏目:开发技术

今天就跟大家聊聊有关Vue3的7种种组件通信是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

1、Vue3 组件通信方式

  • props

  • $emit

  • expose / ref

  • $attrs

  • v-model

  • provide / inject

  • Vuex

2、Vue3 通信使用写法

2.1 props

props 传数据给子组件有两种方法,如下

方法一:混合写法

// Parent.vue 传送 <child :msg1="msg1" :msg2="msg2"></child> <script> import child from "./child.vue" import { ref, reactive } from "vue" export default {     data(){         return {             msg1:"这是传级子组件的信息1"         }     },     setup(){         // 创建一个响应式数据                  // 写法一 适用于基础类型  ref 还有其他用处,下面章节有介绍         const msg2 = ref("这是传级子组件的信息2")                  // 写法二 适用于复杂类型,如数组、对象         const msg2 = reactive(["这是传级子组件的信息2"])                  return {             msg2         }     } } </script> // Child.vue 接收 <script> export default {   props: ["msg1", "msg2"],// 如果这行不写,下面就接收不到   setup(props) {     console.log(props) // { msg1:"这是传给子组件的信息1", msg2:"这是传给子组件的信息2" }   }, } </script>

方法二:纯 Vue3 写法

// Parent.vue 传送 <child :msg2="msg2"></child> <script setup>     import child from "./child.vue"     import { ref, reactive } from "vue"     const msg2 = ref("这是传给子组件的信息2")     // 或者复杂类型     const msg2 = reactive(["这是传级子组件的信息2"]) </script> // Child.vue 接收 <script setup>     // 不需要引入 直接使用     // import { defineProps } from "vue"     const props = defineProps({         // 写法一         msg2: String         // 写法二         msg2:{             type:String,             default:""         }     })     console.log(props) // { msg2:"这是传级子组件的信息2" } </script>

注意:

如果父组件是混合写法,子组件纯 Vue3 写法的话,是接收不到父组件里 data 的属性,只能接收到父组件里 setup 函数里传的属性

如果父组件是纯 Vue3 写法,子组件混合写法,可以通过 props 接收到 data setup 函数里的属性,但是子组件要是在 setup 里接收,同样只能接收到父组件中 setup 函数里的属性,接收不到 data 里的属性

官方也说了,既然用了 3,就不要写 2 了,所以不推荐混合写法。下面的例子,一律只用纯 Vue3 的写法,就不写混合写法了

2.2 $emit

// Child.vue 派发
<template>
    // 写法一
    <button @click="emit('myClick')">按钮</buttom>
    // 写法二
    <button @click="handleClick">按钮</buttom>
</template>
<script setup>
   
    // 方法一 适用于Vue3.2版本 不需要引入
    // import { defineEmits } from "vue"
    // 对应写法一
    const emit = defineEmits(["myClick","myClick2"])
    // 对应写法二
    const handleClick = ()=>{
        emit("myClick", "这是发送给父组件的信息")
    }
   
    // 方法二 不适用于 Vue3.2版本,该版本 useContext()已废弃
    import { useContext } from "vue"
    const { emit } = useContext()
    const handleClick = ()=>{
        emit("myClick", "这是发送给父组件的信息")
    }
</script>

// Parent.vue 响应 <template>     <child @myClick="onMyClick"></child> </template> <script setup>     import child from "./child.vue"     const onMyClick = (msg) => {         console.log(msg) // 这是父组件收到的信息     } </script>

2.3 expose / ref

父组件获取子组件的属性或者调用子组件方法

// Child.vue <script setup>     // 方法一 不适用于Vue3.2版本,该版本 useContext()已废弃     import { useContext } from "vue"     const ctx = useContext()     // 对外暴露属性方法等都可以     ctx.expose({         childName: "这是子组件的属性",         someMethod(){             console.log("这是子组件的方法")         }     })          // 方法二 适用于Vue3.2版本, 不需要引入     // import { defineExpose } from "vue"     defineExpose({         childName: "这是子组件的属性",         someMethod(){             console.log("这是子组件的方法")         }     }) </script> // Parent.vue  注意 ref="comp" <template>     <child ref="comp"></child>     <button @click="handlerClick">按钮</button> </template> <script setup>     import child from "./child.vue"     import { ref } from "vue"     const comp = ref(null)     const handlerClick = () => {         console.log(comp.value.childName) // 获取子组件对外暴露的属性         comp.value.someMethod() // 调用子组件对外暴露的方法     } </script>

2.4 attrs

attrs包含父作用域里除 class style 除外的非 props 属性集合

// Parent.vue 传送 <child :msg1="msg1" :msg2="msg2" title="3333"></child> <script setup>     import child from "./child.vue"     import { ref, reactive } from "vue"     const msg1 = ref("1111")     const msg2 = ref("2222") </script> // Child.vue 接收 <script setup>     import { defineProps, useContext, useAttrs } from "vue"     // 3.2版本不需要引入 defineProps,直接用     const props = defineProps({         msg1: String     })     // 方法一 不适用于 Vue3.2版本,该版本 useContext()已废弃     const ctx = useContext()     // 如果没有用 props 接收 msg1 的话就是 { msg1: "1111", msg2:"2222", title: "3333" }     console.log(ctx.attrs) // { msg2:"2222", title: "3333" }          // 方法二 适用于 Vue3.2版本     const attrs = useAttrs()     console.log(attrs) // { msg2:"2222", title: "3333" } </script>

2.5 v-model

可以支持多个数据双向绑定

// Parent.vue <child v-model:key="key" v-model:value="value"></child> <script setup>     import child from "./child.vue"     import { ref, reactive } from "vue"     const key = ref("1111")     const value = ref("2222") </script> // Child.vue <template>     <button @click="handlerClick">按钮</button> </template> <script setup>          // 方法一  不适用于 Vue3.2版本,该版本 useContext()已废弃     import { useContext } from "vue"     const { emit } = useContext()          // 方法二 适用于 Vue3.2版本,不需要引入     // import { defineEmits } from "vue"     const emit = defineEmits(["key","value"])          // 用法     const handlerClick = () => {         emit("update:key", "新的key")         emit("update:value", "新的value")     } </script>

2.6 provide / inject

provide / inject 为依赖注入

  • provide:可以让我们指定想要提供给后代组件的数据或

  • inject:在任何后代组件中接收想要添加在这个组件上的数据,不管组件嵌套多深都可以直接拿来用

// Parent.vue <script setup>     import { provide } from "vue"     provide("name", "沐华") </script> // Child.vue <script setup>     import { inject } from "vue"     const name = inject("name")     console.log(name) // 沐华 </script>

2.7 Vuex

// store/index.js import { createStore } from "vuex" export default createStore({     state:{ count: 1 },     getters:{         getCount: state => state.count     },     mutations:{         add(state){             state.count++         }     } }) // main.js import { createApp } from "vue" import App from "./App.vue" import store from "./store" createApp(App).use(store).mount("#app") // Page.vue // 方法一 直接使用 <template>     <div>{{ $store.state.count }}</div>     <button @click="$store.commit('add')">按钮</button> </template> // 方法二 获取 <script setup>     import { useStore, computed } from "vuex"     const store = useStore()     console.log(store.state.count) // 1     const count = computed(()=>store.state.count) // 响应式,会随着vuex数据改变而改变     console.log(count) // 1  </script>

看完上述内容,你们对Vue3的7种种组件通信是怎样的有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI