vue组件传值(高级)、属性传值、反向传值、跨级传值实例详解

Vue组件传值(高级)、属性传值、反向传值、跨级传值实例详解

在Vue中,组件传值是必不可少的一部分。组件间的传值分为父子组件传值、同级组件传值以及跨级传值等等,下面将详细介绍Vue组件传值的不同方式和实例。

属性传值

属性传值是父组件向子组件传递数据的一种方式,通过在父组件中使用子组件时设置props属性并传入数据,子组件在接收到数据后可以通过this.props或者$attrs来获取数据。下面是一个简单的例子:

<template>
  <div>
    <Child :name="name"></Child>
  </div>
</template>

<script>
import Child from "./Child.vue";

export default {
  components: {
    Child
  },
  data () {
    return {
      name: "Alice"
    }
  }
}
</script>

在父组件中使用子组件时,使用了:name="name"来将父组件中的name数据传递给子组件,在子组件中通过props接收数据:

<template>
  <div>{{name}}</div>
</template>

<script>
export default {
  props: {
    name: String
  }
}
</script>

反向传值

反向传值是指从子组件向父组件传值。可以使用Vue的自定义事件来实现反向传值,原理是在子组件中通过$emit触发事件并将数据传递给父组件,在父组件中监听子组件的事件即可获取数据。下面是一个简单的例子:

<!-- 子组件 -->
<template>
  <div>
    <button @click="sendData()">点击</button>
  </div>
</template>

<script>
export default {
  methods: {
    sendData() {
      this.$emit('sendDataToParent', {name: 'Alice'});
    }
  }
}
</script>

在子组件中,this.$emit触发了一个名为sendDataToParent的事件,并同时传递了一个{name: 'Alice'}的对象作为数据,该事件会被派发到父组件。在父组件中监听该事件并接收子组件传递的数据:

<!-- 父组件 -->
<template>
  <div>
    <Child @sendDataToParent="getData"></Child>
    <div>{{data.name}}</div>
  </div>
</template>

<script>
import Child from "./Child.vue";

export default {
  components: {
    Child
  },
  data () {
    return {
      data: {}
    }
  },
  methods: {
    getData(data) {
      this.data = data;
    }
  }
}
</script>

在父组件中通过在子组件上绑定自定义事件(sendDataToParent),并设置事件回调函数getData来监听子组件的事件并获取数据。 getData方法中的data参数即为子组件通过$emit派发的事件对象中的数据。

跨级传值

有时,我们需要在不同层级的组件之间传递数据,这时可以通过在父组件中使用provide来提供数据,然后在所需的子组件中使用inject来注入数据。下面是一个简单的例子:

<!-- 父组件 -->
<template>
  <div>
    <Child :name="name"></Child>
  </div>
</template>

<script>
import Child from "./Child.vue";

export default {
  provide: {
    name: 'Alice'
  },
  components: {
    Child
  }
}
</script>

在父组件中,通过provide向子组件提供了名为name的数据,子组件在需要获取数据时通过inject来注入数据:

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

<script>
export default {
  inject: ['name']
}
</script>

在子组件中,使用了inject来注入父组件提供的name数据。

示例说明

示例1:从子组件向父组件反向传值

在这个示例中,我们将创建一个子组件,通过点击按钮向父组件传递一个数字,并在父组件中显示该数字。下面是完整的代码:

<!-- 子组件 -->
<template>
  <div>
    <button @click="increase()">增加</button>
  </div>
</template>

<script>
export default {
  data () {
    return {
      count: 1
    }
  },
  methods: {
    increase() {
      this.count++;
      this.$emit('update:count', this.count);
    }
  }
}
</script>

在子组件中,我们通过在按钮上绑定事件并在该事件中递增count数据,并通过$emit触发一个名为update:count的事件,并将count数据作为参数传递给父组件。注意这里使用了:update:count的语法糖来替代$emit('update:count',...)的写法,这也是Vue推荐使用的语法。

<!-- 父组件 -->
<template>
  <div>
    <Child :count="count" @update:count="updateCount"></Child>
    <div>当前数字为:{{count}}</div>
  </div>
</template>

<script>
import Child from "./Child.vue";

export default {
  components: {
    Child
  },
  data () {
    return {
      count: 0
    }
  },
  methods: {
    updateCount(count) {
      this.count = count;
    }
  }
}
</script>

在父组件中,我们在使用子组件时通过:count="count"的语法糖将父组件中的count数据传递给子组件,并监听了一个名为update:count的事件,事件回调函数updateCount方法被触发时将子组件传来的count数据赋值给父组件中的count。

示例2:使用provide/inject跨级传值

在这个示例中,我们将创建两个组件,分别为父组件和子组件,通过在父组件中提供一个数字并在子组件中注入该数字,最后在子组件中显示该数字。下面是完整的代码:

