详解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拖拽排序组件Vue-Slicksort解读

    下面是详细讲解“Vue拖拽排序组件Vue-Slicksort解读”的完整攻略。 概述 Vue-Slicksort 是一个可拖拽排序组件,其支持排序项的拖拽、交换、插入、删除之类的操作,非常适用于管理后台等需要排序功能的场景。 Vue-Slicksort 的主要特点是高度可定制和易于配置。它封装了一个 Drag and Drop 库,可以直接应用在 Vue.j…

    Vue 2023年5月29日
    00
  • vue+video.js实现视频播放列表

    下面是关于“vue+video.js实现视频播放列表”的完整攻略。 1. 准备工作 安装 video.js 首先,我们需要安装 video.js。可以使用 npm 命令进行安装: npm install video.js –save 引入 video.js 在 Vue 项目的入口文件(比如 main.js)中,需要引入 video.js 和 video-j…

    Vue 2023年5月28日
    00
  • vue如何修改data中数据问题

    要修改Vue中的数据,可以通过两种方法:使用Vue提供的方法或直接修改data中的数据。以下是详细的攻略: 使用Vue提供的方法修改数据 Vue提供了许多可以修改data中数据的方法,常用的有以下几种: $set $set方法可以动态地向Vue实例添加一个响应式属性,用法如下: this.$set(this.data, ‘newValue’, ‘这是新的值’…

    Vue 2023年5月28日
    00
  • vue实现本地存储添加删除修改功能

    实现本地存储添加删除修改功能,可以通过vue的官方插件vue-localStorage进行实现。 安装vue-localStorage插件 首先需要在项目中安装vue-localStorage插件,可以通过npm进行安装: npm install vue-localstorage –save 在main.js中引入插件 在main.js文件中,引入vue-…

    Vue 2023年5月27日
    00
  • vue 在服务器端直接修改请求的接口地址

    为了实现“vue 在服务器端直接修改请求的接口地址”,我们需要将客户端(浏览器端)和服务器端的配置进行调整。具体的步骤如下: 1. 在客户端(浏览器端)进行配置 首先,在 vue.config.js(如果没有则需要创建) 中配置 devServer 选项: module.exports = { devServer: { proxy: { // 将URL中的 …

    Vue 2023年5月28日
    00
  • Vue中数组与对象修改触发页面更新的机制与原理解析

    让我来为您详细讲解Vue中数组与对象修改触发页面更新的机制与原理解析。 1. Vue中数组的更新机制及原理 在Vue中,要想让视图更新,必须通过数据绑定来实现。Vue中对于数组的变异方法也做了响应式处理,即通过Proxy或Object.defineProperty等技术实现了对数组元素进行监视,并在数组被改变时自动更新视图。 具体来说,当一个响应式数据被渲染…

    Vue 2023年5月27日
    00
  • Vue过滤器使用方法详解

    Vue过滤器使用方法详解 Vue是一款流行的前端框架,它提供了过滤器(Filter)功能,可以用于对模板中显示的数据格式进行处理,从而使模板更加易读易懂。本文将详细介绍Vue过滤器的使用方法。 创建过滤器 Vue的过滤器是通过Vue.filter方法来创建的。该方法的第一个参数是过滤器的名称,第二个参数是一个函数。函数接受一个参数,即需要应用过滤器的值,并将…

    Vue 2023年5月27日
    00
  • 基于vue 添加axios组件,解决post传参数为null的问题

    为了解决”post传参数为null的问题”,我们需要基于vue添加axios组件,并在axios中进行相关配置。具体的攻略步骤如下: 步骤1:安装axios 我们可以使用npm或yarn等工具来安装axios,具体的命令如下: npm install axios –save 或者: yarn add axios 步骤2:创建axios配置文件 在项目的sr…

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