首页 > 其他分享 >VUE3 十种组件通信的方式(附详细代码)

VUE3 十种组件通信的方式(附详细代码)

时间:2024-03-20 18:31:32浏览次数:30  
标签:vue money 十种 let VUE3 组件 import ref

  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. 效果图

    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. 效果图

    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. 效果图

标签:vue,money,十种,let,VUE3,组件,import,ref
From: https://blog.csdn.net/g841805/article/details/136783527

相关文章

  • VUE3 ECharts5 快速上手(附详细步骤)
    安装pnpminstallecharts引入EChartsimport*asechartsfrom'echarts';设置容器注意:虽然echarts可以在配置时设置宽高,但还是推荐在配置前直接为容器设置宽高<template><divid="main"class="echart-style"></div></template><style......
  • pinia——vue3的状态管理工具
    简介Pinia是Vue的专属状态管理库,它允许你跨组件或页面共享状态。主要优点Vue2和Vue3都支持,这让我们同时使用Vue2和Vue3的小伙伴都能很快上手。pinia中只有state、getter、action,抛弃了Vuex中的Mutation,Vuex中mutation一直都不太受小伙伴们的待见,pinia直接抛弃它了,这无疑......
  • VsCode中高效书写Vue3代码的插件
    Vue-Official(原Volar)就是原先的Volar,现已弃用。Vue-Official提供的功能:语法高亮:Vue-Official扩展可以为Vue单文件组件(.vue文件)中的HTML、CSS和JavaScript部分提供语法高亮,使代码更易于阅读和编写。代码片段:Vue-Official扩展提供了丰富的Vue.js相关的......
  • 【Vue3】组件通信以及各种方式的对比
    方式一:props「父」向「子」组件发送数据父组件:定义需要传递给子组件的数据,并使用v-bind指令将其绑定到子组件的props上。<template><child-component:message="parentMessage"/></template><scriptsetup>importChildComponentfrom'./ChildComponent.......
  • vue3 项目接入keycloak
    之前都是vue2项目接入keycloak,网上表较多资料参考,vue3得比较少记录一下。这个前端项目是jetlinks社区版。引入了 dsb-norge/vue-keycloak-js插件, https://github.com/dsb-norge/vue-keycloak-js,还是要看官方得文档、示例。1.官方提供得示例比较全,我需要得是vue3typescri......
  • 微信小程序(vantWeapp) UI组件库
     vantWeapp官方文档: https://youzan.github.io/vant-weapp/#/quickstart 根据文档的安装步骤  为什么写这样的变量名就能实现对相关的组件修改自定义颜色呢? 原因如下:根据文档描述,官方提供了相关的变量对应的组件 https://github.com/youzan/vant-weapp/blo......
  • react 开发一个 类似于条件筛选的组件 如下
     最终效果: 记录一下其中要点: 1.react 的数据被useState后,都不允许直接修改,都需要使用hooks才可以修改       2. useState必须要放到组件渲染函数中     3. 在jsx中不允许使用if 除了三元运算符和isChecked为真假来做标识符外......
  • HarmonyOS鸿蒙开发常用组件详细说明(图片、文本、按钮、弹窗、进度条、文本框)
    常用组件一直会分享,虽然鸿蒙目前来没有多大发展,但不可否然以后发展,华为的技术是一大突破,存在即合理可以现在没有多大发展。但不可否定未来的发展。关注’猿来编码‘,微信订阅号,回复’组件‘,获取文章目录常用组件关注’猿来编码‘,微信订阅号,回复’组件‘,获取1、图片......
  • [.NET项目实战] Elsa开源工作流组件应用(二):内核解读
    @目录定义变量内存寄存器类寄存器中的存储区块类变量到存储的映射类上下文对象活动上下文(ActivityExecutionContext)工作流执行上下文(WorkflowExecutionContext)表达式执行上下文(ExpressionExecutionContext)构建构建活动构建工作流运行注册注册工作流注册活动填充Invoke活动可观测性......
  • vue3学习笔记
    1.创建一个vue3项目1.创建vueclinpminstall-g@vue/cli2.创建项目npmcreate<项目名称>开始敲代码啦!!!1.引用组件只需要import就可以了,因为使用了setup之后引用了就会被自动成为子组件了。2.声明数据ref用于声明基本数据类型reactive 用于声明对......