vue2.0组件之间传值、通信的多种方式(干货)

Vue2.0组件之间传值、通信的多种方式(干货)

在Vue.js中,组件间的通信是一个非常重要的话题。本篇文章将详细介绍Vue2.0中的组件通信方式,以及针对不同场景使用哪种方式更为适合。

props和$emit事件

Vue.js中常用的父组件向子组件传递数据的方式就是通过props属性。在父组件中,我们可以使用v-bind指令将数据传递给子组件,如下所示:

<!-- 父组件 -->
<template>
  <div>
    <child :message="msg"></child>
  </div>
</template>

<script>
import Child from './Child.vue'

export default {
  name: 'Parent',
  components: {
    Child
  },
  data () {
    return {
      msg: 'Hello World!'
    }
  }
}
</script>

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

<script>
export default {
  name: 'Child',
  props: {
    message: {
      type: String,
      default: ''
    }
  }
}
</script>

子组件通过 props 接收到了父组件传递的 message 值,进而渲染到了页面上。

此外,我们也可以通过 $emit事件 实现子组件向父组件传递数据。在子组件中,我们可以通过 this.$emit() 触发一个自定义事件,并且将数据传递给父组件。而父组件则可以通过v-on指令绑定这个自定义事件,并接收子组件传递的数据。

<!-- 父组件 -->
<template>
  <div>
    <child @callback="onChildMsg"></child>
  </div>
</template>

<script>
import Child from './Child.vue'

export default {
  name: 'Parent',
  components: {
    Child
  },
  data () {
    return {
      msg: ''
    }
  },
  methods: {
    onChildMsg (data) {
      this.msg = data
    }
  }
}
</script>

<!-- 子组件 -->
<template>
  <button @click="handleClick">Click me</button>
</template>

<script>
export default {
  name: 'Child',
  methods: {
    handleClick () {
      this.$emit('callback', 'Hello World!')
    }
  }
}
</script>

$parent、$children和$refs

在Vue.js中,我们也可以通过父组件引用子组件的方式来进行通信。而这种方式则需要使用到Vue.js中的三个特殊属性:$parent、 $children和 $refs。

  • $parent 属性:可以访问当前组件的父组件实例。
  • $children 属性:可以访问当前组件的子组件实例,返回的是一个数组。
  • $refs 属性:可以访问当前组件内所有含有 ref 属性的元素或子组件。

例如,我们可以在父组件中通过 $refs 属性引用子组件的实例,并直接调用其方法或属性:

<!-- 父组件 -->
<template>
  <div>
    <child ref="myChild"></child>
  </div>
</template>

<script>
import Child from './Child.vue'

export default {
  name: 'Parent',
  components: {
    Child
  },
  mounted () {
    this.$refs.myChild.myMethod()
  }
}
</script>

<!-- 子组件 -->
<script>
export default {
  name: 'Child',
  methods: {
    myMethod () {
      console.log('Hello World')
    }
  }
}
</script>

Event Bus

Event Bus(事件总线)是一种比较灵活和简单的组件通信方式。我们可以使用桥接某种事件来在不同组件之间传递信息。

在Vue.js中,我们可以使用一个空的vue实例作为桥接对象来进行事件的监听和触发。我们可以在这个vue实例上定义自定义事件,并在不同的组件中使用该实例监听或触发事件。

// event-bus.js

import Vue from 'vue'

export default new Vue()
<!-- 父组件 -->
<template>
  <div>
    <button @click="changeState">Change State</button>
  </div>
</template>

<script>
import Event from './event-bus.js';

export default {
  name: 'Parent',
  data () {
    return {
      state: false
    }
  },
  methods: {
    changeState () {
      this.state = !this.state
      Event.$emit('test', this.state)
    }
  }
}
</script>

<!-- 子组件 -->
<template>
  <div>{{ state }}</div>
</template>

<script>
import Event from './event-bus.js';

export default {
  name: 'Child',
  data () {
    return {
      state: false
    }
  },
  mounted () {
    Event.$on('test', this.handleTest)
  },
  methods: {
    handleTest (data) {
      this.state = data
    }
  }
}
</script>

Vuex

当应用变得庞大复杂时,上述的组件通知方式会变得难以维护和管理。Vuex则为我们提供了一种比较理想的解决方案。

Vuex是一个专为 Vue.js 应用程序开发的状态管理模式。它对我们的组件通知方式的管理变得更加的集中,且方式更加规范。

State 代表应用程序状态的单一对象或值。在vue中,我们可以使用Vuex来进行统一状态的管理,不同组件之间的通信也将在Vuex的状态下进行统一管理。具体信息参见 Vuex 文档。

// ./store.js

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

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    },
    decrement (state) {
      state.count--
    }
  }
})
<!-- 父组件 -->
<template>
  <div>
    <button @click="increment">Increment</button>
    <button @click="decrement">Decrement</button>
    <span>{{ count }}</span>
  </div>
