vue组件传值的11种方式总结

下面是对于“vue组件传值的11种方式总结”的详细讲解攻略:

1. props

  • 父组件通过props向子组件传递数据。
  • 子组件通过props接收传递过来的数据。

示例代码如下:

父组件:

<template>
  <ChildComponent :message="parentMessage"></ChildComponent>
</template>
<script>
import ChildComponent from './ChildComponent.vue'
export default {
  data() {
    return {
      parentMessage: 'Hello world'
    }
  },
  components: {
    ChildComponent
  }
}
</script>

子组件:

<template>
  <div>{{ message }}</div>
</template>
<script>
export default {
  props: {
    message: String
  }
}
</script>

2. provide/inject

  • 父组件通过provide向子孙组件传递数据。
  • 子孙组件通过inject获取传递过来的数据。

示例代码如下:

祖先组件:

<template>
  <ParentComponent></ParentComponent>
</template>
<script>
import ParentComponent from './ParentComponent.vue'
export default {
  provide: {
    message: 'Hello world'
  },
  components: {
    ParentComponent
  }
}
</script>

父组件:

<template>
  <ChildComponent></ChildComponent>
</template>
<script>
import ChildComponent from './ChildComponent.vue'
export default {
  components: {
    ChildComponent
  }
}
</script>

子组件:

<template>
  <div>{{ message }}</div>
</template>
<script>
export default {
  inject: ['message']
}
</script>

3. $emit

  • 子组件通过$emit向父组件传递数据。
  • 父组件通过v-on监听子组件的事件,并接收传递过来的数据。

示例代码如下:

父组件:

<template>
  <ChildComponent @send-message="receiveMessage"></ChildComponent>
</template>
<script>
import ChildComponent from './ChildComponent.vue'
export default {
  methods: {
    receiveMessage(message) {
      console.log(message)
    }
  },
  components: {
    ChildComponent
  }
}
</script>

子组件:

<template>
  <button @click="sendMessage">Send Message</button>
</template>
<script>
export default {
  methods: {
    sendMessage() {
      this.$emit('send-message', 'Hello world')
    }
  }
}
</script>

4. v-model

  • 父组件通过v-model向子组件传递数据,并监听子组件的输入事件。
  • 子组件通过$emit向父组件传递数据。

示例代码如下:

父组件:

<template>
  <ChildComponent v-model="message"></ChildComponent>
</template>
<script>
import ChildComponent from './ChildComponent.vue'
export default {
  data() {
    return {
      message: 'Hello world'
    }
  },
  components: {
    ChildComponent
  }
}
</script>

子组件:

<template>
  <input :value="value" @input="$emit('input', $event.target.value)">
</template>
<script>
export default {
  props: ['value']
}
</script>

5. $parent

  • 子组件通过$parent访问父组件。
  • 子组件通过$parent访问父组件的数据和方法。

示例代码如下:

父组件:

<template>
  <ChildComponent></ChildComponent>
</template>
<script>
import ChildComponent from './ChildComponent.vue'
export default {
  data() {
    return {
      message: 'Hello world'
    }
  },
  methods: {
    showMessage() {
      console.log(this.message)
    }
  },
  components: {
    ChildComponent
  }
}
</script>

子组件:

<template>
  <button @click="$parent.showMessage">Show Message</button>
</template>

6. $children

  • 父组件通过$children访问子组件。
  • 父组件通过$children访问子组件的数据和方法。

示例代码如下:

父组件:

<template>
  <div>
    <button @click="showMessage">Show Message</button>
    <ChildComponent ref="childComponent"></ChildComponent>
  </div>
</template>
<script>
import ChildComponent from './ChildComponent.vue'
export default {
  methods: {
    showMessage() {
      console.log(this.$refs.childComponent.message)
    }
  },
  components: {
    ChildComponent
  }
}
</script>

子组件:

<template>
  <div>{{ message }}</div>
</template>
<script>
export default {
  data() {
    return {
      message: 'Hello world'
    }
  }
}
</script>

