VUE3 组件通信

这篇具有很好参考价值的文章主要介绍了VUE3 组件通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. props

    1. 用途:可以实现父子组件、子父组件、甚至兄弟组件通信

    2. 父组件

      <template>
          <div>
              <Son :money="money"></Son>
          </div>
      </template>
      
      <script setup lang="ts">
      import Son from './son.vue'
      import { ref } from 'vue';
      let money = ref(1000)
      </script>
      
      <style scoped></style>
    3. 子组件

      <template>
          <div>
              {{ props.money }}
          </div>
      </template>
      
      <script setup lang="ts">
      /*	两种方式都可以使用		*/
      // defineProps({
      //     money: {
      //         type: Number,
      //         default: 666
      //     }
      // })
      let props = defineProps(['money'])
      </script>
      
      <style scoped></style>
  2. 自定义事件

    1. 用途:可以实现子父组件通信

    2. 父组件

      <template>
          <div>
              <Son  @zdy = 'handle'></Son>
          </div>
      </template>
      
      <script setup lang="ts">
      import Son from './son.vue'
      import { ref } from 'vue';
      const handle = (a:any,b:any)=>{
          console.log(a,b) //
      }
      </script>
      
      <style scoped></style>
    3. 子组件

      <template>
          <div>
              <Son  @zdy = 'handle'></Son>
          </div>
      </template>
      
      <script setup lang="ts">
      import Son from './son.vue'
      import { ref } from 'vue';
      const handle = (a:any,b:any)=>{
          console.log(a,b) //
      }
      </script>
      
      <style scoped></style>
  3. 全局事件总线$bus:

    1. 用途:可以实现任意组件通信

    2. 安装 

      pnpm i mitt
    3. 配置

      1. 新建bus.js文件

        import mitt from 'mitt'
        const $bus = mitt()
        export default $bus
    4. 使用

      1. 父组件

        <template>
            <div>
                <Son  @zdy = 'handle'></Son>
            </div>
        </template>
        
        <script setup lang="ts">
        import Son from './son.vue'
        import { ref } from 'vue';
        import $bus from '../utils/bus.js'
        $bus.on('dataToParent',(a:any)=>{
            console.log(a)
        })
        </script>
        
        <style scoped></style>
      2. 子组件

        <template>
            <div>
                <button @click="dataToParent">点击向父组件发送全局事件总线数据</button>
            </div>
        </template>
        
        <script setup lang="ts">
        import $bus from '../utils/bus.js'
        const dataToParent = ()=>{
            $bus.emit('dataToParent','hello')
        }
        </script>
        
        <style scoped></style>
  4. v-model

    1. 父组件

      <template>
          <div>
              <Son :money="money"></Son>
          </div>
      </template>
      
      <script setup lang="ts">
      import Son from './son.vue'
      import { ref } from 'vue';
      let money = ref(1000)
      </script>
      
      <style scoped></style>
    2. 子组件

      <template>
          <div>
              {{ money }}
          </div>
      </template>
      
      <script setup lang="ts">
      defineProps(['money'])
      </script>
      
      <style scoped></style>
  5. useAttrs

    1. 父组件

      <template>
          <div>
              <Son :money="money" title="attr传参" size='default' type="primary"></Son>
          </div>
      </template>
      
      <script setup lang="ts">
      import Son from './son.vue'
      import { ref } from 'vue';
      let money = ref(1000)
      </script>
      
      <style scoped></style>
    2. 子组件

      <template>
          <div>
              {{ $attrs.money }} --{{ $attrs.title }}
          </div>
      </template>
      
      <script setup lang="ts">
      import { useAttrs } from 'vue';
      let $attrs = useAttrs()
      console.log($attrs)
      </script>
      
      <style scoped></style>
  6. provide与inject

    1. 父组件

      <template>
          <div>
              <Son :money="money"></Son>
          </div>
      </template>
      
      <script setup lang="ts">
      import Son from './son.vue'
      import { ref,provide } from 'vue';
      let money = ref(1000)
      provide('name','wang')
      </script>
      
      <style scoped></style>
    2. 子组件

      <template>
          <div>
             
          </div>
      </template>
      
      <script setup lang="ts">
      import { inject } from 'vue';
      let name = inject('name')
      console.log(name)
      </script>
      
      <style scoped></style>
  7. ref与$parent

    1. 父组件

      <template>
          <div>
              <div>当前父组件的money是{{ money }}</div>
              <button @click="take100FromSon">从儿子手里拿100元</button>
              <Son :money="money" ref="son"></Son>
              <Dau></Dau>
      
          </div>
      </template>
      
      <script setup lang="ts">
      import Son from './son.vue'
      import Dau from './daughtor.vue'
      import { ref } from 'vue';
      let son = ref()
      let money = ref(1000)
      const take100FromSon = ()=>
      {
          son.value.money -=100;
          money.value+=100
      }
      defineExpose({
          money
      })
      </script>
      
      <style scoped></style>
    2. 儿子组件1

      <template>
          <div>
             儿子的手里有{{ money }}
          </div>
      </template>
      
      <script setup lang="ts">
      import { ref } from 'vue';
      let money = ref(500)
      defineExpose({
          money
      })
      </script>
      
      <style scoped></style>
    3. 儿子组件2

      <template>
          <div>
      女儿的手里有{{ money }}元
      <button @click="take1000FromFather($parent)">从父亲手里拿1000元</button>
          </div>
      </template>
      
      <script setup lang="ts">
      import { ref } from 'vue';
      let money = ref(5000)
      const take1000FromFather = ($parent:any)=>{
          $parent.money-=1000
          money.value+=1000
      }
      </script>
      
      <style scoped>
      
      </style>
  8. pinia

    1. 安装pinia 

      pnpm i pinia
    2. 初始化pinia

      1. 创建一个store文件夹,在下面新建一个index.js文件

        import {createPinia} from 'pinia'
        let store = createPinia()
        export default store 
      2. 在main.js文件中声明

        import store from './pinia'
        app.use(store)
    3. 使用pinia

      1. 在store下新建一个modules文件夹,用来管理pinia文件,例如,创建了一个test.js文件。

        import {defineStore} from 'pinia'
        import {ref} from 'vue'
        export const testPinia = defineStore('testPinia',()=>{
            const a = ref('hello')
            const sendMessage = ()=>{
                a.value = 'hello,vue'
                console.log(a.value)
            }
            return{a,sendMessage}
        })
      2. 组件中使用

        <template>
            <div>
        
            </div>
        </template>
        
        <script setup lang="ts">
        import {testPinia} from '../pinia/modules/test.js'
        const testpinia = testPinia()
        console.log(testpinia.a)
        testpinia.sendMessage()
        </script>
        
        <style scoped>
        
        </style>
  9. slot

    1. 默认插槽

      1. 父组件

        <template>
        <Son>
          <h1>我是默认插槽填充的结构</h1>
        </Son>
        
        **具名插槽:**
        </template>
        
        <script setup lang="ts">
        import Son from './son.vue'
        </script>
        
        <style scoped>
        
        </style>
      2. 子组件

        <template>
            <div>
              <slot></slot>
            </div>
          </template>
          <script setup lang="ts">
          </script>
          <style scoped>
          </style>
      3. 效果图VUE3 组件通信,VUE3,vue.js,前端

    2. 具名插槽

      1. 父组件

        <template>
          <h1>slot</h1>
            <Son>
              <template v-slot:a> 
                <!-- //可以用#a替换  -->
                <div>填入组件A部分的结构</div>
              </template>
              <template v-slot:b>
                <!-- //可以用#b替换 -->
                <div>填入组件B部分的结构</div>
              </template>
            </Son>
        </template>
        
        <script setup lang="ts">
        import Son from './son.vue'
        </script>
        
        <style scoped>
        
        </style>
      2. 子组件

        <template>
            <div>
              <h1>todo</h1>
              <slot name="a"></slot>
              <slot name="b"></slot>
            </div>
          </template>
          <script setup lang="ts">
          </script>
          
          <style scoped>
          </style>
      3. 效果图VUE3 组件通信,VUE3,vue.js,前端

    3. 作用域插槽

      1. 概念:可以理解为,子组件数据由父组件提供,但是子组件内部决定不了自身结构与外观(样式)

      2. 父组件

        <template>
          <div>
            <h1>slot</h1>
            <Son :todos="todos">
              <template #="{$row,$index}">
                 <!--父组件决定子组件的结构与外观-->
                 <span :style="{color:$row.done?'green':'red'}">{{$row.title}}</span>
              </template>
            </Son>
          </div>
        </template>
        
        <script setup lang="ts">
        import Son from "./son.vue";
        import { ref } from "vue";
        //父组件内部数据
        let todos = ref([
          { id: 1, title: "吃饭", done: true },
          { id: 2, title: "睡觉", done: false },
          { id: 3, title: "打豆豆", done: true },
        ]);
        </script>
        <style scoped>
        </style>
      3. 子组件

        <template>
          <div>
            <h1>todo</h1>
            <ul>
             <!--组件内部遍历数组-->
              <li v-for="(item,index) in todos" :key="item.id">
                 <!--作用域插槽将数据回传给父组件-->
                 <slot :$row="item" :$index="index"></slot>
              </li>
            </ul>
          </div>
        </template>
        <script setup lang="ts">
        defineProps(['todos']);//接受父组件传递过来的数据
        </script>
        <style scoped>
        </style>
      4. 效果图VUE3 组件通信,VUE3,vue.js,前端文章来源地址https://www.toymoban.com/news/detail-841412.html