</template>

<script>
import { mapState, mapMutations } from 'vuex'

export default {
  name: 'Parent',
  computed: mapState({
    count: state => state.count
  }),
  methods: mapMutations([
    'increment',
    'decrement'
  ])
}
</script>
<!-- 子组件 -->
<template>
  <div>{{ count }}</div>
</template>

<script>
import { mapState } from 'vuex'

export default {
  name: 'Child',
  computed: mapState({
    count: state => state.count
  })
}
</script>

以上就是Vue2.0组件间传递数据通信的多种方式,我们可以根据不同场景来选择相应的通信方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue2.0组件之间传值、通信的多种方式(干货) - Python技术站

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

相关文章

  • vue面包屑组件的封装方法

    下面是关于“Vue面包屑组件的封装方法”的完整攻略: 一、Vue面包屑组件的功能 Vue面包屑组件是一种展示“面包屑导航”的组件,可以使用户快速了解当前自己所在的路径,便于用户在网站中进行页面跳转。 这种组件的基本功能包括: 显示当前页面所在的路径(由多个层级组成) 根据路径提供页面跳转的链接 二、Vue面包屑组件的封装 在Vue中封装一个面包屑组件,可以采…

    Vue 2023年5月27日
    00
  • vue3版本网页小游戏设计思路

    下面就详细讲解“vue3版本网页小游戏设计思路”的完整攻略。 一、介绍 Vue 3是一款前端开发框架,它能够帮助我们快速、高效地开发网页应用。本文将介绍如何使用Vue 3开发一个简单的网页小游戏。 二、设计思路 本次小游戏的开发思路如下: 使用Vue 3来构建界面,使用Vue Router来管理页面路由; 使用Canvas绘制游戏界面、角色和道具; 使用We…

    Vue 2023年5月27日
    00
  • vue实现表格增删改查效果的实例代码

    下面是关于“vue实现表格增删改查效果的实例代码”的完整攻略: 步骤一:搭建环境 在开始编写代码前,我们需要先搭建运行 Vue.js 的环境。可以使用 Vue.js 官网提供的脚手架 Vue CLI 来创建一个 Vue.js 项目。具体步骤如下: 安装 Node.js Vue.js 依赖于 Node.js 环境,因此需要先安装 Node.js。在安装 Nod…

    Vue 2023年5月28日
    00
  • 详解从新建vue项目到引入组件Element的方法

    下面就是关于“详解从新建vue项目到引入组件Element的方法”的完整攻略: 一、新建vue项目 首先,在命令行窗口中执行以下命令,使用vue-cli创建一个新的vue项目: vue create my-project 其中,“my-project”是你想要命名的项目名称,你可以自己调整。 执行完该命令后,会提示你选择一个vue项目的配置模板,如果你是一个…

    Vue 2023年5月28日
    00
  • 爬虫代理的cookie如何生成运行

    如果使用爬虫代理访问需要登录的网站,必须要使用相应的登录凭证来进行访问。其中,cookie是一种常见的登录凭证。通过设置正确的cookie,可以模拟已登录的状态进行网站访问。下面是一个关于如何在使用爬虫代理时生成cookie的攻略。 步骤一:获取登录凭证 要生成cookie,首先需要获取正确的登录凭证,例如用户名和密码。其中,这些凭证可能需要从数据库或者文件…

    Vue 2023年5月28日
    00
  • vue中的proxyTable反向代理(亲测有用)

    下面我将为你详细讲解“vue中的proxyTable反向代理(亲测有用)”的攻略。 什么是proxyTable? proxyTable是vue-cli中用于开发环境的devServer选项的一个配置,可以进行反向代理,实现跨域请求的功能。它可以将本地请求转发到后端API接口进行处理,避免跨域问题和处理复杂的跨域请求头。 proxyTable的配置方式 在vu…

    Vue 2023年5月27日
    00
  • vuex进阶知识点巩固

    关于 “vuex进阶知识点巩固” 的完整攻略,我将按照以下几个方面进行详细讲解: Vuex的基本概念 Vuex的核心概念 Vuex的高级应用 1. Vuex的基本概念 1.1 什么是Vuex? Vuex是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,将组件的共享状态抽取出来,以一个全局单例模式管理。 1.2 V…

    Vue 2023年5月28日
    00
  • 如何解决ElementPlus的el-table底白线问题

    解决Element Plus的el-table底白线问题可以通过修改CSS样式来完成。步骤如下: 第一步:查看el-table的底部样式 通过浏览器的开发者工具,可以查看到el-table的底部样式,它的CSS类名是.el-table__body-wrapper::after。默认情况下,该样式设置了一个底部白线,并且高度为1像素,颜色为#e4e7ed。 第…

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