vue自定义组件实现双向绑定


Posted in Vue.js onJanuary 13, 2021

场景:

我们比较常用的父子组件之间的交互方式:
父组件通过props将数据流入到子组件;
子组件通过$emit将更新后的数组发送的父组件;

今天,我们通过另一种方式实现交互,参考input框的v-model,实现自定义组件的双向数据绑定。
即:父组件值改变,子组件的值跟着改变;反之,子组件值发生变化,父组件值随之变化

子组件定义:

由于不能直接修改props属性值,我们这里定义valueData,通过监听实时接收value值,通过click方法修改valueData。
这里注意model语法糖prop 是接收的props属性value,保持一致。event是先上传递的事件名。

代码如下:

<template>
  <div>
    <div>{{ `子组件值: ${value}` }}</div>
    <div @click="click">点击此处修改值</div>
  </div>
</template>

<script>
export default {
  name: "",
  model: {
    prop: "value",
    event: "change"
  },
  props: {
    value: Number
  },
  components: {},
  data() {
    return {
      valueData: ""
    };
  },
  watch: {
    value(newValue, oldValue) {
      this.valueData = newValue;
      console.log(`子组件值:${newValue}`);
    }
  },
  created() {
  },
  mounted() {
  },
  methods: {
    click() {
      this.valueData++;
      this.$emit("change", this.valueData);
    }
  }
};
</script>
<style lang='less' scoped>
</style>

父组件定义:

父组件通过v-model绑定text值,名称不一定是value,可以是其他任意符合命名规范的字符串,这里是text。
子组件通过change事件更新数据后,v-mode绑定值随之变化。
或者父组件修改text值后,子组件value值随之变化。

代码如下:

<template>
  <div>
    <div>{{ `父组件值:${text}` }}</div>
    <div @click="click">点击此处修改值</div>


    <span>-----------------------------------------------------------</span>

    <test-children v-model="text"></test-children>

  </div>
</template>

<script>
import TestChildren from "@/views/TestChildren";

export default {
  name: "",
  components: { TestChildren },
  data() {
    return {
      text: 1
    };
  },
  created() {
  },
  mounted() {
  },
  watch: {
    text(newValue, oldValue) {
      console.log(`父组件值:${newValue}`);
    }
  },
  methods: {
    click() {
      this.text--;

    }
  }
};
</script>
<style lang='less' scoped>
</style>

结果:

直接copy代码到自己项目测试。无论是通过父组件改变值,还是子组件改变值。两个组件通过v-mode绑定的值始终保持一致。

答疑:

有同学就问了 ,这不是和通过props向下流入数据,再通过$emit方式向上传递数据一样么也能实现我这种双向绑定的效果。 其实不然,如果不通过v-model,那么我们势必会在父组件写这样的代码:

<test-children @change="changeText"></test-children>

然后在通过定义changeText方法修改text值。

试想,当我们的页面比较复杂,引用组件量比较庞大,页面中就需要多定义这样十几、二十几个方法。可阅读行大大降低,增加了维护成本。

扩展:

vue2.3之后提供了sync方式,也能实现双向绑定

父组件中的写法:

<test-children :value.sync="text"></test-children>

子组件中不需要使用下面model定义,直接删除即可。

model: {
prop: “value”,
event: “change”
},

向父组件传递数据使用如下方式:

this.$emit("update:value", this.valueData);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Vue.js 相关文章推荐
Vue组件生命周期运行原理解析
Nov 25 Vue.js
对vue生命周期的深入理解
Dec 03 Vue.js
8个非常实用的Vue自定义指令
Dec 15 Vue.js
vue中如何添加百度统计代码
Dec 19 Vue.js
Vue 修改网站图标的方法
Dec 31 Vue.js
详解template标签用法(含vue中的用法总结)
Jan 12 Vue.js
Vue中使用wangeditor富文本编辑的问题
Feb 07 Vue.js
Vue多选列表组件深入详解
Mar 02 Vue.js
Vue项目打包、合并及压缩优化网页响应速度
Jul 07 Vue.js
Vue h函数的使用详解
Feb 18 Vue.js
vue使用wavesurfer.js解决音频可视化播放问题
Apr 04 Vue.js
vue修饰符.capture和.self的区别
Apr 22 Vue.js
Vue页面渲染中key的应用实例教程
Jan 12 #Vue.js
Vue项目中使用mock.js的完整步骤
Jan 12 #Vue.js
vue 页面跳转的实现方式
Jan 12 #Vue.js
Vue过滤器,生命周期函数和vue-resource简单介绍
Jan 12 #Vue.js
详解template标签用法(含vue中的用法总结)
Jan 12 #Vue.js
Vue中ref和$refs的介绍以及使用方法示例
Jan 11 #Vue.js
vue实现防抖的实例代码
Jan 11 #Vue.js
You might like
ob_start(),ob_start('ob_gzhandler')使用
2006/12/25 PHP
php adodb分页实现代码
2009/03/19 PHP
.htaccess文件保护实例讲解
2011/02/06 PHP
PHP foreach遍历多维数组实现方式
2016/11/16 PHP
PHP无限极分类函数的实现方法详解
2017/04/15 PHP
phpMyAdmin通过密码漏洞留后门文件
2018/11/20 PHP
用Javascript实现Sleep暂停功能代码
2010/09/03 Javascript
JS中Iframe之间传值的方法
2013/03/11 Javascript
js 鼠标移动显示图片的简单实例
2013/12/25 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
使用jQuery给input标签设置默认值
2016/06/20 Javascript
Bootstrap CSS组件之面包屑导航(breadcrumb)
2016/12/17 Javascript
vue的无缝滚动组件vue-seamless-scroll实例
2017/12/18 Javascript
详解vue.js移动端配置flexible.js及注意事项
2019/04/10 Javascript
electron-vue利用webpack打包实现多页面的入口文件问题
2019/05/12 Javascript
基于vue手写tree插件的那点事儿
2019/08/20 Javascript
Vue 实现CLI 3.0 + momentjs + lodash打包时优化
2019/11/13 Javascript
[09:40]DAC2018 4.5 SOLO赛 MidOne vs Miracle
2018/04/06 DOTA
[01:20:06]TNC vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python和Ruby中each循环引用变量问题(一个隐秘BUG?)
2014/06/04 Python
Python实现抓取页面上链接的简单爬虫分享
2015/01/21 Python
python中pass语句用法实例分析
2015/04/30 Python
python实现下载整个ftp目录的方法
2017/01/17 Python
Python做简单的字符串匹配详解
2017/03/21 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
我用Python抓取了7000 多本电子书案例详解
2019/03/25 Python
使用Django开发简单接口实现文章增删改查
2019/05/09 Python
人工神经网络算法知识点总结
2019/06/11 Python
python代码 FTP备份交换机配置脚本实例解析
2019/08/01 Python
Ubuntu中配置TensorFlow使用环境的方法
2020/04/21 Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
2020/05/22 Python
Selenium 配置启动项参数的方法
2020/12/04 Python
英国的一家创新礼品和小工具零售商:Menkind
2019/08/24 全球购物
童年读书笔记
2015/06/26 职场文书
2017元旦晚会开幕词
2016/03/03 职场文书
html输入两个数实现加减乘除功能
2021/07/01 HTML / CSS