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 使用post/get 下载导出文件操作

    要在Vue中使用POST/GET下载导出文件,我们可以使用Axios库来发送异步请求并处理响应。以下是完整的攻略。 创建后台API 首先,我们需要在后台创建可以导出文件的API。通常情况下,我们会在服务器上为此目的创建一个专用的控制器。 对于此示例,我们将创建一个名为export的GET请求,并将文件的URL作为响应发送回到客户端。请注意,此示例代码仅用于参…

    Vue 2023年5月27日
    00
  • Vue之自定义事件内容分发详解

    Vue之自定义事件内容分发详解 Vue.js允许我们使用自定义事件来在组件之间传递数据。自定义事件需要发出方在适当的时候触发事件,接收方在实例中监听对应的事件。Vue.js给我们提供了$emit和$on方法来实现自定义事件。 自定义事件的分发可以使用一般的事件模型,也可以使用特殊的$emit方法来进行分发,让每个组件都有机会响应这个事件。 实现自定义事件 V…

    Vue 2023年5月29日
    00
  • vue基于input实现密码的显示与隐藏功能

    Vue基于input实现密码的显示与隐藏功能的攻略如下: 开发环境搭建 首先我们需要保证有一个稳定的开发环境。这里我们可以借助脚手架工具Vue-cli,快速地搭建起一个本地环境。 密码框显示状态绑定 我们需要通过v-model指令来将input框的显示状态进行绑定。在data里面新增一个变量passwordVisible,并且默认设置为false,表示密码框…

    Vue 2023年5月27日
    00
  • vue踩坑记录:属性报undefined错误问题

    当你使用Vue.js构建自己的应用时,可能会遇到属性报undefined错误问题,这种问题会造成很大的困扰。下面让我们详细讲解一下怎么解决这个问题。 问题原因 首先我们需要明确这个错误的原因,常见的错误原因有以下几种: 将变量名写错了。 Vue组件的作用域问题。 Vue组件内部的变量和外部的变量命名冲突问题。 快速解决 如果您遇到属性报undefined错误…

    Vue 2023年5月27日
    00
  • vue源码学习之Object.defineProperty对象属性监听

    下面我来详细讲解“vue源码学习之Object.defineProperty对象属性监听”的完整攻略。 标题 vue源码学习之Object.defineProperty对象属性监听 简介 在开发Vue.js过程中,我们经常会用到Object.defineProperty方法来实现数据响应式,也就是监听对象属性的变化。Vue.js源码中就使用了该方法来实现数据…

    Vue 2023年5月28日
    00
  • vue后端传文件流转化成blob对象,前端点击下载返回undefined问题

    首先,问题的原因是因为没有正确获取服务端传回的文件流,导致在前端的blob对象中无法处理正确的文件数据。此时,我们需要采用axios响应拦截器的方式进行解决。 步骤如下: 步骤一:后端返回流数据 在后端返回的接口中,返回的数据应为二进制流,如下示例: @GetMapping("/download") public ResponseEnti…

    Vue 2023年5月28日
    00
  • vitejs预构建理解及流程解析

    ViteJS 预构建理解及流程解析 简介 ViteJS 是一款基于 ES modules 构建的前端开发工具,它具有快速的开发速度和优秀的开发体验。其中,预构建是 ViteJS 的重点特性之一。 预构建,即根据源代码提前展开模块之间的依赖关系,以在后续的开发过程中减少许多不必要的耗时和额外请求。具体而言,预构建会将每个模块和它所依赖的模块转化为一个 Java…

    Vue 2023年5月27日
    00
  • 想到头秃也想不到的Vue3复用组件还可以这么hack的用法

    当我们在开发Vue应用时,需要多次使用同样的组件,此时我们可以使用组件复用来简化代码并提高开发效率。Vue3提供了更为灵活的组件复用方式,下面就是Vue3复用组件的hack用法攻略。 局部注册组件 我们可以在Vue模板中使用局部注册组件的方式来重复使用同一个组件,这种方式只有在当前组件内部可用。 <template> <div> &l…

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