iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >vue指令如何实现组件通信
  • 678
分享到

vue指令如何实现组件通信

2023-07-05 01:07:51 678人浏览 独家记忆
摘要

本文小编为大家详细介绍“Vue指令如何实现组件通信”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue指令如何实现组件通信”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。vue指令实现组件通信的方法:1、父组件通

本文小编为大家详细介绍“Vue指令如何实现组件通信”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue指令如何实现组件通信”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

vue指令实现组件通信的方法:1、父组件通过“props”的方式向子组件传递数据,而通过“$emit”子组件可以向父组件通信;2、通过“ref/$refs”属性实现组件通信;3、通过eventBus事件总线实现组件通信;4、使用Vuex实现组件通信;5、通过“$attrs”与“$listeners”实现组件通信等。

Vue实现组件间通信的七种方式

1. props / $emit

父组件通过props的方式向子组件传递数据,而通过$emit 子组件可以向父组件通信:

  • 父传子:父组件通过import引入子组件,并注册,在子组件标签上添加要传递的属性,子组 件通过props接收,接收有两种形式一是通过数组形式[‘要接收的属性’ ],二是通过对象形式{ }

  • 子传父:父组件向子组件传递事件方法,子组件通过$emit触发事件,回调给父组件

props的特点:

  • props只能是父组件向子组件进行传值,props使得父子组件之间形成一个单向的下行绑定。子组件的数据会随着父组件的更新而响应式更新;但是子组件无法引起父组件的数据更新。

  • props可以显示定义一个或一个以上的数据,对于接收的数据,可以是各种数据类型,同样也可以是传递一个对象或函数。

  • props属性名规则:若在props中使用驼峰形式,模板中标签需要使用短横线的形式来书写。

代码示例:

父传子(prop的用法)

父组件:

<template>
   <div id="father">
       <son :msg="msg" :fn="myFunc"></son>
   </div>
</template>

<script>
import son from "./son.vue";
export default {
   name: "father",
   components: {
       son
   },
   data() {
       msg: "我是父组件";
   },
   methods: {
       myFunc() {
           console.log("我是父组件的方法");
       }
   }
};
</script>

子组件:

<template>
   <div id="son">
       <p>{{msg}}</p>
       <button @click="fn">按钮</button>
   </div>
</template>
<script>
export default {
   name: "son",
   props: ["msg", "fn"]
};
</script>

子传父($emit的用法)

$emit 绑定一个自定义事件,当这个事件被执行的时候就会将参数传递给父组件,而父组件通过v-on监听并接收参数

父组件:

<template>
 <div id="father">
   <son :arrList="arrList" @changeIndex="changeIndex"></son>
   <p>{{currentIndex}}</p>
 </div>
</template>

<script>
import son from './son.vue'
export default {
 name: 'father',
 components: { son},
 data() {
   return {
     currentIndex: -1,
     arrList: ['龙族', '绘梨衣', '前端','后端']
   }
 },
 methods: {
   changeIndex(index) {
     this.currentIndex = index
   }
 }
}
</script>

子组件:

<template>
 <div>
   <div v-for="(item, index) in arrList" :key="index" @click="emitIndex(index)">{{item}}</div>
 </div>
</template>

<script>
export default {
 props: ['arrList'],
 methods: {
   emitIndex(index) {
     this.$emit('changeIndex', index) // 触发父组件的方法,并传递参数index
   }
 }
}
</script>

2.ref / $refs

ref:这个属性用在子组件上,它的引用就指向了该子组件的实例,可以通过实例来访问组件的数据和方法;如果在普通的 DOM 元素上使用,引用指向的就是 DOM元素

父组件:

<template>
 <child ref="child"></component-a>
</template>
<script>
 import child from './child.vue'
 export default {
   components: { child },
   mounted () {
     console.log(this.$refs.child.name);  // mySon
     this.$refs.child.sayHello();  // Hello father!
   }
 }
</script>

子组件:

<template>
 <div id="app"></div>
