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实现表格合并功能
Dec 01 Vue.js
Vue.js桌面端自定义滚动条组件之美化滚动条VScroll
Dec 01 Vue.js
Vue $attrs &amp; inheritAttr实现button禁用效果案例
Dec 07 Vue.js
vue 在单页面应用里使用二级套嵌路由
Dec 19 Vue.js
vue 实现click同时传入事件对象和自定义参数
Jan 29 Vue.js
vue使用Google Recaptcha验证的实现示例
Aug 23 Vue.js
详解Vue slot插槽
Nov 20 Vue.js
详解Vue的列表渲染
Nov 20 Vue.js
关于Vue中的options选项
Mar 22 Vue.js
vue数据字典取键值项目的字典问题
Apr 12 Vue.js
vue使用localStorage持久性存储实现评论列表
Apr 14 Vue.js
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
Apr 24 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
php下防止单引号,双引号在接受页面转义的设置方法
2008/09/25 PHP
基于jquery的点击链接插入链接内容的代码
2012/07/31 Javascript
jQuery 获取浏览器所在的IP地址的小例子
2013/11/08 Javascript
JavaScript中的replace()方法使用详解
2015/06/06 Javascript
通用无限极下拉菜单的实现代码
2016/05/31 Javascript
D3.js实现散点图和气泡图的方法详解
2016/09/21 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
jQuery电话号码验证实例
2017/01/05 Javascript
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
2017/03/28 NodeJs
Angularjs 1.3 中的$parse实例代码
2017/09/14 Javascript
jQuery选择器之表单元素选择器详解
2017/09/19 jQuery
vue单页开发父子组件传值思路详解
2018/05/18 Javascript
微信小程序实现用table显示数据库反馈的多条数据功能示例
2019/05/07 Javascript
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
2019/11/26 Javascript
Vue实现兄弟组件间的联动效果
2020/01/21 Javascript
vue-cli4使用全局less文件中的变量配置操作
2020/10/21 Javascript
Python的条件语句与运算符优先级详解
2015/10/13 Python
Python 两个列表的差集、并集和交集实现代码
2016/09/21 Python
Python实现简易端口扫描器代码实例
2017/03/15 Python
Python中函数参数调用方式分析
2018/08/09 Python
pycharm的console输入实现换行的方法
2019/01/16 Python
python TF-IDF算法实现文本关键词提取
2019/05/29 Python
浅谈tensorflow 中tf.concat()的使用
2020/02/07 Python
在PyTorch中使用标签平滑正则化的问题
2020/04/03 Python
伯利陶器:Burleigh Pottery
2018/01/03 全球购物
char型变量中能不能存贮一个中文汉字
2015/07/08 面试题
请编程遍历页面上所有 TextBox 控件并给它赋值为 string.Empty
2015/12/03 面试题
巧克力蛋糕店创业计划书
2014/01/14 职场文书
三年大学生活自我鉴定
2014/01/21 职场文书
不假外出检讨书
2014/01/27 职场文书
学生打架检讨书
2014/02/14 职场文书
小学领导班子对照材料
2014/08/23 职场文书
四风对照检查剖析材料
2014/10/07 职场文书
四风批评与自我批评发言稿
2014/10/14 职场文书
python自动统计zabbix系统监控覆盖率的示例代码
2021/04/03 Python
python如何读取.mtx文件
2021/04/22 Python