八种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日

相关文章

  • 面试官问你Vue2的响应式原理该如何回答?

    当面试官问到Vue2的响应式原理,作为Vue开发者,我们需要清楚地掌握该原理并能够清晰地表达出来。以下是几个可以帮助您回答这个问题的攻略: 1. 过程说明 首先需要解释一下响应式的概念,即页面上的数据变化会自动更新UI,而Vue实现响应式的原理是依赖收集和派发更新。 具体来说,当Vue实例化时,它会遍历每个数据属性并为其添加getter和setter方法。这…

    Vue 2023年5月27日
    00
  • 关于VueRouter导入的全过程

    VueRouter是Vue.js官方提供的路由管理插件,可以帮助我们快速搭建单页应用,提供了基于Vue.js的路由机制。下面是关于VueRouter导入的全过程的详细攻略: 安装VueRouter 使用Vue.js框架中的VueRouter前,需要先安装VueRouter。在命令行中使用以下命令安装: npm install vue-router –sav…

    Vue 2023年5月28日
    00
  • vue导出excel表格的新手详细教程

    下面是“vue导出excel表格的新手详细教程”的完整攻略: 1. 安装依赖 首先,我们需要安装两个依赖包,file-saver和xlsx,分别用于文件保存和Excel表格的生成: npm install file-saver xlsx –save 2. 生成Excel文件 在Vue组件中,我们创建一个可以导出表格数据的方法,该方法需要调用xlsx库中的u…

    Vue 2023年5月27日
    00
  • vue中的.capture和.self区分及初步理解

    .vue中的.capture和.self是Vue.js框架中的两个特殊的修饰符。这两个修饰符可以让我们更好地理解Vue.js事件处理的机制。在本文中,我们将深入讨论.Capture和.self修饰符的作用和使用方法。 .capture修饰符 .capture修饰符用于处理事件捕获。Vue.js中的事件处理机制为事件冒泡。事件冒泡是指从子元素到父元素逐步传递事…

    Vue 2023年5月28日
    00
  • Vue导出json数据到Excel电子表格的示例

    下面是“Vue导出json数据到Excel电子表格的示例”的完整攻略: 1. 准备工作 在使用Vue导出json数据到Excel电子表格之前,我们需要先引入几个依赖库: SheetJS :用于将JSON数据转换为Excel电子表格格式。 file-saver :用于将电子表格保存到本地文件系统。 我们可以通过npm安装: npm install xlsx f…

    Vue 2023年5月27日
    00
  • 解决ie11 SCRIPT5011:不能执行已释放Script的代码问题

    当使用IE11访问某些页面时,可能会出现SCRIPT5011:不能执行已释放Script的代码问题,这是由于IE11中的脚本引擎与之前版本的IE存在不同的行为所导致的。如果您遇到了这个问题,那么请按照以下攻略进行解决: 步骤1:确保它是由IE11引起的问题 首先,需要确认这个问题是由IE11引起的。可以在其他现代浏览器(如Chrome、Firefox等)中访…

    Vue 2023年5月28日
    00
  • vue下的@change事件的实现

    当我们在Vue中要监听表单控件的值变化时,可以使用@change事件。在Vue中,可以通过v-model指令来实现数据的双向绑定。当表单的值发生变化时,v-model会自动更新数据,而@change事件则可以在表单的值发生变化时执行自定义逻辑。 下面是一个使用@change事件的示例代码: <template> <div> <i…

    Vue 2023年5月29日
    00
  • Vue中实现v-for循环遍历图片的方法

    下面是如何使用Vue实现v-for循环遍历图片的完整攻略。 准备工作 首先需要准备好需要遍历显示的图片数组数据,每个数组元素包含图片的URL、标题等信息。例如: data() { return { images: [ { url: ‘https://example.com/image1.jpg’, title: ‘Image 1’ }, { url: ‘ht…

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