</template>
<script>
export default {
 name:'child',
 data () {
   return {
     name: 'mySon'
   }
 },
 methods: {
   sayHello () {
     console.log('Hello father!')
   }
 }
}
</script>

3.eventBus(事件总线)

其原理就是:事件订阅发布,eventBus 又称为事件总线,在vue中可以使用它来作为沟通桥梁的概念, 就像是所有组件共用相同的事件中心,可以向该中心注册发送事件或接收事件, 所以组件都可以通知其他组件。

使用步骤如下:

(1)创建事件中心管理组件之间的通信

// event-bus.js

import Vue from 'vue'
export const EventBus = new Vue()

(2)发送事件 假设有两个兄弟组件firstCom和secondCom:

firstCom和secondCom的父组件:

<template>
 <div>
   <first-com></first-com>
   <second-com></second-com>
 </div>
</template>

<script>
import firstCom from './firstCom.vue'
import secondCom from './secondCom.vue'
export default {
 components: { firstCom, secondCom }
}
</script>

在firstCom组件中发送事件:

<template>
 <div>
   <button @click="add">点击增加</button>    
 </div>
</template>

<script>
import {EventBus} from './event-bus.js' // 引入事件中心

export default {
 data(){
   return{
     num:0
   }
 },
 methods:{
   add(){
     EventBus.$emit('addition', {
       num:this.num++
     })
   }
 }
}
</script>

(3)接收事件

在secondCom组件中接收事件:

<template>
 <div>求和: {{count}}</div>
</template>

<script>
import { EventBus } from './event-bus.js'
export default {
 data() {
   return {
     count: 0
   }
 },
 mounted() {
   EventBus.$on('addition', param => {
     this.count = this.count + param.num;
   })
 }
}
</script>

在上述代码中,这就相当于将num值存贮在了事件总线中,在其他组件中可以直接访问。事件总线就相当于一个桥梁,不用组件通过它来通信。虽然看起来比较简单,但是这种方法也有不变之处,如果项目过大,使用这种方式进行通信,后期维护起来会很困难。

4.Vuex

Vuex 是一个专为 vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.

Vuex 解决了多个视图依赖于同一状态和来自不同视图的行为需要变更同一状态的问题,将开发者的精力聚焦于数据的更新而不是数据在组件之间的传递上

Vuex各个模块:

  • state:用于数据的存储,是store中的唯一数据源

  • getters:如vue中的计算属性一样,基于state数据的二次包装,常用于数据的筛选和多个数据的相关性计算

  • mutations:类似函数,改变state数据的唯一途径,且不能用于处理异步事件

  • actions:类似于mutation,用于提交mutation来改变状态,而不直接变更状态,可以包含任意异步操作

  • modules:类似于命名空间,用于项目中将各个模块的状态分开定义和操作,便于维护

Vuex使用步骤:

(1)这里我们先新建 store文件夹, 对Vuex进行一些封装处理

在 store 文件夹下添加 index.js 文件

// index.js

// 自动挂载指定目录下的store
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

let modules = {}

// @/store/module 目录下的文件自动挂载为 store 模块
const subModuleList = require.context('@/store/modules', false, /.js$/)
subModuleList.keys().forEach(subRouter => {
 const moduleName = subRouter.substring(2, subRouter.length - 3)
 modules[moduleName] = subModuleList(subRouter).default
})
//也可自己手动挂载(自行选择)

export default new Vuex.Store({
 state: {},
 mutations: {},
 actions: {},
 modules
})

(2)在 store 文件夹下添加 module 文件夹,在module文件夹再新建 user.js 文件

// user.js

import user from '@/utils/user.js'
import userapi from '@/apis/user'
import { OPEN_ACCOUNT_STAGE, STAGE_STATUS } from '@/constant'

let getUserPromise = null

