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中通过render函数给子组件设置ref操作
Nov 17 Vue.js
vue 表单输入框不支持focus及blur事件的解决方案
Nov 17 Vue.js
实用的 vue tags 创建缓存导航的过程实现
Dec 03 Vue.js
对vue生命周期的深入理解
Dec 03 Vue.js
vue实现图书管理系统
Dec 29 Vue.js
Vue中ref和$refs的介绍以及使用方法示例
Jan 11 Vue.js
Vue单页面应用中实现Markdown渲染
Feb 14 Vue.js
VUE实现吸底按钮
Mar 04 Vue.js
vue项目两种方式实现竖向表格的思路分析
Apr 28 Vue.js
详解Vue中$props、$attrs和$listeners的使用方法
Feb 18 Vue.js
vue postcss-px2rem 自适应布局
May 15 Vue.js
Vue ECharts实现机舱座位选择展示功能
May 15 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学习之运算符相关概念
2011/06/09 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
2014/06/30 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
2018/04/20 PHP
php实现微信企业付款到个人零钱功能
2018/10/09 PHP
PHP常用函数之base64图片上传功能详解
2019/10/21 PHP
一个用js实现控制台控件的代码
2007/09/04 Javascript
js利用Array.splice实现Array的insert/remove
2009/01/13 Javascript
显示js对象所有属性和方法的函数
2009/10/16 Javascript
基于jquery的jqDnR拖拽溢出的修改
2011/02/12 Javascript
JS.getTextContent(element,preformatted)使用介绍
2013/09/21 Javascript
详解jquery中$.ajax方法提交表单
2014/11/03 Javascript
简单讲解AngularJS的Routing路由的定义与使用
2016/03/05 Javascript
适用于手机端的jQuery图片滑块动画
2016/12/09 Javascript
jquery 禁止鼠标右键并监听右键事件
2017/04/27 jQuery
Vue组件之全局组件与局部组件的使用详解
2017/10/09 Javascript
面包屑导航详解
2017/12/07 Javascript
vue组件实现弹出框点击显示隐藏效果
2020/10/26 Javascript
layui实现数据表格table分页功能(ajax异步)
2019/07/27 Javascript
JavaScript 实现HTML DOM增删改查操作的常见方法详解
2020/01/04 Javascript
浅谈element中InfiniteScroll按需引入的一点注意事项
2020/06/05 Javascript
Vue 数据响应式相关总结
2021/01/28 Vue.js
[01:10]DOTA2次级职业联赛 - U5战队宣传片
2014/12/01 DOTA
python多线程编程方式分析示例详解
2013/12/06 Python
python通过urllib2爬网页上种子下载示例
2014/02/24 Python
简单的Python2.7编程初学经验总结
2015/04/01 Python
详解使用python的logging模块在stdout输出的两种方法
2017/05/17 Python
关于pip的安装,更新,卸载模块以及使用方法(详解)
2017/05/19 Python
Python 存储字符串时节省空间的方法
2019/04/23 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
2019/12/18 Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
2020/01/13 Python
python实现提取str字符串/json中多级目录下的某个值
2020/02/27 Python
全面总结使用CSS实现水平垂直居中效果的方法
2016/03/10 HTML / CSS
介绍一下.net和Java的特点和区别
2012/09/26 面试题
用C#语言写出与SQLSERVER访问时的具体过程
2013/04/16 面试题
轻金属冶金专业毕业生自荐信
2013/11/02 职场文书
学生自我评价范文
2014/02/02 职场文书