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

以下是八种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日

相关文章

  • javascript使用substring实现的展开与收缩文字功能示例

    下面是详细讲解JavaScript使用substring实现的展开与收缩文字功能的完整攻略。 什么是“展开与收缩文字功能”? “展开与收缩文字功能”指的是一个常见的交互效果,即当页面上某一段文字过长时,可以利用JavaScript代码将其缩短并用一个“展开”按钮控制显示全部内容或隐藏部分内容。这种效果通常用于提升页面的读取体验,避免过多文字占据页面空间。 使…

    Vue 2023年5月28日
    00
  • 浅谈Vue+Ant Design form表单的一些坑

    浅谈Vue+Ant Design form表单的一些坑 前言 在Vue结合Ant Design使用form表单时,可能会遇到一些坑。本攻略将会详细讲解如何解决这些坑,并提供一些示例说明。 Ant Design form表单-基本使用 首先,在使用Ant Design form表单时,我们需要先安装Ant Design of Vue。安装命令如下: npm i…

    Vue 2023年5月28日
    00
  • vue-router钩子函数实现路由守卫

    下面为你详细讲解Vue Router钩子函数实现路由守卫的完整攻略。 钩子函数介绍 Vue Router提供了多个钩子函数,可以在路由发生变化时执行一些操作。以下是常用的钩子函数: beforeEach(to, from, next) :进入路由之前触发,next必须调用,才能进入下一个钩子。其中参数to和from分别表示即将进入的路由和即将离开的路由。 a…

    Vue 2023年5月28日
    00
  • vue实现百度下拉列表交互操作示例

    具体介绍 Vue是一款MVVM(Model-View-ViewModel)框架,它的核心是实现了双向数据绑定和组件化系统。双向绑定可以使数据的修改和视图的更新同步进行,显著提高了开发效率和协作效率;组件化系统可以将页面拆分成多个独立的模块,提高代码重用性,并且允许多人协同开发大型项目。Vue的虚拟DOM机制以及其性能表现也更加优秀,使其与Angular和Re…

    Vue 2023年5月28日
    00
  • vue如何截取字符串

    当在Vue中需要对字符串进行截取时,可以使用Vue提供的过滤器和JavaScript原生方法来完成。以下是实现的方法: 1. 使用Vue过滤器 Vue提供了可以当作全局过滤器使用的方法: Vue.filter(‘substring’, function(value, length) { if (!value) return ”; if (value.len…

    Vue 2023年5月27日
    00
  • vue中rem的配置的方法示例

    当我们在使用vue框架开发网站时,经常需要使用rem单位进行网站的样式设计,然而,在不同的屏幕大小下,rem的大小也需要跟着变化,因此我们需要针对不同的屏幕尺寸去设置不同的rem大小。以下是在vue中配置rem的方法示例。 一、安装插件 在vue中配置rem需要使用一个插件,即postcss-pxtorem,我们可以通过以下命令进行安装: npm insta…

    Vue 2023年5月28日
    00
  • Vue3源码解析watch函数实例

    Vue3源码解析watch函数实例 在Vue3.x中,watch函数作为一个重要的API存在,它能够对一个值进行监测,当这个值发生变化时,就可以执行相关的回调函数。本文将分享一个完整的攻略,来解析Vue3源码中watch函数的实现。 1. watch函数的基本用法 在Vue3.x中,watch函数的基本用法如下: // 监听一个值 watch( // 被监听…

    Vue 2023年5月27日
    00
  • Vue指令指令大全

    Vue指令是Vue.js的核心特性之一,为Vue.js提供了非常灵活和强大的操作DOM的能力。下面是Vue.js中常用的指令指令: v-text 指令格式:v-text 功能:用于在元素中输出文本内容,和插值表达式{{}}相同 示例: <!– Vue实例 –> <div id="app"> <p v-te…

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