详解Vue的七种传值方式

详解Vue的七种传值方式

在Vue中,数据传递是开发中不可避免的问题,而Vue又提供了多种传值方式,方便我们进行数据的双向绑定和组件之间的交互。本文将详细介绍Vue的七种传值方式,并通过示例代码让你了解它们的使用方法及各自的优缺点。

父组件向子组件传值

1. props

最常见的方式就是通过props向子组件传值。使用该方式,父组件可以将需要传递的数据作为props属性传递给子组件,子组件则可以通过在props选项中定义相关属性来接收数据。

示例:父组件向子组件传递一个字符串

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

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

export default {
  name: "ParentComponent",
  components: {
    ChildComponent
  },
  data() {
    return {
      message: "hello world"
    }
  }
}
</script>

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

<script>
export default {
  name: "ChildComponent",
  props: ["msg"]
}
</script>

2. ref

通过ref属性,父组件可以获取子组件的实例,并直接访问子组件的数据和方法。

示例:父组件通过ref访问子组件中的数据

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

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

export default {
  name: "ParentComponent",
  components: {
    ChildComponent
  },
  mounted() {
    //通过ref获取子组件实例并访问子组件中的数据
    console.log(this.$refs.child.message)
  }
}
</script>

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

<script>
export default {
  name: "ChildComponent",
  data() {
    return {
      message: "hello world"
    }
  }
}
</script>

子组件向父组件传值

3. emit

emit是Vue3.0新引入的特性,在Vue2.0中是通过$emit来实现的。使用emit,子组件可以向父组件发送事件,并传递相应的数据。

示例:子组件通过emit发送数据给父组件

<!-- 父组件 -->
<template>
  <div>
    <child-component @sendData="handleData"></child-component>
  </div>
</template>

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

export default {
  name: "ParentComponent",
  components: {
    ChildComponent
  },
  methods: {
    handleData(msg) {
      console.log(msg)
    }
  }
}
</script>

<!-- 子组件 -->
<template>
  <button @click="sendMsg">发送消息</button>
</template>

<script>
export default {
  name: "ChildComponent",
  methods: {
    sendMsg() {
      this.$emit("sendData", "hello world")
    }
  }
}
</script>

4. $attrs/$listeners

Vue提供了$attrs和$listeners两个特殊的属性,可以将父组件中未被props接收的属性和事件传递给子组件。

示例:子组件通过$attrs接收父组件中的属性

<!-- 父组件 -->
<template>
  <div>
    <child-component name="Tom"></child-component>
  </div>
</template>

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

export default {
  name: "ParentComponent",
  components: {
    ChildComponent
  },
}
</script>

<!-- 子组件 -->
<template>
  <div>{{attrs.name}}</div>
  <button @click="$listeners.click">点击</button>
</template>

<script>
export default {
  name: "ChildComponent",
  inheritAttrs: false,
  mounted() {
    console.log(this.$attrs)
  }
}
</script>

兄弟组件间的传值

5. event bus

event bus可以看作是一种全局通信方式,允许不同组件之间进行通信。使用该方式,我们需要新建一个Vue实例作为事件中心,用来监听和触发事件。

示例:通过event bus实现兄弟组件间的传值

// event-bus.js
import Vue from "vue"
export default new Vue()

// sibling-component-a.vue
<template>
  <button @click="sendData">发送数据给B</button>
</template>

<script>
import eventBus from 'event-bus'

export default {
  name: "SiblingComponentA",
  methods: {
    sendData() {
      eventBus.$emit("sendData", "hello world")
    }
  }
}
</script>

// sibling-component-b.vue
<template>
  <div>{{msg}}</div>
</template>

<script>
import eventBus from 'event-bus'

export default {
  name: "SiblingComponentB",
  data() {
    return {
      msg: ""
    }
  },
  mounted() {
    eventBus.$on("sendData", data => {
      this.msg = data
    })
  }
}
</script>

6. provide/inject

provide/inject是Vue2.2新增的特性,可用于向子孙组件注入依赖。使用该方式,我们可以在父组件中通过provide方法向所有子组件注入需要的依赖,子组件可以在inject选项中定义需要注入的依赖。

示例:使用provide/inject实现兄弟组件间的传值

// parent.vue
<template>
  <sibling-component-a></sibling-component-a>
  <sibling-component-b></sibling-component-b>
</template>

<script>
export default {
  name: "Parent",
  provide() {
    return {
      name: 'Tom',
      age: 18
    }
  }
}
</script>

// sibling-component-a.vue
<template>
  <div>{{name}}</div>
</template>

<script>
export default {
  name: "SiblingComponentA",
  inject: ["name"]
}
</script>

// sibling-component-b.vue
<template>
  <div>{{age}}</div>
</template>

<script>
export default {
  name: "SiblingComponentB",
  inject: ["age"]
}
</script>

7. vuex

vuex是Vue官方提供的状态管理库,可以用于在不同组件间共享和管理状态。使用该方式,我们需要定义一个全局的store,存储应用的状态,组件可以通过dispatch方法触发action,再通过commit方法来修改store中的state。

