首页 > 其他分享 >vue通信-provide&inject

vue通信-provide&inject

时间:2023-06-19 22:22:46浏览次数:32  
标签:vue provide inject 按钮 组件 执行 btnShow

刚完成一个需求,父组件开启一个任务,开启后孙组件显示一个执行按钮,在孙组件中点击执行按钮,再到父组件中执行任务并隐藏按钮;可以使用props和emit实现,因为组件层级较多,所以考虑使用provide&inject实现父组件和孙组件的通信;

以下代码记录实现过程:

父组件:Parent.vue

<template>
	<div>
    <child></child>
  	<btn @click="submitTask"></btn>
  </div>
</template>

<script>
export default {
  data() {
    return {
      btnShow: false // 传入孙组件用于显示按钮的属性
    }
  },
  provide() {
    return {
      btnShow: this.btnShow // 将data中的属性传入
      provideMethod: this.executeTask // 传入的方法,孙组件调用该方法,触发父组件中的方法执行
    }
  }
  methods: {
    submitTask() {
      this.btnShow = true; // 执行按钮,传入孙组件显示隐藏
    },
      
    // 执行任务并隐藏按钮
    executeTask() {
      this.btnShow = false;
      // 调用执行任务接口
      ...
    }
  }
}
</script>

子组件:Child.vue

<template>
	<div>
    <son></son>
  </div>
</template>

孙组件:Son.vue

<template>
	<div>
    <btn v-if="btnShow" @click="handleExecute">执行</btn>
  </div>
</template>
<script>
export default {
  inject: ['btnShow','provideMethod']
  methods: {
    handleExecute() {
      // 方法通信,父组件通过provide传入方法,执行传入的方法,触发父组件数据更新
      this.provideMethod()
      // 此处也可以通过eventBus实现
    },
  }
}
</script>

执行this.btnShow = true后发现孙组件执行按钮没有显示,查其原因发现改变了provide中的属性,不会实时传递到inject中,需要传递一个对象才能实现数据响应式,做如下修改:

父组件:Parent.vue

<script>
export default {
  data() {
    return {
      projectObj: {
        btnShow: false
      }
    }
  },
  provide() {
    return {
      projectObj: this.projectObj,
      provideMethod: this.executeTask
    }
  }
  methods: {
    submitTask() {
      this.projectObj.btnShow = true; 
    },
    // 执行任务并隐藏按钮
    executeTask() {
      this.projectObj.btnShow = false;
      // 调用执行任务接口
      ...
    }
  }
}
</script>

孙组件:Son.vue

<template>
	<div>
    <btn v-if="provideObj.btnShow" @click="handleExecute">执行</btn>
  </div>
</template>
<script>
export default {
  inject: ['btnShow','provideMethod']
  methods: {
    handleExecute() {
      // 方法通信,父组件通过provide传入方法,执行传入的方法,触发父组件数据更新
      this.provideMethod()
      // 此处也可以通过eventBus实现
    }
  }
}
</script>

实现功能,完结撒花!

标签:vue,provide,inject,按钮,组件,执行,btnShow
From: https://www.cnblogs.com/meer/p/17492383.html

相关文章

  • 什么是 SAP Commerce Cloud SmartEdit 的 webApplicationInjector.js
    SAPCommerceCloudSmartEdit是SAP提供的一种基于云的电子商务平台,旨在帮助企业轻松管理和优化他们的在线商店。SmartEdit是SAPCommerceCloud的一个功能强大的组件,用于简化网站内容的编辑和管理。通过SmartEdit,商家可以在一个易于使用的界面中轻松地修改和更新网站布局......
  • Html使用Vue3+ElementPlus(图标 ElMessage)
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metahttp-equiv="X-UA-Compatible"content="IE=edge"/><metaname="viewport"content="wid......
  • 记录--Vue3 封装 ECharts 通用组件
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助按需导入的配置文件配置文件这里就不再赘述,内容都是一样的,主打一个随用随取,按需导入。import*asechartsfrom"echarts/core";//引入用到的图表import{LineChart,typeLineSeriesOption}from"echarts/......
  • Angular 应用里 NullInjectorError - No provider for XX 错误的一个场景和分析过程
    最近处理客户incident,有个客户从Spartacus4升级到5.2之后,启动Storefront,console遇到了一个错误消息:NullInjectorError-NoproviderforAnonymousConsentTemplatesAdapter!引起这个错误消息的场景有很多,这个incident最后的场景是:以前的module通过loadedfor......
  • vue-element-template|实现登录,根据权限显示路由
    文章目录前言一、安装vue-element-template基础模板?二、具体步骤1.修改路由文件2.挂载前的验证3.获取用户角色,保存一些从后台获得的roles相关信息4.筛选路由5.最后的加载6.别忘了修改登录、推出、获取用户信息路径三、遇到的bug1.datafunctionsshouldreturn......
  • Vue3中computed的用法
    Vue3中computed的用法computed又被称作计算属性,用于动态的根据某个值或某些值的变化,来产生对应的变化,computed具有缓存性,当无关值变化时,不会引起computed声明值的变化。产生一个新的变量并挂载到vue实例上去。一、computed简写形式<template><div><div>姓:<inputtype="te......
  • vue3 + i18n
    vue3+i18n安装:npminstallvue-i18nyarnaddvue-i18nmain.js如果在一个模块系统中使用它,你必须通过Vue.use()明确地安装vue-i18n:import{createApp}from'vue'importAppfrom'./App.vue'importElementPlusfrom'element-plus'import'element......
  • 谈谈Vue3中的ref和reactive
    谈谈Vue3中的ref和reactiveref和reactive是什么?ref和reactive是Vue3中用来实现数据响应式的API一般情况下,ref定义基本数据类型,reactive定义引用数据类型(我喜欢用它来定义对象,不用它定义数组,原因后面讲)我理解的ref本质上是reactive的再封装二、先聊reactivereactive定义引用数据......
  • vite+vue3项目中使用 lottie 动画,如何在 template 中直接使用本地 json 文件路径
    安装lottie-webyarnaddlottie-web封装 lottie组件<template><divref="animation":style="{width,height}"></div></template><script>import{defineComponent,ref,onMounted}from'vue'......
  • Grafana 系列-GaC-2-Grafana Terraform Provider 基础
    系列文章Grafana系列文章Terraform系列文章概述前文最后总结了我的工具选型:GrafanaTerraformproviderJsonnet我们今天先简单介绍GrafanaTerraformprovider.GrafanaTerraformProviderGrafanaprovider为Grafana提供配置管理资源。是目前Grafana官方提供......