export default {
 namespaced: true,
 state() {
   return {
     userInfo: null, // 用户信息
     isLogined: !!user.getToken(), // 是否已经登录
   }
 },
 mutations: {
   // 更新用户信息
   updateUser(state, payload) {
     state.isLogined = !!payload
     state.userInfo = payload
   },
 },
 actions: {
   // 获取当前用户信息
    getUserInfo(context, payload) {
     //相关代码
   },

   // 登出
    loGout(context, payload = {}) {
     // 是否手动退出
     const { manual } = payload
     if (manual) {
       await userApi.postLogout()
     }
     user.clearToken()
     context.commit('updateUser', null)
   },
 }
}

(3)然后在项目的 main.js 文件中引入

import Vue from 'vue'
import App from '@/app.vue'
import { router } from '@/router'
import store from '@/store/index'

const vue = new Vue({
 el: '#app',
 name: 'root',
 router,
 store,
 render: h => h(App),
})

(4)封装很愉快结束了了,然后就正常操作即可

this.$store.state.user.isLogined
this.$store.state.user.userInfo
this.$store.commit('user/updateUser', {})
await this.$store.dispatch('user/logout', { manual: true })

5.$attrs与 $listeners

现在我们来讨论另一种情况:如果我们给出的组件关系图中A组件与D组件是隔代关系, 那它们之前进行通信有哪些方式呢?

  1. 使用props绑定来进行一级一级的信息传递, 如果D组件中状态改变需要传递数据给A, 使用事件系统一级级往上传递

  2. 使用eventBus,这种情况下还是比较适合使用, 但是碰到多人合作开发时, 代码维护性较低, 可读性也低

  3. 使用Vuex来进行数据管理, 但是如果仅仅是传递数据, 而不做中间处理,使用Vuex处理感觉有点大材小用了.

所以就有了 $attrs / $listeners ,通常配合 inheritAttrs 一起使用。

inheritAttrs

默认情况下父作用域的不被认作 props 的 attribute 绑定 (attribute bindings) 将会“回退”且作为普通的 html attribute 应用在子组件的根元素上。当撰写包裹一个目标元素或另一个组件的组件时,这可能不会总是符合预期行为。

通过设置 inheritAttrs 到 false,这些默认行为将会被去掉。而通过实例 property $attrs 可以让这些 attribute 生效,且可以通过 v-bind 显性的绑定到非根元素上。

注意:这个选项不影响 class 和 style 绑定,Vue对class和style做了特殊处理

简单来说就是

  • inheritAttrs:true 时继承除props之外的所有属性

  • inheritAttrs:false 只继承class 和 style属性

  • $attrs:包含了父作用域中不被认为 (且不预期为) props 的特性绑定 (class 和 style 除外),并且可以通过 v-bind="$attrs" 传入内部组件。当一个组件没有声明任何 props 时,它包含所有父作用域的绑定 (class 和 style 除外)。

  • $listeners:包含了父作用域中的 (不含 .native 修饰符) v-on 事件监听器。它可以通过 v-on="$listeners" 传入内部组件。它是一个对象,里面包含了作用在这个组件上的所有事件监听器,相当于子组件继承了父组件的事件。

代码示例:

父组件:

<template>
   <child :name="name" :age="age" :infoObj="infoObj" @updateInfo="updateInfo" @delInfo="delInfo" />
</template>
<script>
   import Child from '../components/child.vue'
   export default {
       name: 'father',
       components: { Child },
       data () {
           return {
               name: '绘梨衣',
               age: 22,
               infoObj: {
                   from: '河北',
                   job: 'superman',
                   hobby: ['reading', 'writing', 'eating']
               }
           }
       },
       methods: {
           updateInfo() {
               console.log('update info');
           },
           delInfo() {
               console.log('delete info');
           }
       }
   }
</script>

儿子组件:

<template>
   <!-- 通过 $listeners 将父作用域中的事件,传入 grandSon 组件,使其可以获取到 father 中的事件 -->
   <grand-son :height="height" :weight="weight" @addInfo="addInfo" v-bind="$attrs" v-on="$listeners"  />