示例:使用vuex实现兄弟组件间的传值

// store.js
import Vue from "vue"
import Vuex from "vuex"

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    msg: ""
  },
  mutations: {
    setMsg(state, data) {
      state.msg = data
    }
  },
  actions: {
    sendMsg({commit}, data) {
      commit("setMsg", data)
    }
  }
})

// sibling-component-a.vue
<template>
  <button @click="sendMsg">发送数据给B</button>
</template>

<script>
import { mapActions } from "vuex"

export default {
  name: "SiblingComponentA",
  methods: {
    ...mapActions(["sendMsg"]),
    sendData() {
      this.sendMsg("hello world")
    }
  }
}
</script>

// sibling-component-b.vue
<template>
  <div>{{msg}}</div>
</template>

<script>
import { mapState } from "vuex"

export default {
  name: "SiblingComponentB",
  computed: {
    ...mapState(["msg"])
  }
}
</script>

以上就是Vue的七种传值方式的详细介绍,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Vue的七种传值方式 - Python技术站

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

相关文章

  • vue时间组件DatePicker组件的手写示例

    下面是关于“vue时间组件DatePicker组件的手写示例”的完整攻略。 1. 了解DatePicker组件 DatePicker组件是一个常用的时间选择组件。通过DatePicker组件,用户可以自定义时间选择的方式,包括选择年月日、时分秒等。 2. 建立DatePicker组件的基础HTML结构 在进行组件的编写之前,我们需要先建立一个基础HTML结构…

    Vue 2023年5月28日
    00
  • Vue3中的 computed,watch,watchEffect的使用方法

    下面就为大家详细讲解一下“Vue3中的 computed,watch,watchEffect的使用方法”的完整攻略。 computed的使用方法 computed是Vue3中的计算属性,其内部的值是另一个属性的计算结果。在Vue3中,我们可以通过computed()来创建计算属性。 在Vue3中,计算属性默认以getter函数的形式存在,表示计算属性所依赖的…

    Vue 2023年5月28日
    00
  • vue 使用vue-i18n做全局中英文切换的方法

    下面我就来详细讲解“vue 使用vue-i18n做全局中英文切换的方法”的完整攻略。 1. 准备工作 首先,需要在Vue项目中安装vue-i18n模块,可以通过npm命令行工具来安装。在终端中输入以下命令: npm install vue-i18n –save 安装成功后,将在项目的node_modules文件夹中看到vue-i18n的相关文件。 2. 配…

    Vue 2023年5月29日
    00
  • Vue自定义图片懒加载指令v-lazyload详解

    当我们访问一个页面时,图片数量很多,如果立即全部加载会占用很多带宽和资源,降低用户体验,所以利用图片懒加载技术可以解决这个问题。Vue自定义指令v-lazyload实现图片的懒加载效果。 1. v-lazyload指令的原理 该指令的原理是在图片的可见区域内,进行异步加载图片,只有当图片出现在可见区域内时才加载,利用了IntersectionObserver…

    Vue 2023年5月28日
    00
  • vue-ajax小封装实例

    下面我将为您详细讲解”vue-ajax小封装实例”的完整攻略。 介绍 在Vue.js中,我们经常需要通过ajax向服务端请求数据或提交数据,而Vue.js并没有提供自带的ajax函数。因此,我们需要自己针对Vue.js进行封装ajax函数,以便能够在Vue.js中更好地使用ajax请求。 axios与vue-resource选择 目前,市面上流行的封装Aja…

    Vue 2023年5月28日
    00
  • 解决axios:”timeout of 5000ms exceeded”超时的问题

    下面是解决axios请求超时问题的完整攻略: 问题描述 在使用axios发送请求时,可能会遇到如下提示:Error: timeout of {time}ms exceeded,这个提示表示请求超时了,请求时间超过了设定的时间限制。这个问题的产生可以是路由问题,也可以是服务器响应时间过长,也有可能是代理服务器的问题。 解决方案 方案一:增加超时时间的限制 在a…

    Vue 2023年5月28日
    00
  • 简单了解vue.js数组的常用操作

    下面是“简单了解vue.js数组的常用操作”的完整攻略: 常用数组操作 数组是Vue.js中很重要的数据类型,Vue.js提供了很多常用的数组操作方法: push push方法可以向数组的末尾添加一个或多个元素。它的语法如下: arr.push(element1, …, elementN) 其中,arr是要操作的数组,element1到elementN是…

    Vue 2023年5月27日
    00
  • vue组件间通信六种方式(总结篇)

    那么我来介绍一下“Vue组件间通信六种方式(总结篇)”的具体内容和完整攻略。 一、背景 在Vue的组件化开发中,组件之间的通信是很常见的需求。Vue提供了很多种方式来实现组件间的通信,但每种方式都有其自身的优缺点,需要根据具体场景来选择最合适的方案。 二、六种通信方式 下面是六种组件通信方式,具体实现可以查阅对应的示例代码。 1. props + emit …

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