前端框架Vue父子组件数据双向绑定的实现

 更新时间:2021年09月13日 15:23:05   作者:前端人  
Vue项目中经常使用到组件之间的数值传递,实现的方法很多,但是原理上基本大同小异。这篇文章将给大家介绍Vue 父子组件数据单向绑定与Vue 父子组件数据双向绑定的对比从而认识双向绑定

实现思路:

父 向 子 组件传值:使用 props 属性。( props property[属性] 的复数简写 )
子 向 父 组件传值:使用自定义事件。

一、父子组件单向传值

1、父向子传值

父向子组件传值,子组件接收到数据之后,保存到自己的变量中。

//父组件写法 
<cld :numP="num" ></cld> 
 
//子组件定义以及数据 
components:{ 
 cld:{ 
  template:'#child', 
  props:{ 
   numP:Number 
  }, 
 } 
} 
 
//子组件内容 
<template id="child"> 
 <div> 
  {{ numP }} 
 </div> 
</template> 


props 用于接收父组件传过来的值,props 的写法有很多种,具体如:

//方式1 :  直接接收数据 
props: [ 'numP' ] 
 
//方式2: 加类型限制 
props: [ 
 numP: Number 
 ]  
 
//方式3:添加默认值 
props: [ 
 numP: { 
  type:Number, 
  default:0 
  } 
]  
 
//方式4:是否必须值限制 
props: [ 
 numP: { 
  type:Number, 
  default:0, 
  require:true //添加必须值,不传此值会报错 
 } 
]  
 
//方式5:采用对象形式 
props: { 
 numP: { 
  type:Number, 
  default:0, 
 } 
} 

2、子向父传值

子向父组件传值,主要通过自定义事件进行传值,具体实例如下:

// 父组件内容 
<div> 
 子组件获取到的数据{{getNum}} 
 <cld :numb="num" @accept="getNumC"></cld> 
</div> 
 
//父组件方法 
methods:{ 
 getNumC(data){ 
  this.getNum = data //接收子组件传的数据 
 } 
}, 
//子组件定义 
components:{ 
 cld:{ 
  template:'#child', 
  data(){ 
   return{ 
    numC:1314 //子组件数据定义 
   } 
  }, 
  mounted(){ 
    this.$emit( 'accept' , this.numC ) // 触发自定义事件 
   } 
  } 
}, 

二、父子组件数据双向绑定

Vue 的数据都是单向流动的,而且 vue 中从来就没有任何的双向绑定,v-model 实现的双向绑定只是语法糖而已。

方式1:利用 watch 实现父子组件的数据双向绑定,具体实例如下:

<div id="app"> 
 数据<br>{{num}} 
 <input type="text" v-model="num"><br> 
 <cld :numb="num" @accept="getNumC"></cld> 
</div> 
//子组件内容 
<template id="child"> 
 <div> 
  数据<br>{{childNum}} 
  <input type="text" v-model="childNum" /> 
 </div> 
</template> 
 
  <!-- 父子组件通信 --> 
const app = new Vue({ 
 el:'#app', 
  data:{ 
   num:'520', 
   }, 
  methods:{ 
   getNumC(data){ 
    this.num = data 
   } 
  }, 
  components:{ 
   cld:{ 
    template:'#child', 
    props:{ 
     numb:String 
    }, 
   data(){ 
    return{ 
     childNum:0, 
    } 
   }, 
  watch:{ 
   numb:function(){ 
    this.childNum = this.numb 
   }, 
   childNum:function(){ 
    this.$emit('accept',this.childNum) 
    } 
   }, 
  mounted(){ 
   this.childNum = this.numb 
   } 
  } 
 }  
}) 


方式2:.sync 修饰符实现双向绑定

在vue 1.x 中的 .sync 修饰符所提供的功能。当一个子组件改变了一个带 .sync 的 prop 的值时,这个变化也会同步到父组件中所绑定的值。这很方便,但也会导致问题,因为它破坏了单向数据流。(数据自上而下流,事件自下而上走)

<cld :numb.sync="num" ></cld> 
//会扩展为: 
<cld  :numb="bar"  @update:numb=”val => bar = val”/> 


当组件需要更新 numb 的值时,需要触发更新事件:

this.$emit("update:numb", newValue ); 


使用具体实例如下:

// 父组件 
<Father :foo.sync="foo"></Father> 
 
//子组件 
props: ['foo'], 
data() { 
  return { 
   newFoo: this.foo; 
   } 
}, 
methods:{ 
 add:function(){ 
  this.newMsg=10; 
  this.$emit('update:foo',this.newFoo); 
 } 
} 

到此这篇关于前端框架Vue 父子组件数据双向绑定的文章就介绍到这了,更多相关Vue 父子组件数据双向绑定内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue中使用require.context自动引入组件的操作方法

    Vue中使用require.context自动引入组件的操作方法

    require.context 是 webpack 提供的一个API,用于创建context,即一组具有相同上下文的模块,使用 require.context 可以方便地加载多个模块,并且可以灵活地控制模块的加载顺序和依赖关系,本文给大家讲解Vue中使用require.context自动引入组件的方法,感兴趣的朋友一起看看吧
    2024-01-01
  • vue3报错提示找不到模块“./XXX.vue”或其相应的类型声明问题

    vue3报错提示找不到模块“./XXX.vue”或其相应的类型声明问题

    这篇文章主要介绍了vue3报错提示找不到模块“./XXX.vue”或其相应的类型声明问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • el-date-picker设置日期默认值两种方法(当月月初至月末)

    el-date-picker设置日期默认值两种方法(当月月初至月末)

    这篇文章主要给大家介绍了关于el-date-picker设置日期默认值(当月月初至月末)的相关资料,文中通过代码示例将解决的办法介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Vue组合式API的特点及使用方法

    Vue组合式API的特点及使用方法

    在Vue.js 3.0中,推出了新的组合式API,使得开发者能够更加方便灵活地编写Vue组件,这也是组合式 API 成为了 Vue 新的开发范式,与传统的选项 API 相比,组合式 API 更加灵活、易于维护的原因,在本文中,我们将详细介绍 Vue 组合式API的风格及使用
    2023-06-06
  • Vue前端整合Element Ui的教程详解

    Vue前端整合Element Ui的教程详解

    这篇文章主要介绍了Vue前端整合Element Ui,本节内容服务于SpringBoot + Vue 搭建 JavaWeb 增删改查项目,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • vue data有值,但是页面{{}} 取不到值的解决

    vue data有值,但是页面{{}} 取不到值的解决

    这篇文章主要介绍了vue data有值,但是页面{{}} 取不到值的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • 在Vue mounted方法中使用data变量详解

    在Vue mounted方法中使用data变量详解

    今天小编就为大家分享一篇在Vue mounted方法中使用data变量详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Vue 页面状态保持页面间数据传输的一种方法(推荐)

    Vue 页面状态保持页面间数据传输的一种方法(推荐)

    vue router给我们提供了两种页面间传递参数的方式,一种是动态路由匹配,一种是编程式导航,接下来通过本文给大家介绍Vue 页面状态保持页面间数据传输的一种方法,需要的朋友可以参考下
    2018-11-11
  • 前端不用跑项目vscode组件效果所见即所得

    前端不用跑项目vscode组件效果所见即所得

    这篇文章主要为大家介绍了一款不用跑项目的vscode组件所见即所得效果的使用方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • vue前端实现导出页面为word的两种方法代码

    vue前端实现导出页面为word的两种方法代码

    在前端开发中我们常常需要将页面页面为word文件,这篇文章主要给大家介绍了关于vue前端实现导出页面为word的两种方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-04-04

最新评论