</template>
<script>
   import GrandSon from '../components/grandSon.vue'
   export default {
       name: 'child',
       components: { GrandSon },
       props: ['name'],
       data() {
         return {
             height: '170cm',
             weight: '55kg'
         };
       },
       created() {
           console.log(this.$attrs);
       // 结果:age, infoObj, 因为父组件共传来name, age, infoObj三个值,由
            //于name被 props接收了,所以只有age, infoObj属性
           console.log(this.$listeners); // updateInfo: f, delInfo: f
       },
       methods: {
           addInfo () {
               console.log('add info')
           }
       }
   }
</script>

孙子组件:

<template>
   <div>
       {{ $attrs }} --- {{ $listeners }}
   <div>
</template>
<script>
   export default {
       props: ['weight'],
       created() {
           console.log(this.$attrs); // age, infoObj, height
           console.log(this.$listeners)
         // updateInfo: f, delInfo: f, addInfo: f
           this.$emit('updateInfo')
         // 可以触发 father 组件中的updateInfo函数
       }
   }
</script>

6.$parent / $children

  • 使用$parent可以让组件访问父组件的实例(访问的是上一级父组件的属性和方法)。

  • 使用 $children 可以让组件访问子组件的实例,但是, $children 并不能保证顺序,并且访问的数据也不是响应式的。

注意:

  • 通过 $parent 访问到的是上一级父组件的实例,可以使用 $root 来访问根组件的实例

  • 在组件中使用$children拿到的是所有的子组件的实例,它是一个数组,并且是无序的

  • 在根组件 #app 上拿 $parent 得到的是 new Vue()的实例,在这实例上再拿 $parent 得到的是undefined,而在最底层的子组件拿 $children 是个空数组

  • $children 的值是数组,而 $parent是个对象

用法:

子组件:

<template>
 <div>
   <span>{{message}}</span>
   <p>父组件的值为:  {{parentVal}}</p>
 </div>
</template>

<script>
export default {
 data() {
   return {
     message: 'Vue'
   }
 },
 computed:{
   parentVal(){
     return this.$parent.msg;
   }
 }
}
</script>

父组件:

<template>
 <div class="app">
   <div>{{msg}}</div>
   <child></child>
   <button @click="change">点击改变子组件值</button>
 </div>
</template>

<script>
import child from './child.vue'
export default {
 components: { child },
 data() {
   return {
     msg: 'Hello'
   }
 },
 methods: {
   change() {
     // 获取到子组件
     this.$children[0].message = 'javascript'
   }
 }
}
</script>

7.依赖注入(provide / inject)

这种方式就是vue中依赖注入,该方法用于 父子组件之间 的通信。当然这里所说的父子不一定是真正的父子,也可以是祖孙组件,在层数很深的情况下,可以使用这种方式来进行传值。就不用一层一层的传递数据了。

provide和inject是vue提供的两个钩子,和data、methods是同级的。并且provide的书写形式和data一样。

  • provide 钩子用来发送数据或方法

  • inject钩子用来接收数据或方法

注意: 依赖注入所提供的属性是非响应式的。

用法:

父组件:

provide() { 
   return {    
       num: this.num  
   };
}

子组件:

inject: ['num']

还有另一种写法,这种写法可以访问父组件中的所有属性:

provide() {
return {
   app: this
 };
}
data() {
return {
   num: 111
 };
}

inject: ['app']
console.log(this.app.num)

读到这里,这篇“vue指令如何实现组件通信”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: vue指令如何实现组件通信

