您当前的位置:首页 > 网站建设 > javascript
| php | asp | css | H5 | javascript | Mysql | Dreamweaver | Delphi | 网站维护 | 帝国cms | React | 考试系统 | ajax | jQuery | 小程序 |

vue3组件通信的方式总结及实例用法

51自学网 2022-02-21 13:35:36
  javascript

vue3组件通信方式为以下几种

  • props
  • $emit
  • $expose / ref
  • $attrs
  • v-model
  • provide / inject
  • Vuex
  • mitt

props

<child :msg2="msg2" /><script setup>    const props = defineProps({        // 写法一        msg2:String        // 写法二        msg2:{            type:String,            default:''        }    })    console.log(props) // {msg2:'这是传级子组件的信息2'}</script>

$emit

//Child.vue<template>    // 写法一    <div @click="emit('myclick')">按钮</div>    // 写法二    <div @click="handleClick">按钮</div></template><script setup>    // 方法一    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"    import onMychilk = (msg) => {        console.log(msg) // 父组件收到的信息     }</script>

expose / ref

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

<script setup>    // 方法一:useContext() vue3.2 之后已经舍弃    import { useContext } from 'vue'    const ctx = useContext()    // 对外暴露属性方法等都可以    ctx.expose({        childName: '这是子组建的属性',        someMethod(){        console.log('这是子组件的方法')        }    })</script> // Parent.vue 注意 ref="comp"<template>    <child ref="comp"></child>    <button @click="handleClick">按钮</button></template><script>    import child from './child.vue'    import { ref } from 'vue'     const comp = ref(null)    const handleClick = () => {        console.log(comp.value.childName)        comp.value.someMethod() // 调用子组件对外暴露的方法    }</script>

attts

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

// 父组件<child :msg1="msg1" :msg2="msg2" title="3333"></child><script setup>    import child from './child.vue'    import { ref,reactive } from 'vue    const msg1 = ref('111')    const msg2 = ref('222')</script> // 子组件<script setup>    import { defineProps,useContext,useAttars } from 'vue'    const props = defineProps({        msg1: String    })         // 方法1    const ctx = useContext()    console.log(ctx.attars) // {msg2:'222',title:'333'}         // 方法2     const attrs = useAttars()    console.log(attars)  // {msg2:'2222',title:'3333'}</script>

v-model

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

<child v-model:key="key" v-modle:value="value" /><script>    import child from './child.vue'    import { ref,reactive } from 'vue'    const key = ref('111')    const value = ref('222')</script> //子组件<template>   <button @click="handleClick"></button></template><script setup>    // 方法一  v3.2 已被移除    import { useContext } from 'vue'    const { emit } = useContext()         // 方法二    import { defineEmits } from 'vue'    const emit = defineEmits(['key','value'])         //用法    const handleClick = () => {        emit('update:key','新的key')        emit('update:value','新的value')    }</script>

provide / inject

provide/inject为依赖注入 provide:可以让我们指定想要提供给后代组件的数据 inject:在任何后代组件中接受想要添加在这个组件上的数据,不管组件嵌套多深都可以直接拿来用

// 父组件<script setup>    import { provide } from 'vue'    const name = provide('name')    console.log('name','沐华')</script>//子组件<script setup>    import { inject } from 'vue'    const name = inject('name')    console.log(name) //木华</script>

Vuex

//store/index.jsimport { 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")   // 直接使用 <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)           const count = computed (()=>store.state.count)     console.log(count) </script>

mitt

Vue3中已经没有了EventBus跨组件通信,替代方案mitt.js,但原理方式EventBus是一样的
安装方式 npm i mitt -S

封装

mitt.jsimport mitt from 'mitt'const mitt = mitt()export default mitt

组件之间使用

// 组件A <script setup>    import mitt from './mitt'    const handleClick = () => {        mitt.emit('handleChange')    }</script>// 组件B <script setup>import mitt from './mitt'import { onUnmounted } from 'vue'const someMethod = () => {...}mitt.on('handleChange',someMethod)onUnmounted(()=>{    mitt.off('handleChange',someMethod)})</script>

到此这篇关于vue3组件通信的方式总结及实例用法的文章就介绍到这了,更多相关vue3组件通信的几种方式内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net!


下载地址:
JavaScript中&nbsp;创建动态&nbsp;QML&nbsp;对象的方法
vue通过v-show实现回到顶部top效果
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。