Vue(3)

Vue组件之间传值
(1)父组件向子组件传值
理解
1.1、Model部分新创建的vm实例可以看作一个组件,即父组件,在内部定义的components是它的子组件。

<script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
        msg: '123 啊-父组件中的数据'
      },
      methods: {},

      components:
        com1: {
          template: '<h1>这是子组件 --- {{ parentmsg }}</h1>',
          props: ['parentmsg'],
          methods: {
            change() {
              this.parentmsg = '被修改了'
            }
          }
        }
      }
    });
  </script>

1.2、view部分 div#app 受父组件控制,里面的com1受子组件控制。

<div id="app">
    <com1></com1>
  </div>

1.3、子组件中,默认无法访问父组件中 data 中的数据和 method中的方法
那如何将父组件的值传递给子组件呢?
2.1、在view部分通过属性绑定的(v-bind)的形式,把需要传给子组件的数据,以属性绑定的方式,传递给子组件

<div id="app">
    <com1 v-bind:parentmsg="msg"></com1>
  </div>

2.2、model部分,在子组件template中获取父组件传给子组件的属性,
不过要注意父组件传过来的属性,现在props数组中,定义一下,这样才能使用数组,不然会报错

components: {
        com1: 
          template: '<h1>这是子组件 --- {{ parentmsg }}</h1>',
          props: ['parentmsg'], 
        }
      }

子组件中data数据与props数据的区别

子组件中的 data 数据,并不是通过 父组件传递过来的,而是子组件自身私有的,比如: 子组件通过 Ajax ,请求回来的数据,都可以放到 data 身上;
组件中的 所有 props 中的数据,都是通过 父组件传递给子组件的
data 上的数据,都是可读可写的;
props 中的数据,都是只读的,无法重新赋值,赋值会报错


<body>
  <div id="app">
   
    <com1 v-bind:parentmsg="msg"></com1>
  </div>

  <script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
        msg: '123 啊-父组件中的数据'
      },
      methods: {},

      components: {
        // 结论:经过演示,发现,子组件中,默认无法访问到 父组件中的 data 上的数据 和 methods 中的方法
        com1: {
          data() { // 注意: 子组件中的 data 数据,并不是通过 父组件传递过来的,而是子组件自身私有的,比如: 子组件通过 Ajax ,请求回来的数据,都可以放到 data 身上;
            // data 上的数据,都是可读可写的;
            return {
              title: '123',
              content: 'qqq'
            }
          },
          template: '<h1 @click="change">这是子组件 --- {{ parentmsg }}</h1>',
          // 注意: 组件中的 所有 props 中的数据,都是通过 父组件传递给子组件的
        
          props: ['parentmsg'], // 把父组件传递过来的 parentmsg 属性,先在 props 数组中,定义一下,这样,才能使用这个数据
          directives: {},
          filters: {},
          components: {},
          methods: {
            change() {
              this.parentmsg = '被修改了'
            }
          }
        }
      }
    });
  </script>

(3)父组件向子组件传递方法(子组件向父组件传值)
父组件向子组件传递方法:
model部分在父组件定义一个方法show(),
view部分父组件通过事件绑定机制向子组件传递方法
model部分子组件调用父组件方法(通过emit方法)
view部分子组件点击触发该方法
子组件向父组件传值:父组件向子组件传递方法的同时,把要发送给父组件的数据,在调用方法的时候当作参数传递进去;

<body>
  <div id="app">
   
    <com2 @func="show"></com2>
  </div>

  <template id="tmpl">
    <div>
      <h1>这是 子组件</h1>
      <input type="button" value="这是子组件中的按钮 - 点击它,触发 父组件传递过来的 func 方法" @click="myclick">
    </div>
  </template>

  <script>

    // 定义了一个字面量类型的 组件模板对象
    var com2 = {
      template: '#tmpl', 
      data() {
        return {
          sonmsg: { name: '小头儿子', age: 6 }
        }
      },
      methods: {
        myclick() {
  
          //  emit 英文原意: 是触发,调用、发射的意思
          // this.$emit('func123', 123, 456)
          this.$emit('func', this.sonmsg)
        }
      }
    }


    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
        datamsgFormSon: null
      },
      methods: {
        show(data) {
          // console.log('调用了父组件身上的 show 方法: --- ' + data)
          // console.log(data);
          this.datamsgFormSon = data
        }
      },

      components: {
        com2
        // com2: com2
      }
    });
  </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值