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 相关文章推荐
vuex的数据渲染与修改浅析
Nov 26 Vue.js
vue element实现表格合并行数据
Nov 30 Vue.js
vue $router和$route的区别详解
Dec 02 Vue.js
解决vue下载后台传过来的乱码流的问题
Dec 05 Vue.js
基于vue与element实现创建试卷相关功能(实例代码)
Dec 07 Vue.js
vue 在单页面应用里使用二级套嵌路由
Dec 19 Vue.js
vue+elementui通用弹窗的实现(新增+编辑)
Jan 07 Vue.js
vue keep-alive的简单总结
Jan 25 Vue.js
vue 计算属性和侦听器的使用小结
Jan 25 Vue.js
vue 数据双向绑定的实现方法
Mar 04 Vue.js
Vue-router编程式导航的两种实现代码
Mar 04 Vue.js
Element-ui Layout布局(Row和Col组件)的实现
Dec 06 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 include类文件超时问题处理
2015/02/06 PHP
php函数实现判断是否移动端访问
2015/03/03 PHP
PHP获取文件行数的方法
2015/06/10 PHP
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
php生成无限栏目树
2017/03/16 PHP
详解PHP中curl_multi并发的实现
2020/06/08 PHP
让广告代码不再影响你的网页加载速度
2006/07/07 Javascript
IE 条件注释详解总结(附实例代码)
2009/08/29 Javascript
关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法
2010/11/30 Javascript
拉动滚动条加载数据的jquery代码
2012/05/03 Javascript
js+css3制作时钟特效
2016/10/16 Javascript
JavaScript遍历Json串浏览器输出的结果不统一问题
2016/11/03 Javascript
JS实现的表头列头固定页面功能示例
2017/01/10 Javascript
js实现横向拖拽导航条功能
2017/02/17 Javascript
vuex 使用文档小结篇
2018/01/11 Javascript
JS中原始值和引用值的储存方式示例详解
2018/03/23 Javascript
Angular 数据请求的实现方法
2018/05/07 Javascript
vue移动端实现红包雨效果
2020/06/23 Javascript
小程序实现人脸识别功能(百度ai)
2018/12/23 Javascript
[08:06]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant 选手采访
2021/03/11 DOTA
Python笔记(叁)继续学习
2012/10/24 Python
Python实现简单的可逆加密程序实例
2015/03/05 Python
Python3处理文件中每个词的方法
2015/05/22 Python
Python实现删除当前目录下除当前脚本以外的文件和文件夹实例
2015/07/27 Python
Python实现的生产者、消费者问题完整实例
2018/05/30 Python
关于python之字典的嵌套,递归调用方法
2019/01/21 Python
sklearn+python:线性回归案例
2020/02/24 Python
Python3.8安装Pygame教程步骤详解
2020/08/14 Python
香港时装购物网站:ZALORA香港
2017/04/23 全球购物
介绍下Java中==和equals的区别
2013/09/01 面试题
办公室经理岗位职责
2014/01/01 职场文书
莫言诺贝尔获奖演讲稿
2014/05/21 职场文书
工地安全标语
2014/06/07 职场文书
离婚起诉书范本
2015/05/18 职场文书
心灵点滴观后感
2015/06/02 职场文书
能用CSS实现的就不要麻烦JavaScript了
2021/10/05 HTML / CSS