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

yizhihongxing

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日

相关文章

  • vue2基本响应式实现方式之让数组也变成响应式

    让数组也变成响应式是Vue框架中非常重要的一块内容。下面我将详细讲解Vue2的基本响应式实现方式来实现这个功能。 Vue2基本响应式实现方式 Vue2使用了ES5 Object.defineProperty() 方法来实现数据的响应式。它会递归遍历对象所有的属性,并使用 Object.defineProperty() 方法把它们转换为 getter/sett…

    Vue 2023年5月29日
    00
  • webpack + vue 打包生成公共配置文件(域名) 方便动态修改

    要实现“webpack + vue 打包生成公共配置文件(域名) 方便动态修改”,可以参照以下步骤: 创建配置文件在项目根目录下创建一个config.js文件,用于存放公共配置信息,例如域名、API地址等。在文件中定义一个对象,包含需要的配置信息。示例代码如下: “`javascript// config.js module.exports = { dom…

    Vue 2023年5月28日
    00
  • 在vscode中统一vue编码风格的方法

    在VSCode中统一Vue编码风格是一个很好的实践,可以方便多人协作开发以及代码更加整洁和易于维护。以下是完整的攻略: 步骤一:安装Vue CLI Vue CLI是一个官方命令行工具,可以帮助我们快速搭建Vue项目,并集成了ESLint等工具,可以帮助我们统一代码风格。Vue CLI的安装方法可以参考Vue官方文档。 步骤二:初始化项目 安装好Vue CLI…

    Vue 2023年5月27日
    00
  • vue和webpack安装命令详解

    下面详细介绍一下如何安装 vue 和 webpack,以及相应的命令详解。 Vue.js 的安装 全局安装 可以使用以下命令全局安装 Vue CLI: npm install -g @vue/cli 如果你是 Mac 系统,并且使用了 Homebrew,则可以使用以下命令: brew install node 然后再使用全局安装命令: npm install…

    Vue 2023年5月29日
    00
  • vscode下的vue文件格式化问题

    下面是“vscode下的vue文件格式化问题”的完整攻略。 背景 在使用Vue.js进行前端项目开发时,在vscode中打开一个.vue文件后,格式化代码时会遇到一些问题。默认情况下,vscode只会格式化.html和.js部分的代码,而.vue文件中嵌套了.html、.css以及.js代码,所以需要进行一些配置才能完整格式化.vue文件。 解决方案 安装插…

    Vue 2023年5月28日
    00
  • Vue.js数据绑定之data属性

    下面是关于Vue.js数据绑定之data属性的完整攻略。 Vue.js数据绑定之data属性 在Vue.js中,我们可以通过data属性实现数据的双向绑定,在数据发生变化的时候,视图会自动更新。本文主要讲解Vue.js数据绑定之data属性相关的知识点,包括:声明data属性、双向绑定的注意事项、如何在Vue组件中使用data属性等。 声明data属性 我们…

    Vue 2023年5月28日
    00
  • vue中使用@blur获取input val值

    在Vue中,我们可以使用v-on指令来绑定事件。在input元素输入完成之后,我们可以使用@blur事件来获取其value值。 示例1:获取input元素值并输出到控制台 先来看一个简单的示例。我们在input元素上定义@blur事件,并在方法中通过$event.target.value获取其值,最后将其输出到控制台。 <template> &l…

    Vue 2023年5月28日
    00
  • 使用vue实现HTML页面生成图片的方法

    使用vue实现HTML页面生成图片的方法可以通过js的html2canvas库和canvas2image插件来实现。 一、安装所需依赖 可以通过npm安装html2canvas和canvas2image: npm install html2canvas canvas2image –save 二、页面内引入依赖的JS库 在所需页面入口文件里面引入,并使其成为…

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