7. EventBus

  • 父组件和子组件通过EventBus进行数据通信。

示例代码如下:

<!-- EventBus.js -->
import Vue from 'vue'
export default new Vue()

<!-- ParentComponent.vue -->
<template>
  <div>
    <button @click="sendMessage">Send Message</button>
  </div>
</template>
<script>
import EventBus from './EventBus.js'
export default {
  methods: {
    sendMessage() {
      EventBus.$emit('send-message', 'Hello world')
    }
  }
}
</script>

<!-- ChildComponent.vue -->
<template>
  <div>{{ message }}</div>
</template>
<script>
import EventBus from './EventBus.js'
export default {
  data() {
    return {
      message: ''
    }
  },
  mounted() {
    EventBus.$on('send-message', message => {
      this.message = message
    })
  }
}
</script>

8. Vuex

  • 父组件和子组件通过Vuex进行数据通信。

示例代码如下:

<!-- store.js -->
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    message: ''
  },
  mutations: {
    setMessage(state, message) {
      state.message = message
    }
  },
  actions: {
    setMessage({ commit }, message) {
      commit('setMessage', message)
    }
  }
})

<!-- ParentComponent.vue -->
<template>
  <div>
    <button @click="sendMessage">Send Message</button>
  </div>
</template>
<script>
import { mapActions } from 'vuex'
export default {
  methods: {
    ...mapActions(['setMessage']),
    sendMessage() {
      this.setMessage('Hello world')
    }
  }
}
</script>

<!-- ChildComponent.vue -->
<template>
  <div>{{ message }}</div>
</template>
<script>
import { mapState } from 'vuex'
export default {
  computed: {
    ...mapState(['message'])
  }
}
</script>

9. $attrs/$listeners

  • 子组件通过$attrs/$listeners访问父组件的属性和方法。

示例代码如下:

父组件:

<template>
  <ChildComponent message="Hello world" @click="showMessage"></ChildComponent>
</template>
<script>
import ChildComponent from './ChildComponent.vue'
export default {
  methods: {
    showMessage() {
      console.log('clicked')
    }
  },
  components: {
    ChildComponent
  }
}
</script>

子组件:

<template>
  <div>{{ $attrs.message }}</div>
  <button @click="$listeners.click">Click Me</button>
</template>

10. provide/inject + $attrs/$listeners

  • 使用provide/inject和$attrs/$listeners结合可以实现祖先组件向后代组件传递数据,并访问后代组件的属性和方法。

示例代码如下:

祖先组件:

<template>
  <ParentComponent></ParentComponent>
</template>
<script>
import ParentComponent from './ParentComponent.vue'
export default {
  provide() {
    return {
      showMessage: this.showMessage
    }
  },
  methods: {
    showMessage() {
      console.log('clicked')
    }
  },
  components: {
    ParentComponent
  }
}
</script>

父组件:

<template>
  <ChildComponent></ChildComponent>
</template>
<script>
import ChildComponent from './ChildComponent.vue'
export default {
  components: {
    ChildComponent
  }
}
</script>

子组件:

<template>
  <div>{{ $attrs.message }}</div>
  <button @click="$attrs.showMessage">Click Me</button>
</template>

11. render函数

  • 使用render函数可以动态生成组件并传递数据。

示例代码如下:

<template>
  <div id="app"></div>
</template>
<script>
import Vue from 'vue'
new Vue({
  el: '#app',
  render(h) {
    return h('ChildComponent', {
      props: {
        message: 'Hello world'
      },
      on: {
        click: () => {
          console.log('clicked')
        }
      }
    })
  },
  components: {
    ChildComponent: {
      props: ['message'],
      render(h) {
        return h('div', this.message)
      }
    }
  }
})
</script>

以上就是关于“vue组件传值的11种方式总结”的详细攻略了,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue组件传值的11种方式总结 - Python技术站

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

