八种vue实现组建通信的方式

yizhihongxing

以下是八种Vue实现组件通信的完整攻略:

1. Props

Props是Vue组件间通信中最常用的一种方式。Props允许父组件向子组件传递数据,可以通过在子组件中声明props选项来接收父组件传递的值。示例代码如下:

<!--父组件模版-->
<template>
  <Child :msg="message" />
</template>

<!--子组件模版-->
<template>
  <div>{{ msg }}</div>
</template>

<script>
export default {
  name: 'Child',
  props: ['msg']
}
</script>

2. $emit

$emit是Vue组件间通信中另一种常用方式,它允许子组件触发自定义事件并发送数据到父组件。父组件通过v-on(或@)监听子组件触发的事件,将子组件发送的数据作为回调函数的参数。示例代码如下:

<!--父组件模版-->
<template>
  <Child v-on:update="handleUpdate" />
</template>

<script>
export default {
  name: 'Parent',
  methods: {
    handleUpdate(value) {
      this.message = value
    }
  }
}
</script>

<!--子组件模版-->
<template>
  <button v-on:click="updateMessage">Update</button>
</template>

<script>
export default {
  name: 'Child',
  methods: {
    updateMessage() {
      this.$emit('update', 'hello')
    }
  }
}
</script>

3. $parent / $children

可以在子组件中使用$parent访问父组件实例,但是这种方式容易造成父子组件之间的高耦合,不建议使用。可以使用$children访问子组件实例,但是这种方式同样不可靠,因为$children的执行顺序是不确定的。示例代码如下:

<!--父组件模版-->
<template>
  <Child />
</template>

<script>
export default {
  name: 'Parent',
  mounted() {
    console.log(this.$children[0].message)
  }
}
</script>

<!--子组件模版-->
<template>
  <div>{{ message }}</div>
</template>

<script>
export default {
  name: 'Child',
  data() {
    return {
      message: 'hello'
    }
  }
}
</script>

4. $refs

$refs可以在父组件上引用子组件实例或子元素,从而直接调用子组件的方法或访问子元素的属性。如果要引用子组件实例,需要在子组件上使用ref属性。示例代码如下:

<!--父组件模版-->
<template>
  <Child ref="child" />
</template>

<script>
export default {
  name: 'Parent',
  mounted() {
    console.log(this.$refs.child.message)
  }
}
</script>

<!--子组件模版-->
<template>
  <div>{{ message }}</div>
</template>

<script>
export default {
  name: 'Child',
  data() {
    return {
      message: 'hello'
    }
  }
}
</script>

5. event bus

Event Bus是一种Vue中常用的全局事件总线,它可以在任何地方触发自定义事件和监听自定义事件。之所以称之为总线,是因为它是一个全局Vue实例,可以通过$emit触发自定义事件,通过$on监听自定义事件。示例代码如下:

main.js:

Vue.prototype.$bus = new Vue();
<!--父组件模版-->
<template>
  <div>
    <input v-model="message" />
    <button v-on:click="sendMessage">Send Message</button>
  </div>
</template>

<script>
export default {
  name: 'Parent',
  data() {
    return {
      message: ''
    }
  },
  methods: {
    sendMessage() {
      this.$bus.$emit('message', this.message);
    }
  }
}
</script>

<!--子组件模版-->
<template>
  <div>{{ message }}</div>
</template>

<script>
export default {
  name: 'Child',
  data() {
    return {
      message: ''
    }
  },
  mounted() {
    this.$bus.$on('message', (value) => {
      this.message = value;
    });
  }
}
</script>

6. Vuex

Vuex是Vue官方推荐的状态管理库,它可以在不同组件之间共享状态及数据。在Vuex的架构中,状态从根组件向下逐级分发,而每个组件都可以通过getter、mutation、action方法进行更新。这种方式适用于组件之间关系非常复杂,需要共享数据的场景。示例代码如下:

store.js:

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
     message: ''
  },
  mutations: {
     updateMessage(state, payload) {
        state.message = payload;
     }
  },
  actions: {
     updateMessage(context, payload) {
        context.commit('updateMessage', payload)
     }
  },
  getters: {
     message: state => state.message
  }
})
<!--父组件模版-->
<template>
  <div>
    <input v-model="message" />
    <button v-on:click="sendMessage">Send Message</button>
  </div>
</template>

<script>
export default {
  name: 'Parent',
  data() {
    return {
      message: ''
    }
  },
  methods: {
    sendMessage() {
      this.$store.dispatch('updateMessage', this.message);
    }
  }
}
</script>

<!--子组件模版-->
<template>
  <div>{{ message }}</div>
</template>

<script>
import { mapGetters } from 'vuex'

export default {
  name: 'Child',
  computed: {
    ...mapGetters([
      'message'
    ])
  }
}
</script>

7. provide / inject

provide / inject是Vue 2.2.0新增的一种组件间通信方式,它可以提供一种高效的途径,让父组件后代组件之间共享一些数据。provide负责提供数据,而inject负责将数据注入到后代组件中。需要注意的是,这种方式向后代组件传递数据时,不像props那样明确,而是在后代组件中使用inject选项来去声明需要注入的字段。示例代码如下:

<!--父组件模版-->
<template>
  <div>
    <Child />
  </div>
</template>

<script>
import Child from './Child'

export default {
  name: 'Parent',
  provide() {
    return {
      message: 'hello'
    }
  },
  components: {
    Child
  }
}
</script>