<!-- 父组件 -->
<template>
  <div>
    <Child></Child>
  </div>
</template>

<script>
import Child from "./Child.vue";

export default {
  provide: {
    count: 2
  },
  components: {
    Child
  }
}
</script>

在父组件中,我们通过provide提供一个名为count的数字2,供子组件使用。

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

<script>
export default {
  inject: ['count']
}
</script>

在子组件中,我们使用inject来注入名为count的数据,并在模板中显示该数据。

结论

Vue组件传值是Vue开发中的一项核心技能,熟练掌握组件传值的不同方式及其原理对于提高开发效率和设计优化都非常有帮助。以上提供了一些常见的组件传值方式及示例,希望能够对Vue开发者有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue组件传值(高级)、属性传值、反向传值、跨级传值实例详解 - Python技术站

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

相关文章

  • vue源码解析computed多次访问会有死循环原理

    下面是关于“vue源码解析computed多次访问会有死循环原理”的完整攻略。 1. computed的原理 先来简单介绍一下computed的原理。在Vue组件中,computed是指计算属性,是一个基于响应式依赖进行缓存的数据属性,它的值在使用时会自动收集依赖,发现依赖变化时会重新计算,并且将结果缓存起来,直到依赖变化才重新计算。这样就避免了重复计算,提…

    Vue 2023年5月28日
    00
  • 解决Babylon.js中AudioContext was not allowed to start异常问题

    在Babylon.js中播放音频时,有时会出现 “AudioContext was not allowed to start” 异常。这是由于浏览器启用了自动播放策略,导致无法正常启动AudioContext造成的。解决方法是在用户的交互行为中启动AudioContext。下面是解决这个问题的完整攻略: 1. 检查浏览器设置 首先,我们需要检查浏览器的设置,…

    Vue 2023年5月28日
    00
  • 详解Vue生命周期和MVVM框架

    让我详细讲解”详解Vue生命周期和MVVM框架”的完整攻略。 首先,让我们来了解一下Vue生命周期。Vue组件有8个生命周期钩子函数,可以在Vue组件的生命周期中执行一些操作。 组件实例的生命周期可以分为四个阶段:创建、挂载、更新、销毁。下面是Vue生命周期的详细解释: 创建 beforeCreate:在实例初始化之后,数据观测(data observer)…

    Vue 2023年5月28日
    00
  • Vue使用ajax(axios)请求后台数据的方法教程

    以下是关于“Vue使用ajax(axios)请求后台数据的方法教程”的完整攻略,包含两个示例说明。 写在前面 本教程将会讲解如何使用 Vue 和 axios 进行数据的异步请求和处理。axios 是一个基于 Promise 的 HTTP 库,可以用在浏览器和 node.js 中。另外,本教程假定你已经掌握 Vue 基础知识。如果还不熟悉,请先学习 Vue 基…

    Vue 2023年5月28日
    00
  • vuex存储数组(新建,增,删,更新)并存入localstorage定时删除功能实现

    下面我将详细讲解如何使用vuex存储数组并实现新建、增加、删除和更新功能,并将其保存到localStorage中并实现定时删除功能。 步骤一:安装vuex 首先我们需要安装vuex,可以使用以下命令: npm install vuex –save 步骤二:创建store 在src目录下创建一个store文件夹,在其下新建一个index.js文件作为vuex…

    Vue 2023年5月28日
    00
  • Vue使用正则校验文本框为正整数

    关于Vue使用正则校验文本框为正整数的攻略,可以按照以下步骤进行: 1. 设置校验规则 首先,在Vue中可以通过正则表达式对文本框进行校验。我们可以设置一个正则表达式,来限制输入的内容只能是正整数: // 定义校验规则,只允许输入正整数 const validatePositiveInteger = (rule, value, callback) =>…

    Vue 2023年5月27日
    00
  • vue2.x+webpack快速搭建前端项目框架详解

    Vue2.x+Webpack快速搭建前端项目框架攻略 本文介绍如何使用Vue2.x和Webpack快速搭建前端项目框架。这里提供一个完整的步骤来创建一个简单的Vue应用程序,以及一些示例来解释这些步骤。 步骤1:创建项目 首先,我们需要创建一个新项目。可以使用vue-cli来创建新项目,它将为我们处理所有必要的设置。 vue create my-projec…

    Vue 2023年5月27日
    00
  • vue项目打包后,由于html被缓存导致出现白屏的处理方案

    当 Vue 项目部署到线上服务器时,我们可能会遇到“白屏”问题,此现象通常是由于浏览器缓存的 HTML 文件。为了解决这种问题,我们可以尝试以下几种处理方案: 1. 在 index.html 中设置 meta 标签 在 index.html 文件的 head 标签里添加如下代码,告诉浏览器不要缓存: <meta http-equiv="Pra…

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