Vue2.0怎么实现组件数据的双向绑定

这次给大家带来Vue2.0怎么实现组件数据的双向绑定,Vue2.0实现组件数据的双向绑定的注意事项有哪些,下面就是实战案例,一起来看一下。

通过上一节的学习,我们了解到了在Vue的组件中数据传递: prop 向下传递,事件向上传递 。意思是父组件通过 prop 给子组件下发数据,子组件通过事件给父组件发送消息。但Vue中, props 是单向数据绑定,虽然在Vue 1.0版本中,通过 .sync 能实现双向数据绑定。但 .sync 在几个版本中被移除,尽管在2.3版本重新引入 .sync 修饰符,可这次引入只是作为一个编译时的语法糖存在。如果直接使用 .sync 修饰符来做双向数据绑定,会报警告信息。那么我们如何在组件中实现双向数据绑定呢?这一节我们就来学习这方面的相关知识。

实现组件双向数据绑定

在上一节中最后的示例使用的是Vue 1.0版本中的 .sync 实现数据双向绑定。那我们先来看看抛弃 .sync 修饰符来实现组件双向数据绑定的工作: 通过Vue提供的机制,绕开直接修改 prop 来实现组件双向数据绑定 。

其思路大致是这样:

在数据渲染时使用 prop 渲染数据

将 prop 绑定到子组件自身的数据上,修改数据时修改自身数据来替代 prop

watch 子组件自身数据的改变,触发事件通知父组件更改绑定到 prop 的数据

这样做的好处是: 父组件数据改变时,不会修改存储 prop 的子组件数据,只是以子组件数据为媒介,完成对 prop 的双向修改 。

继续拿上一节的示例来举例,只不过接下来的示例,并没有使用 .sync 来实现双向数据绑定的效果。

修改的代码如下:

父组件Parent数据

  • {{ name }}
  • {{ age }}

name = val" @update:my-age="val => age = val">

子组件child数据

  • {{ myName }}
  • {{ myAge }}

登录后复制

在上面的这个示例中,我们并没有使用 .sync 修饰符,但在调用子组件的时候使用了 @update :

 name = val" @update:my-age="val => age = val">

登录后复制

子组件中渲染到HTML模板的数据是用的 prop 数据,但监听 input 是使用的子组件自身定义的数据作为 v-model 。这样一来就不会直接修改 prop 。简单来说, 一切 prop 的改变从本质上来说都由父组件完成 。JavaScript的代码如下:

let parent = new Vue({ el: '#app', data () {  return {   name: 'w3cplus',   age: 7  } }, components: {  'child': {   template: '#child',   props: ['myName', 'myAge'],   data () {    return {     childMyName: this.myName,     childMyAge: this.myAge    }   },   watch: {    childMyName: function (val) {     this.$emit('update:my-name', val)    },    childMyAge: function (val) {     this.$emit('update:my-age', val)    }   }  } }})

登录后复制

最终效果如下:

上面的示例效果,不管是修改父组件的数据还是子组件的数据,都会相互影响:

Vue2.0怎么实现组件数据的双向绑定 

因为子组件中 props 的 myName 和 myAge 不可写,所以在 data 中创建一个副本 childMyName 和 childMyAge 。初始值为 props 属性 myName 和 myAge 的值,同时在组件内所有需要调用 props 的地方调用 data 中的 childMyName 和 childMyAge 。

components: { 'child': {  template: '#child',  props: ['myName', 'myAge'],  data () {   return {    childMyName: this.myName,    childMyAge: this.myAge   }  },  ... }}

登录后复制

接下来在子组件中通过 watch 来对 props 属性的 myName 和 myAge 进行监听。当 props 修改后对应 data 中的副本 childMyName 和 childMyAge 也要同步数据。

...watch: { childMyName: function (val) {  this.$emit('update:my-name', val) }, childMyAge: function (val) {  this.$emit('update:my-age', val) }}...

登录后复制

接下来要做的事情就是当组件内的 props 属性发生变化时,需要向组件外(父组件)发送通知,通知组件内属性变更,然后由外层(父组件)自己来决定是否变更他的数据。

接下来我们按上面的方案来改造上一节示例中的switch按钮。

至此,实现了组件内部数据与组件外部的数据的双向绑定,组件内外数据的同步。简而言之: 组件内部自已变了告诉外部,外部决定要不要变更 。

Vue2.0怎么实现组件数据的双向绑定 

什么样的 props 适合做双向绑定

事实上,在Vue中,双向绑定的 props 是不利于组件间的数据状态管理,尤其是较为复杂的业务当中,因此在实际项目中应该尽量少用双向绑定,过于复杂的数据处理,建议使用 Vuex 。但很多时候又避免不了使用双向绑定。那么什么场景之下使用 props 来做双向绑定呢?