本文链接: https://www.lsjlt.com/news/348972.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue指令如何实现组件通信
    本文小编为大家详细介绍“vue指令如何实现组件通信”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue指令如何实现组件通信”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。vue指令实现组件通信的方法:1、父组件通...
    99+
    2023-07-05
  • vue指令怎么实现组件通信
    本教程操作环境:Windows10系统、Vue 3版、DELL G3电脑vue指令怎么实现组件通信?Vue实现组件间通信的七种方式1. props / $emit父组件通过props的方式向子组件传递数据,而通过$emit 子组件可以向父组...
    99+
    2023-05-14
    Vue
  • vue如何实现组件通信
    这篇文章主要介绍vue如何实现组件通信,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言在vue中, 组件的关系不外乎以下三种:组件是需要通信的,在开发中,常用到的通信方式有:vuex、eventBus、以及prop...
    99+
    2023-06-29
  • Vue如何实现组件间通信
    目录1. 父子间通信1.1 父组件 --> 儿子组件1.2 儿子组件 --> 父组件2. 爷孙间通信3. 任意组件间通信3.1 EventBus3.2 Vuex1. 父子...
    99+
    2024-04-02
  • vue组件间通信如何实现
    本篇内容主要讲解“vue组件间通信如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue组件间通信如何实现”吧!父组件传子组件父传子方法(一) 属性传递 props//子组件&l...
    99+
    2023-07-04
  • 如何用Vue实现父子组件通信
    目录一、父子组件的关系构成二、props三、$emit四、$parent五、总结 一、父子组件的关系构成 本篇文章将要总结的是Vue中父子组件之间的通信方式。 那在vue中父子组件之...
    99+
    2024-04-02
  • Vue如何实现组件间通信方式
    这篇文章主要介绍了Vue如何实现组件间通信方式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。props父组件可以通过props向下传递数据给子组件静态的Props通过为子组件...
    99+
    2023-06-29
  • vue中怎么利用v-model指令实现父子组件通信
    本篇文章给大家分享的是有关vue中怎么利用v-model指令实现父子组件通信,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。vue的双向数据绑定...
    99+
    2024-04-02
  • React组件通信如何实现
    这篇文章主要介绍“React组件通信如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“React组件通信如何实现”文章能帮助大家解决问题。1. 父子组件通信方式父子组件之间的通信很常见,其中父组...
    99+
    2023-07-05
  • vue中如何实现非父子组件的通信
    这篇文章主要介绍了vue中如何实现非父子组件的通信,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、Provide和InjectProvide和Inject用于非父子组件之间...
    99+
    2023-06-29
  • vue中怎么实现组件间通信
    vue中怎么实现组件间通信,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。父组件传子组件父传子方法(一) 属性传递 props//子组件 &...
    99+
    2024-04-02
  • 怎么在vue中实现组件通信
    怎么在vue中实现组件通信?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Vue的优点Vue具体轻量级框架、简单易学、双向数据绑定、组件化、数据和结构的分离、虚拟DOM、运行速度...
    99+
    2023-06-14
  • vue-cli中怎么实现组件通信
    vue-cli中怎么实现组件通信,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一.父传子组件通信拿app.vue当父组件,content.vu...
    99+
    2024-04-02
  • 怎么用eventemitter2实现Vue组件通信
    这篇文章主要讲解了“怎么用eventemitter2实现Vue组件通信”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用eventemitter2实现Vue组件通信”吧!概述当两个组件之间...
    99+
    2023-07-04
  • Vue实现组件间通信的示例
    这篇文章主要介绍了Vue实现组件间通信的示例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 父子间通信最常见的就是父子之间的通信,通信是双向的数据传递。1.1 父组件 -...
    99+
    2023-06-15
  • vue组件间如何进行通信
    本篇内容介绍了“vue组件间如何进行通信”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!vue是数据驱动视图更新的框架, 我们平时开发,都会把...
    99+
    2023-06-21
  • Vue如何实现父子组件之间的通信功能
    这篇文章主要为大家展示了“Vue如何实现父子组件之间的通信功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Vue如何实现父子组件之间的通信功能”这篇文章吧。在...
    99+
    2024-04-02
  • React如何实现跨级组件通信
    这篇文章主要介绍React如何实现跨级组件通信,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!跨级组件通信假设一个父组件中存在一个子组件,这个子组件中又存在一个子组件,暂且称为“孙组件...
    99+
    2024-04-02
  • React如何实现父子组件通信
    这篇文章主要介绍React如何实现父子组件通信,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!父子组件通信原理:父组件通过props(与vue中的props区分开)向子组件通信,子组件...
    99+
    2024-04-02
  • vue父子组件间通信怎么实现
    本篇内容介绍了“vue父子组件间通信怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.父组件传递数据给子组件父组件数据如何传递给子组...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作