详解Vue的七种传值方式

yizhihongxing

详解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.directive 自定义指令的问题小结

    下面是关于Vue自定义指令的问题小结的详细攻略: 什么是Vue自定义指令? 在Vue中,指令是一种带有 v- 前缀的特殊属性。指令提供了一些带有响应式行为的语法糖。Vue中已经提供了很多内置指令,如v-if、v-for、v-show等。 Vue允许我们自定义指令,方便我们在实现一些特殊功能时使用。我们可以使用Vue.directive方法来自定义指令,该方法…

    Vue 2023年5月28日
    00
  • vue实现把接口单独存放在一个文件方式

    在Vue项目中,我们可以将接口单独存放在一个文件中,以便于统一管理和维护,提高开发效率。以下是详细攻略: 1. 创建接口配置文件 在项目中创建一个api目录,用于存放所有接口配置文件。在api目录下新建一个文件,如 index.js。示例代码: import axios from ‘axios’ const service = axios.create({ …

    Vue 2023年5月28日
    00
  • 如何利用vue3实现一个俄罗斯方块

    让我们来详细讲解如何利用Vue3实现一个俄罗斯方块。 准备工作 在开始实现之前,你需要安装好最新版本的Node.js和Vue CLI。你可以在终端中使用以下命令进行安装: # 安装Node.js brew install node # 安装Vue CLI npm install -g @vue/cli 创建工程 使用Vue CLI创建一个新的Vue工程: v…

    Vue 2023年5月29日
    00
  • vue-cli V3.0版本的使用详解

    vue-cli V3.0版本的使用详解 1. 什么是Vue CLI Vue CLI是一个官方开发的用于快速搭建Vue.js项目的脚手架工具。 Vue CLI V3.0版本是在Vue CLI V2版本的基础上进行升级,提供了以下新特性: 更快的构建速度 灵活的插件机制 更友好的用户体验 更好的自定义配置 2. Vue CLI的安装 在终端中运行以下命令,全局安…

    Vue 2023年5月28日
    00
  • 在vue项目中,将juery设置为全局变量的方法

    在Vue项目中,使用jQuery需要将其设置为全局变量,下面是完整的攻略: 安装jQuery 首先,需要在项目中安装jQuery,可以使用npm或yarn进行安装。这里以npm为例: npm install jquery –save-dev 引入jQuery并设置为全局变量 在Vue项目的入口文件中(一般是main.js),需要引入jQuery并将其设置为…

    Vue 2023年5月28日
    00
  • Vue入门之数量加减运算操作示例

    那我就来详细地讲一下“Vue入门之数量加减运算操作示例”的完整攻略。 一、前置知识 在学习Vue的运算操作之前,需要先掌握一些基本的前置知识: HTML 和 CSS的基础语法:Vue是一种基于HTML和CSS的框架,因此需要熟练掌握HTML和CSS的基本语法。 JavaScript 基础:Vue是通过JavaScript实现的,所以需要熟练掌握JavaScr…

    Vue 2023年5月27日
    00
  • vue实现定时刷新数据,每隔5分钟执行一次

    这里是实现vue定时刷新数据的完整攻略: 步骤1:引入vue定时器插件 VueJS提供了vue-interval-plugin插件,可以轻松实现vue定时器功能。使用此插件,我们可以在Vue组件中轻松地开启一个计时器,定时执行某些方法(如定时刷新数据)。 首先,用npm或yarn安装此插件: npm install vue-interval-plugin 或…

    Vue 2023年5月29日
    00
  • 解决idea中debug工具栏消失后如何显示的问题

    当我们使用IntelliJ IDEA进行调试时,有时会遇到调试工具栏消失的问题,这样我们就无法查看和控制调试过程中的变量值、控制程序运行等操作。在这里,我将介绍一些方法来解决debug工具栏消失的问题。 方法一:检查工具栏是否被隐藏 有时候,我们可能会意外地将debug工具栏隐藏起来了,所以第一步是确认一下工具栏是否被隐藏。你可以使用以下步骤来检查: 点击”…

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