如果在你的项目中,同时满足下面的条件时,我们就可以考虑使用 props 来做双向绑定:

组件内部需要修改 props

组件需要可以由外部在运行时动态控制,而非单纯的初始化

组件父部需要读取组件内的状态来进行处理

虽然上面的示例展示了我们怎么在Vue 2.0中实现 props 的双向绑定,但如果项目中有更多这样的双向绑定,那么就会让你做一些重复的事情,而且代码也很冗余,事情也会变得复杂。为了改变这样的现象,可以借助Vue的 mixin 来自动化处理 props 的双向绑定的需求。不过在这节中,我们不会学习这方面的知识,后面我们在学习 mixin 时,可地再回过头来实现这样的功能。

在Vue中除了上述介绍的组件通讯之外,还有其他一些方法,在下一节中,咱们将会继续学习这方面的知识。

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

v-for索引index在html中的使用

vue+webpack打包路径有哪些问题

以上就是Vue2.0怎么实现组件数据的双向绑定的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2778860.html

(0)
上一篇 2025年3月8日 15:40:30
下一篇 2025年3月1日 08:05:44

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 在Vue2.0中http请求以及loading的展示

    这次给大家带来在Vue2.0中http请求以及loading的展示,在Vue2.0中http请求以及loading展示的注意事项有哪些,下面就是实战案例,一起来看一下。 我们需要额外两个依赖vuex 和 axios:(还是接着上一个项目My…

    2025年3月8日
    200
  • JQuery如何选中select组件内指定的值

    这次给大家带来JQuery如何选中select组件内指定的值,JQuery选中select组件内指定的值的注意事项有哪些,下面就是实战案例,一起来看一下。 jquery获取select选择的文本与值 获取select : 获取select …

    编程技术 2025年3月8日
    200
  • vue与vue-i18n如何实现后台数据的多语言切换

    这次给大家带来vue与vue-i18n如何实现后台数据的多语言切换,vue与vue-i18n实现后台数据的多语言切换的注意事项有哪些,下面就是实战案例,一起来看一下。 在XXX.js文件中定义函数: getUser(context,info…

    编程技术 2025年3月8日
    200
  • 如何修改vue请求数据中的值

    这次给大家带来如何修改vue请求数据中的值,修改vue请求数据中值的注意事项有哪些,下面就是实战案例,一起来看一下。 由于 JavaScript 的限制, Vue 不能检测以下变动的数组: 当你利用索引直接设置一个项时,例如:vm.item…

    编程技术 2025年3月8日
    200
  • vue2.0的computed计算list循环的累加值

    这次给大家带来vue2.0的computed计算list循环的累加值,vue2.0 computed计算list循环累加值的注意事项有哪些,下面就是实战案例,一起来看一下。 实例如下所示: {{ msg }} Foo <!–{{it…

    编程技术 2025年3月8日
    200
  • 使用Vue的v-for进行数据分组

    这次给大家带来使用Vue的v-for进行数据分组,使用v-for进行数据分组的注意事项有哪些,下面就是实战案例,一起来看一下。 使用Vue.js可以很方便的实现数据的绑定和更新,有时需要对一个一维数组进行分组以方便显示,循环可以直接使用v-…

    2025年3月8日
    200
  • Vue中点击组件后即可关闭组件的实现方法

    这次给大家带来Vue中点击组件后即可关闭组件的实现方法,Vue中点击组件后即关闭组件的注意事项有哪些,下面就是实战案例,一起来看一下。 Vue定义全局点击函数,参数为点击的回调函数。 Vue.prototype.globalClick = …

    编程技术 2025年3月8日
    200
  • 解决vue2.0路由不显示router-view的问题

    这次给大家带来解决vue2.0路由不显示router-view的问题,解决vue2.0路由不显示router-view的注意事项有哪些,下面就是实战案例,一起来看一下。 今天学习vue2.0 的 router-view , 爆出的错误不计其…

    编程技术 2025年3月8日
    200
  • vue注册组件有几种方法

    这次给大家带来vue注册组件有几种方法,使用vue注册组件的注意事项有哪些,下面就是实战案例,一起来看一下。 1、全局注册(这种方式注册组件必须在vue实例化之前声明) Vue.component(‘tag-name’,{}) 登录后复制 …

    编程技术 2025年3月8日
    200
  • use怎么注册Vue的全局组件

    这次给大家带来use怎么注册Vue的全局组件,use注册Vue全局组件的注意事项有哪些,下面就是实战案例,一起来看一下。 Vue中的组件和指令分为局部组件、局部指令和全局组件、全局指令。对于注册有一定数量的全局指令和全局组件时,官方文档中的…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论