欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Vue 之 组件传值

程序员文章站 2022-04-01 16:52:31
...

传值

1、父组件给子组件传值

思路:
–> 父组件的template 标签内,给子组件标签设置属性(属性值为父组件的数据属性名)
–> 在子组件的components设置 props:[‘属性名’]
–> 子组件的template内通过{{属性名}}直接绑定数据

实现关键代码:

<template id="par"> 
   <div>
       <p>{{ title }}</p>
       <v-chi :name="title"></v-chi>                           # (1)父组件内子组件绑定属性(获取数据)
   </div>
</template>

components: { "v-chi": { template: "#chi", props: ["name"] } }  # (2)子组件设置 pros(传递给子组件)
  
<template id="chi">
     <div>
       <div>子组件</div>
       <p>{{ name }}</p>                                        # (3)子组件内绑定数据 (在子组件内显示)
     </div> 
   </template>

总结:父组件–子组件传值 :

通过在子组件标签绑定自定义属性,属性值为父组件传递的数据,子组件对象通过props接收属性名,属性名指代的就是父组件的数据,然后展示在子组件标签内

2、子组件给父组件传值

扩展:原生JS中events的内置模块中的EventEmitter的类对象,其内有两个原型方法 on(接收事件推送来的数据) 和 emit(给事件推送相应的数据)形成了事件的推送

vue中把EventEmitter的类对象中的两个原型方法通过封装声明成onon和emit

注意点:
当调用函数没有实参时,被调用函数有形参时,可以用 $event 当实参或者调用的函数名不加 ()

思路:
–> (1)给子元素的组件标签上绑定自定义事件
–> (2)子组件标签在父组件的template标签内,则在父组件中添加该事件的方法
–> (3)在子元素的方法中使用子元素的 $emit()方法 推送(参数1:推送给的对象事件名,参数2:推送的内容)
–> (4)在父组件添加的事件方法中:通过方法中的形参接收推送的内容(给父组件的data数据属性赋值上推送内容)

<body>
    <div id="out">  <v-par></v-par>  </div>
    <template id="par">
      <div>
        <p>{{ tt }}</p>                          
        <v-chi @topar="ss"></v-chi>              
      </div>
    </template>
    <template id="chi">
      <div>
        <p>{{ title }}</p>
        <button @click="send()">发送数据</button>  
      </div>
    </template>
  </body>
  <script>
    var app = new Vue({
      el: "#out",
      components: {
        "v-par": {
          template: "#par",
          data() {
            return { tt: "" };            
          },
          methods: {
                ss(msg) {                
              this.tt = msg;               
            }
          },
          components: {
            "v-chi": {
              template: "#chi",
              data() {
                return { title: "发给给父组件的数据" };
              },
              methods: {
                send() {
                  this.$emit("topar", this.title);      
                }
              }}} } } });
  </script>

总结:

在子组件标签上绑定自定义事件,内部通过$emit给该事件推送子组件数据,父组件内部通过函数参数接收

3、平行关系之间的传值

利用空vue对象,建立两平行组件之间的联系(保证emitemit和on调用的对象是统一的)
利用 emit(,),emit(‘ ’,数据) 发送 ,on(“”,function(){ })接收,进行数据事件推送

主要实现代码:

    <template id="demoa">
      <div>   <p>{{ a }}</p>  <button @click="asend()">发送给C</button>  </div>
    </template>
    <template id="democ">
      <div>   <p>接收A数据:{{ astr }}</p> </div>
    </template>

  <script>   
    var vm = new Vue({});              # 保证$emit事件和$on事件调用的对象的指向是一样的
    var app = new Vue({
      el: "#out",
      components: {
        "v-a": {
          methods: {
            asend() {
              vm.$emit("isa", this.a); }}},     # 给isa事件发送v-a组件上的数据
        "v-c": {
          data() {
            return { astr: ""};
          },
          mounted() {
            var _this = this;    # 函数形参的this指向了vm,定义变量保存指向v-c组件的this          
            vm.$on("isa", function(msga) {  
              _this.astr = msga;}),
              )}}}});
  </script>

总结:利用空Vue对象,组件通过emitemit推送数据,另一组件通过on接收数据