Vue组件中值的传递

女爷i 2022-04-18 02:54 370阅读 0赞

Vue组件中值是如何传递的?

三、v-for的情况下,父组件向子组件传值

两种情况如下:

  1. 父组件传一个items数组——对象的集合,一次将所有的值传过去,此时for循环在子组件中进行

父组件:

20181130175223887.png

子组件:

20181130175112194.png

2.父组件传item对象——单个对象,一次只传一个对象,此时for循环在父组件中进行

父组件:

2018113017461113.png

子组件:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3p5ejAwMDAwMDAw_size_16_color_FFFFFF_t_70

一、父子组件传值

1. 在Vue的官方文档中通过prop向子组件传递数据有讲解

下面图片是我对Vue组件传值的理解

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3p5ejAwMDAwMDAw_size_16_color_FFFFFF_t_70 1

(1)Vue实例中的数据data——>posts数组存储数据,可以通过组件标签中的v-for循环得到posts数组的每个对象,然后通过v-bind将对象数据绑定在组件标签自定义的属性名上(title、content)

(2)组件标签从Vue实例中获取的数据,可以传给组件实例的props数组中,并且用相同的属性名去接收数据

(3)组件模板中的标签可以使用props中的属性

2. 当要传的值很多的时候,props中接收的就不仅仅是“title”、“content”,还可能有name、age、等等自定义的属性,那样岂不是更麻烦?所以将整个数组或对象传递给组件

  1. <div id="component-demo">
  2. <my-component v-for="post in posts" v-bind:post="post"></my-component>
  3. </div>
  4. <script src="./vue.js"></script>
  5. <script>
  6. Vue.component('my-component',{
  7. props: ['post'],
  8. template: `
  9. <div>
  10. <h3 class=".title">{
  11. {post.name}}</h3>
  12. <div class=".content">{
  13. {post.age}}</div>
  14. </div>
  15. `,
  16. })
  17. new Vue({
  18. el: "#component-demo",
  19. data:{
  20. posts: [
  21. {name:'zhu',age:22}
  22. ]
  23. },
  24. })
  25. </script>

注意:传递的步骤是不变的,只是处理的属性名有所改变。

3. 向组件标签传递信息或者指令,从而使组件触发一些事件

  1. <div id="component-demo">
  2. <my-component v-for="post in posts" v-bind:post="post" :count="count" v-on:add-count="count++"></my-component>
  3. </div>
  4. <script>
  5. Vue.component('my-component',{
  6. props: ['post','count'],
  7. template: `
  8. <div>
  9. <h3 class=".title">{
  10. {post.name}}</h3>
  11. <div class=".content">{
  12. {post.age}}</div>
  13. <button v-on:click="$emit('add-count')">you click {
  14. {count}} times</button>
  15. </div>
  16. `,
  17. })
  18. new Vue({
  19. el: "#component-demo",
  20. data:{
  21. count: 0,
  22. posts: [
  23. {name:'zhu',age:22}
  24. ]
  25. },
  26. })
  27. </script>

组件结构中的button标签可以通过$emit将点击事件和自定义事件“add-count”关联起来,“add-count”事件在组件标签中监听,这就是:通过组件结构内的标签向组件标签传递信息或者指令(不是传递数据)

需要注意的是:

(1)html标签不区分大小写,而

20181107163246586.png

内部是区分大小写的,所以不能大小驼峰命名:addCount

(2)props接收了data下posts中的每个对象post,同时也可以接收data下的count值,注意值在组件中的传递

(3)Vue实例中所用的所有数据变量名,都要在data对象中申明

3.1 除了传递指令或者消息,还可以传递值

具体的在组件基础——Vue.js有讲解

二、非父子组件传值

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3p5ejAwMDAwMDAw_size_16_color_FFFFFF_t_70 2

1. bus总线

原理:

实例:在vue原型上创建一个bus属性,bus属性==new Vue()对象。实例中的在bus属性上,$emit 传值 和 $on绑定事件接收值;通过counted钩子函数给组件绑定同样的事件,当change事件需要触发时,两个组件都会触发。

注意:触发change事件,传入的值。

  1. <div id="app">
  2. <child content="Dell"></child>
  3. <child content="Lee"></child>
  4. </div>
  5. <script>
  6. Vue.prototype.bus = new Vue() //在Vue原型上定义一个Vue实例,原型拥有了Vue实例的方法和属性
  7. var child = {
  8. props: {
  9. content: String
  10. },
  11. data: function(){
  12. return {
  13. name: this.content
  14. }
  15. },
  16. template: `<div @click="byValue">{
  17. {name}}</div>`,
  18. methods: {
  19. byValue(){
  20. this.bus.$emit('change', this.name)
  21. }
  22. },
  23. mounted: function(){ //生命周期钩子,也可以绑定在组件上,即组件挂在页面的时候触发,
  24. // 当触发mounted的时候,组件上有个bus属性,上有$on方法,可以绑定事件
  25. var _this = this;
  26. this.bus.$on('change', function(msg){
  27. _this.name = msg
  28. })
  29. }
  30. }
  31. var vm = new Vue({
  32. el: '#app',
  33. components: {
  34. child
  35. },
  36. })
  37. </script>

两个组件上都绑定了change事件,当触发其中一个组件的点击事件时,会通过$emit 传递信息,绑定了change事件的组件都触发了change事件。并且传入的值 都是this.name(其中一个组件的name值)

发表评论

表情:
评论列表 (有 0 条评论,370人围观)

还没有评论,来说两句吧...

相关阅读

    相关 vue

    > 1. 计算属性和方法的区别:计算属性中不会添加重复内容;方法添加会重复添加 > 2. 生命周期中的销毁:普通的显示隐藏`v-show`并不是销毁,只是将元素隐藏 > 3

    相关 vue数据传递 components props

    组件不仅仅是要把模板的内容进行复用,更重要的是组件间的通信。通常父组件的模板中包含子组件,父组件要正向的向子组件传递数据或者参数,子组件接收到后根据参数的不同来进行对应的渲染。

    相关 Vue传递

     Vue组件中值是如何传递的? 三、v-for的情况下,父组件向子组件传值 两种情况如下: 1. 父组件传一个items数组——对象的集合,一次将所有的值传过去,此时fo