相关文章

  • vue+elementUl导入文件方式(判断文件格式)

    下面是详细讲解“vue+elementUl导入文件方式(判断文件格式)”的完整攻略。 1. 需要用到的技术栈 本文使用的技术栈为:Vue + ElementUI。 2. 文件导入方式 Vue + ElementUI 实现文件的导入方式主要分为以下几个步骤: 2.1 导入 ElementUI Upload 组件 ElementUI 提供了 Upload 组件,…

    Vue 2023年5月28日
    00
  • Vue2 Element Schema Form 配置式生成表单的实现

    下面是“Vue2 Element Schema Form 配置式生成表单的实现”完整攻略: 1. Vue2 Element Schema Form 简介 Vue2 Element Schema Form 是基于 Vue.js 2.x、Element UI 和 JSON Schema 构建的,通过配置式的方式生成表单的开源组件。它可以允许用户在不编写一行表单组…

    Vue 2023年5月27日
    00
  • Vue ​v-model相关知识总结

    关于 Vue v-model 相关知识的总结,我可以分为以下几个部分进行讲解: 1. v-model 的作用 v-model 是 Vue 用于实现表单元素双向绑定的一个指令,主要作用是在输入和输出表单值时自动同步,省去了我们手动监听 input 事件和调用赋值方法去同步的繁琐过程。 2. 使用 v-model 的要求 在使用 v-model 时,需要满足以下…

    Vue 2023年5月27日
    00
  • vue实现点击按钮“查看详情”弹窗展示详情列表操作

    要实现“vue实现点击按钮‘查看详情’弹窗展示详情列表操作”的效果,可以按照以下步骤进行: 步骤一:在组件中定义数据和方法 首先,在组件中定义需要展示的数据和方法。假设我们要展示一个商品列表,每个商品有名称、价格等属性,同时有一个“查看详情”按钮,点击按钮可以展示该商品的详细信息。我们可以在组件中定义数据和方法如下: <template> &lt…

    Vue 2023年5月29日
    00
  • 手把手带你安装vue-cli并创建第一个vue-cli应用程序

    下面我将为您详细讲解如何安装vue-cli并创建第一个vue-cli应用程序的完整攻略。 1. 安装Node.js和npm 首先,您需要在您的电脑上安装Node.js和npm。如果您已经安装了,请跳过这一步。 您可以在Node.js的官方网站下载适合您操作系统的安装包,并按照提示进行安装。 2. 安装Vue CLI Vue CLI是一个基于Vue.js的快速…

    Vue 2023年5月27日
    00
  • 详细对比Ember.js和Vue.js

    详细对比Ember.js和Vue.js 在讨论Ember.js和Vue.js之前,我们需要了解什么是前端框架。前端框架是一种帮助我们快速构建Web应用程序的工具,使用前端框架可以节省我们的开发时间和精力。Ember.js和Vue.js都是非常优秀的前端框架,下面我们将逐一对比这两种框架,让大家更好地了解它们的优缺点。 Ember.js Ember.js是一种…

    Vue 2023年5月28日
    00
  • vue修改数据页面无效的解决方案

    当我们在使用Vue进行开发时,经常遇到这样的场景:当我们修改了数据,但是页面上并没有反应。这是由于Vue中的数据响应式机制造成的,需要手动触发重新渲染。那么,针对这种情况,我们该如何解决呢?下面介绍几种常见的解决方案。 1. 使用this.$forceUpdate()方法 this.$forceUpdate()方法可以强制Vue实例强制重新渲染,并重新应用到…

    Vue 2023年5月29日
    00
  • 详解ESLint在Vue中的使用小结

    以下是 “详解ESLint在Vue中的使用小结” 的完整攻略: 什么是 ESLint ESLint 是一个 JavaScript 代码检查工具,它用于静态分析代码中的问题,并提供一些规则来报告潜在的问题。通过检查代码中的语法错误和设计问题,可以提高代码的可读性和稳定性。 在 Vue 中使用 ESLint Vue 项目中使用 ESLint 可以有效地提高代码的…

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