<!--子组件模版-->
<template>
  <div>{{ message }}</div>
</template>

<script>
export default {
  name: 'Child',
  inject: ['message']
}
</script>

8. mixin

Mixin是一种Vue提供的重用逻辑的方式,可以将多个组件共同需要的逻辑统一封装进一个Mixin对象中,然后再把这个对象引入到需要使用该逻辑的组件中。它适用于多个组件可能需要重用相同的逻辑的场景。示例代码如下:

// 消息Mixin
export const messageMixin = {
  methods: {
    showMessage() {
      alert(this.message)
    }
  },
  data() {
    return {
      message: 'hello'
    }
  }
}
<!--父组件模版-->
<template>
  <div>
    <Child />
    <OtherChild />
  </div>
</template>

<script>
import Child from './Child'
import OtherChild from './OtherChild'
import { messageMixin } from './mixins'

export default {
  name: 'Parent',
  mixins: [messageMixin],
  components: {
    Child,
    OtherChild
  }
}
</script>

<!--子组件模版-->
<template>
  <button v-on:click="showMessage">Show Message</button>
</template>

<script>
export default {
  name: 'Child',
  mixins: [messageMixin]
}
</script>

以上就是八种Vue实现组件通信的方式的完整攻略,对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:八种vue实现组建通信的方式 - Python技术站

(0)
上一篇 2023年5月29日
下一篇 2023年5月29日

相关文章

  • 分分钟学会vue中vuex的应用(入门教程)

    分分钟学会vue中vuex的应用(入门教程) 简介 Vuex是一个专门为Vue.js设计的状态管理库,它可以简化Vue.js应用程序中状态管理的开发流程,提高应用程序的性能和可维护性。 安装 Vuex可以通过npm进行安装,打开命令行界面并输入以下命令: npm install vuex 配置 在Vue.js应用程序中使用Vuex,需要依次执行以下步骤: 引…

    Vue 2023年5月27日
    00
  • vue2.0实现前端星星评分功能组件实例代码

    下面我将为你详细讲解“vue2.0实现前端星星评分功能组件实例代码”的完整攻略。 1. 安装依赖 首先,我们需要在项目中安装vue-router,并且在前端界面中安装vue2-star-rating这个插件。在终端中输入以下命令: npm install vue-router npm install vue2-star-rating 2. 路由配置 接下来,…

    Vue 2023年5月28日
    00
  • vue的表单数据收集案例之基本指令和自定义指令详解

    Vue的表单数据收集是Vue.js中的一个重要的知识点,它可以帮助我们快速收集表单数据并进行处理。而在实际开发中,我们将会经常使用到Vue中的指令来帮助我们实现表单数据收集。其中,基本指令包括v-model、v-bind等,自定义指令主要指基于v-model进行二次封装的自定义指令。下面,我们将具体讲解关于Vue的表单数据收集案例之基本指令和自定义指令的攻略…

    Vue 2023年5月27日
    00
  • vue的h5日历组件实现详解

    vue的h5日历组件实现详解 什么是vue的h5日历组件? vue的h5日历组件是一个基于vue框架实现的,适用于手机h5应用的日历组件。它可以方便地实现日历的展示、日期的选择、事件的添加和编辑等功能。 实现步骤 第一步:安装依赖 首先,需要安装两个依赖:vue-calendar 和 moment.js。我们可以使用npm或yarn进行安装: npm ins…

    Vue 2023年5月29日
    00
  • vue filter的四种用法小结

    下面是“Vue Filter的四种用法小结”的详细讲解。 什么是Vue Filter? Vue Filter是Vue.js中提供的一种数据过滤器(Data Filter)。它可以通过对数据进行转换和过滤来得到符合需求的数据。Filter可以在模板中使用,也可以在JavaScript代码中使用。 Vue Filter的四种用法 全局Filter 全局Filte…

    Vue 2023年5月28日
    00
  • 自定义Vue组件打包、发布到npm及使用教程

    下面是详细的“自定义Vue组件打包、发布到npm及使用教程”的完整攻略: 一、前置准备 在开始之前,你需要确保以下几点已经完成: 已安装 Node.js 已安装 Vue CLI 已注册 NPM 账号并登录 二、创建 Vue 组件 创建 Vue 项目 首先,我们需要使用 Vue CLI 快速创建一个 Vue 项目。在命令行中运行以下命令: vue create…

    Vue 2023年5月28日
    00
  • 一步步讲解Vue如何启动项目

    作为Vue项目的作者,我很乐意为您介绍如何启动Vue项目。下面是一步步讲解的完整攻略: 步骤一:安装 Node.js Vue.js 是一个基于Node.js构建的应用程序框架,因此,为了启动 Vue 项目,首先需要安装 Node.js。请访问 Node.js 官网 下载并安装 Node.js 的最新版本。 步骤二:使用 Vue CLI 快速创建一个 Vue …

    Vue 2023年5月28日
    00
  • Vue组件间的通信pubsub-js实现步骤解析

    下面我将详细讲解“Vue组件间的通信pubsub-js实现步骤解析”。 什么是pubsub-js? pubsub-js是一个基于发布/订阅模式的Javascript库,提供了一种解耦的方式,让我们的代码更加灵活和易于维护。在Vue组件间的通信中,我们可以使用pubsub-js来实现跨组件的数据传递。 pubsub-js的安装 我们可以使用npm或yarn在项…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部