Vue - 父子组件之间传值(v-bind / props、$emit / v-on)

一. 父组件向子组件传值

传值方法

  1. 父组件:

    通过 v-bind 的形式进行传递
    例:通过 v-bind 属性把 pInfo 的值赋给 info 变量

    <child :info="pInfo"></child>
    
  2. 子组件:

    2.1 props:接收父组件传递的值,可校验传递的数据

    校验属性
    type:限制传递的数据类型
    required:设置数据是否必传(true:是,false:否)
    default:设置默认值,若父组件未向子组件传递数据,使用此数据
    validator:自定义校验,:父组件传递的数据长度必须大于 5

      props: {
        info: {
          type: String,
          required: true,
          validator:function(value){
          	return (value.length > 5)
          }
        }
      },
    

    2.2 通过watch侦听器,侦听父组件传递的值,实现动态传递数据

    监听父组件传回来的 info 数据
    当父组件传回来的数据发生改变时会执行侦听器中的方法

    watch: {
        //newValue 新数据(本次父组件传递的数据)
        //oldValue 旧数据(上一次父组件传递的数据)
        info(newValue, oldValue) {
          if (newValue) {
            //将新值赋值到data中
            this.infoText= newValue;
          }
        }
      },
    

传值实例

  1. 简单使用父组件向子组件传值

    父组件代码

    <template>
      <div>
        <child :info="pInfo"></child>
      </div>
    </template>
    
    <script>
    //子组件地址(仅供参考),具体以实际项目目录地址为准
    import child from "./Child.vue";
    export default {
      components: {
        child: child
      },
      data() {
        return {
          pInfo: "父组件数据"
        };
      }
    };
    </script>
    
    <style scoped>
    </style>
    

    子组件代码

    <template>
      <div>
        <div>子组件接受父组件数据:{{ infoText }}</div>
      </div>
    </template>
    
    <script>
    export default {
      //接收父组件传递的数据
      props: {
        info: {
          type: String,
          required: true
        }
      },
      data() {
        return {
          infoText: ""
        };
      },
      mounted() {
        this.infoText = this.info;
      }
    };
    </script>
    
    <style scoped>
    </style>
    
  2. 深入使用父组件向子组件传值,子组件动态获取父组件传值

    通过 实例1,我们会发现父组件向子组件传递不同数据的时候,子组件接收的数据一直是第一次获取到的,没有实现动态改变,相信很多人都遇到过这个问题。
    那么想要实现子组件动态接收父组件传递的数据,需要怎么解决呢?这个时候我们就需要用到了watch侦听器。

    父组件代码

    <template>
      <div>
        <button @click="toChild">向子组件传新值</button>
        <child :info="pInfo"></child>
      </div>
    </template>
    
    <script>
    //子组件地址(仅供参考),具体以实际项目目录地址为准
    import child from "./Child.vue";
    export default {
      components: {
        child: child
      },
      data() {
        return {
          pInfo: "父组件数据"
        };
      },
      methods: {
        toChild() {
          this.pInfo = "新的父组件数据";
        }
      }
    };
    </script>
    
    <style scoped>
    </style>
    

    子组件代码

    <template>
      <div>
        <div>子组件接受父组件数据:{{ infoText }}</div>
      </div>
    </template>
    
    <script>
    export default {
      //接收父组件传递的数据
      props: {
        info: {
          type: String,
          required: true
        }
      },
      data() {
        return {
          infoText: ""
        };
      },
      watch: {
        //newValue 新数据(本次父组件传递的数据)
        //oldValue 旧数据(上一次父组件传递的数据)
        info(newValue, oldValue) {
          if (newValue) {
            //将新值赋值到data中
            this.infoText = newValue;
          }
        }
      },
      mounted() {
        this.infoText = this.info;
      }
    };
    </script>
    
    <style scoped>
    </style>
    

二. 子组件向父组件传值

传值方法

子组件向父组件传值是通过方法传递的,也可以说是子组件调用父组件方法。

  1. 子组件:

    通过 $emit() 向外触发父组件中方法,同时进行数据的传递
    例:通过 $emit 触发父组件中的received方法, msg 为子组件向父组件穿的数据

    const msg = "执行到了";
    this.$emit("received", msg);
    
  2. 父组件:

    通过事件方法监听子组件的状态
    例:通过 v-on 方法监听hideDrawer方法

    <child @received="hideDrawer"></child>
    

传值实例

父组件

<template>
  <div>
    <h3>父组件</h3>
    <p>收到子组件数据:{{ cInfo }}</p>
    <hr />
    <h3>子组件</h3>
    <child @received="getChildInfo"></child>
  </div>
</template>

<script>
//子组件地址(仅供参考),具体以实际项目目录地址为准
import child from "./Child.vue";
export default {
  components: {
    child: child
  },
  data() {
    return {
      cInfo: ""
    };
  },
  methods: {
    getChildInfo(info) {
      this.cInfo = info;
    }
  }
};
</script>

<style scoped>
</style>

子组件

<template>
  <div>
    <button @click="handleBtn">向父组件传值</button>
  </div>
</template>

<script>
export default {
  data() {
    return {};
  },
  methods: {
    handleBtn() {
      const msg = "执行到了";
      this.$emit("received", msg);
    }
  }
};
</script>

<style scoped>
</style>
Vue2中,父子组件实现v-model的方式是通过props和自定义事件来实现的。具体步骤如下: 1. 在父组件中,通过props将数据传递给子组件。可以使用v-bind指令将父组件的数据绑定到子组件props上。 2. 在子组件中,接收父组件传递的数据,并将其作为子组件的内部数据进行处理。 3. 在子组件中,通过$emit方法触发一个自定义事件,并将需要传递给父组件的数据作为参数传递给该事件。 4. 在父组件中,通过v-on指令监听子组件触发的自定义事件,并在事件处理函数中更新父组件的数据。 这样,父子组件之间就实现了双向数据绑定,父组件的数据改变会自动更新到子组件,子组件通过触发自定义事件来通知父组件的数据改变。 总结起来,父子组件实现v-model的方式是通过props和自定义事件来实现的,父组件通过props将数据传递给子组件,子组件通过$emit方法触发自定义事件来通知父组件的数据改变。 #### 引用[.reference_title] - *1* *2* *3* [vue2 组件传值的方式 v-model的原理和实现](https://blog.csdn.net/qq_41370833/article/details/124871927)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值