到了这里,关于VUE3 组件通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue3 组件之间的通信

    经过前面几章的阅读,相信开发者已经可以搭建一个基础的 Vue 3 项目了! 但实际业务开发过程中,还会遇到一些组件之间的通信问题,父子组件通信、兄弟组件通信、爷孙组件通信,还有一些全局通信的场景。 这一章就按使用场景来划分对应的章节吧,在什么场景下遇到问

    2023年04月08日
    浏览(44)
  • 【vue3】学习笔记--组件通信方式

    学习vue3总是绕不开vue2 vue3组件通信方式如下: props数据只读,从父组件传递到子组件,子组件内部不可直接更改 子组件需要使用defineProps方法接受父组件传递过来的数据 setup语法糖下局部组件无需注册直接可以使用 父组件 子组件 vue框架中事件分为两种:原生的DOM事件和自定

    2024年02月13日
    浏览(52)
  • Vue3组件通信相关内容整理

    适用于:  父向子传递参数、方法, 子触发父传递的方法 props方式组件通信和vue2中的props传参类似,只是使用方式和接收方式有一些区别。 注意点: 通过props方式传递的参数为 只读属性,不可修改 父组件 子组件  组件A :绑定事件-接收数据  组件B:触发事件-传递数据 这

    2024年01月25日
    浏览(46)
  • vue3 快速入门系列 —— 组件通信

    组件通信在开发中非常重要,通信就是你给我一点东西,我给你一点东西。 本篇将分析 vue3 中组件间的通信方式。 Tip :下文提到的绝大多数通信方式在 vue2 中都有,但是在写法上有一些差异。 在 vue3 基础上进行。 新建三个组件:爷爷、父亲、孩子A、孩子B,在主页 Home.vu

    2024年04月17日
    浏览(65)
  • vue3组件通信之pinia

      在vue3,vue的状态管理也迎来了新的变更,在vue3使用新的组件pinia来代理原有的vuex。pinia相比vuex,功能收敛了不少,比如不直接暴露setter方式,外部直接修改数据 vuex:集中式管理状态容器,可以实现任意组件之间通信 核心概念:state、mutations、actions、getters、modules pinia:集中式

    2024年02月11日
    浏览(41)
  • vue3探索——组件通信之依赖注入

    通常情况下,当我们需要从父组件向子组件传递数据时,会使用  props 。想象一下这样的结构:有一些多层级嵌套的组件,形成了一颗巨大的组件树,而某个深层的子组件需要一个较远的祖先组件中的部分数据。在这种情况下,如果仅使用 props 则必须将其沿着组件链逐级传递

    2024年02月10日
    浏览(42)
  • VUE3+TS(父子、兄弟组件通信)

    目录 父传子值、方法(子调用父值、方法) 子传父值(父调用子值) 父读子(子传父)(父调用子值、方法) 兄弟(任意组件)通信 引入Mitt来完成任意组件通信 1、统一规范写法,通过在子组件标签上绑定属性和值,来传递到子组件,子组件再通过defineProps来接收,先给其

    2023年04月08日
    浏览(48)
  • Vue3组件间的通信方式

    目录  1.props父向子组件通信 2.自定义事件 子向父组件通信 3.全局事件总线 4.v-model组件通信(父子组件数据同步) 绑定单个数据同步  绑定多个数据同步  5.useAttrs组件通信  6.ref与$parent ref获取子组件实例对象  $parent获取父组件实例对象  7.provide-inject 可以实现隔辈传输 8.

    2024年02月17日
    浏览(46)
  • vue3探索——组件通信之事件总线

    Vue2.x使用EventBus进行组件通信,而Vue3.x推荐使用 mitt.js 。 比起Vue实例上的 EventBus , mitt.js 好在哪里呢?首先它足够小,仅有200bytes,其次支持全部事件的监听和批量移除,它还不依赖Vue实例,所以可以跨框架使用,React或者Vue,甚至jQuery项目都能使用同一套库。 使用yarn安装

    2024年02月12日
    浏览(45)
  • vue3 常用的组件互相通信(父子、兄弟、爷孙、任意组件)

    目录 前言:目前组件通信方法有好多种,我这挑选一部分来讲 1、父传子 2、子传父 3、兄弟之间通信 3.1、父组件充当中间件 3.2、全局事件总线—EventBus 4、爷孙之间通信 5、任意组件、全局 方案 父传子 子传父 props / emits props emits v-model / emits v-model emits ref / emits ref emits provi

    2024年02月15日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包