v-model的双向数据绑定实现原理(附:案例和项目实例)

news2024/11/18 10:52:21

一. 前言。

相信对使用vue框架的童靴来说,v-model的使用都能信手沾来,熟悉的不能再熟悉,也都知道v-model其实是个语法糖。不过其究竟是怎么实现的双向数据绑定,很大一部分童靴还是心存疑虑。本文就根据最简单的案例和基于实际项目中最常用的实例来从两个角度讲解v-model的前世今生。

二. v-model的前世今生。

目前的几大主流MVC(VM)框架都实现了单向数据绑定。简而言之,vue中的v-model无非就是在单向数据绑定的基础上给对应表单元素(input、select等)添加了(input、change)事件,来动态修改model和view,从而达到双向数据绑定的效果。

三. v-model的实现。

  • 类型一:

原生input元素的类型是text/textarea,那么是使用它的value属性input事件来实现双向数据绑定。

  • 类型二:

原生input元素的类型是radio/checkbox,那么是使用它的checked属性change事件来实现双向数据绑定。

  • 类型三:

原生select元素,是使用它的value属性change事件来实现双向数据绑定。

四. v-model的实现案例。

本文就基于input输入框的text类型(上文中的类型一)为基准,来实现双向数据绑定的结果,并和v-mode的效果对比。

  • 核心代码:
<input type="text" :value="msg" @input="msg = $event.target.value"/>
  • 主要代码:
<template>
  <div class="home">
    <div class="box">
      v-model的文本框内容:<input type="text" v-model="msg">
      <p class="mscbox">v-model的展示内容:{{msg}}</p>
    </div>

    <br />

    <div class="box2">
      原生文本框的内容:<input type="text" :value="msg2" @input="changeVal">
      <p class="mscbox">原生的展示内容:{{msg2}}</p>
    </div>
  </div>
</template>

<script>

export default {
  name: "Home",
  components: {
    
  },
  data(){
    return {
      msg: "v-model的测试内容",
      msg2: "原生的测试内容",
    }
  },
  methods: {
    changeVal(e){
      this.msg2 = e.target.value
    }
  }
};
</script>

<style>
.mscbox{
  color: red;
}
</style>
  • 效果图:

 五.  根据v-model双向数据绑定实现父子组件的项目实例。

  • 实现功能描述:通过父组件的按钮的clink事件和子组件弹窗的关闭事件,实现父子组件弹窗的显示、隐藏无缝交互。
  • 主体核心思想:父组件中给子组件标签设置v-model并绑定用于控制子组件显隐的变量。
  • 核心代码:
  1. 父组件:
<!--这里使用v-model,相当于是:value="son_obj.show", @input="son_obj.show = $event.target.value"-->
        <son v-model="son_obj.show"></son>
  1. 子组件:
props: {
        value:{
            type: Boolean,
            default: false
        }
    },
    data(){
        return {
            isShow: false,
        }
    },
    watch:{
        value(bool){
            this.isShow = bool;
        }
    },
    methods: {
        handleClose(){
            this.$emit('input',false)
        }
    }
  • 全部代码:
  1. 父组件:
<template>
    <div class="parent">
        <el-button type="primary" @click="openSon">开启弹窗</el-button>

        <!--这里使用v-model,相当于是:value="son_obj.show", @input="son_obj.show = $event.target.value"-->
        <son v-model="son_obj.show"></son>
    </div>
</template>

<script>
export default {
    name: 'parent',
    components: {
        son: (resolve) => require(["../components/son.vue"], resolve),
    },
    data(){
        return {
            son_obj: {
                show: false
            }
        }
    },
    methods: {
        openSon(){
            this.son_obj.show = true
        }
    }
}
</script>
  1. 子组件:
<template>
    <div class="son">
        <el-dialog
        title="提示"
        :visible.sync="isShow"
        width="30%"
        :before-close="handleClose">
        <span>这是一段信息</span>
        <span slot="footer" class="dialog-footer">
            <el-button @click="handleClose">取 消</el-button>
            <el-button type="primary" @click="handleClose">确 定</el-button>
        </span>
        </el-dialog>
    </div>
</template>

<script>
export default {
    name: 'son',
    props: {
        value:{
            type: Boolean,
            default: false
        }
    },
    data(){
        return {
            isShow: false,
        }
    },
    watch:{
        value(bool){
            this.isShow = bool;
        }
    },
    methods: {
        handleClose(){
            this.$emit('input',false)
        }
    }
}
</script>
  • 效果图:

六. 结语。

以上就是本文的全部内容,通过基础的input案例和父子组件交互案例来诠释了v-model的双向数据绑定实现原理。简而有序,相信能给读者带来清晰明了的知识理解。码字不易,还请各路神仙多多指教。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/409549.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Npm link的作用与使用

一、为什么要用Npm link 库包在开发或迭代后&#xff0c;不适合发布到线上进行调试&#xff08;过程繁琐且会导致版本号膨胀&#xff09; 二、Npm link工作原理 npm link 可以帮助我们模拟包安装后的状态&#xff0c;它会在系统中做一个快捷方式映射&#xff0c;让本地的包就…

前端实战|React18项目启动——pc端极客园项目前置准备

欢迎来到我的博客 📔博主是一名大学在读本科生,主要学习方向是前端。 🍭目前已经更新了【Vue】、【React–从基础到实战】、【TypeScript】等等系列专栏 🛠目前正在学习的是🔥 R e a c t 框架 React框架 Reac

web前端作业--响应式美食菜谱网页设计(HTML+CSS+JavaScript+)实现

原始HTMLCSSJS页面设计, web大学生网页设计作业源码&#xff0c;这是一个不错的美食菜谱网页设计制作&#xff0c;非常适合初学者学习使用。 网页实现截图&#xff1a;文末获取源码 网站首页&#xff1a; 菜谱&#xff1a; 美食达人&#xff1a; 手机版效果&#xff1a; 主要…

echarts如何画地图

前情提要 用echarts画地图的方式有两种 通过真实的地图来画(百度地图、google地图、或者其它某种地图软件)去拿到某块区域的json文件来画第一种方式,可以前往 https://blog.csdn.net/glorydx/article/details/127656301查看具体如何实现 echarts 获取json文件来画地图 如…

Web of science简单使用

下面本人以使用经历简单介绍下该数据库使用&#xff0c;鉴于登录地址/学校端口等原因&#xff0c;页面信息会有出入&#xff0c;有不足之处还望大家多多补充哈&#xff08;o^o&#xff09;&#xff01; 一&#xff0e;登录方式 1.高校官网&#xff08;内网&#xff09;-图书馆…

史上无敌的超级详细的Node Js 环境搭建步骤

今日分享内容 一、Node Js 环境搭建 1、Node.js是什么&#xff1f; 2、npm是什么&#xff1f; 3、环境搭建步骤: 二、Element简介 一、Node Js 环境搭建 1、Node.js是什么&#xff1f; Node.js是一个基于Chrome V8引擎的[JavaScript运行环境]。 Node.js使用了一个事件驱…

前端学习之HTML

目录 1. 什么是HTML&#xff1f; 2. HTML专业的开发工具有哪些&#xff1f; 3. 是谁制定了HTML? 4. HTML的简单特性 5. 基本标签的介绍 6. 表格 7. 表格中单元格的合并 8. 背景颜色和背景图片 9. 图片 10. 超链接 11.列表 12. Form表单*** 1. 什么是HTML&#xff1f…

vue3版本网页小游戏

目录 1.前言 2.实现过程 2.1目录 2.2文件介绍 3.核心逻辑分步骤详解 4.总结 1.前言 最近火爆全网的羊了个羊小程序&#xff0c;背景是根据官方介绍&#xff0c;“羊了个羊”是一款闯关消除小游戏&#xff0c;通关率不到0.1%。主要玩法为重叠的各类方块&#xff0c;需要在…

CSS选择器(nth-child)

:nth-child()这个选择符括号内可以写/- an b &#xff08;a&#xff0c;b均为整数&#xff09;或者关键字 因为工作中有遇到要隐藏列表第三个子元素之后的所有子元素&#xff0c;所以有用到这个选择器&#xff0c;记录一下 (1) nth-child(a) 当括号里只写一个数字&#xff…

元素垂直居中的五种方式

元素内容垂直居中 本文介绍&#xff1a; 元素标签内的内容垂直居中有两种思路&#xff0c; 第一种思路是将元素内容利用行高或者内边距padding属性设置 第二种思路是子盒子在父盒子中垂直居中&#xff0c;利用flex布局或者position定位方式 五种方式实现元素内容垂直居中第一种…

解决echarts报错Cannot read properties of null (reading ‘getAttribute‘)

前言 最近在写 echarts 的时候碰到了这么一个报错&#xff0c;如下图。造成报错的原因是因为 echarts 的图形容器还未生成就对其进行了初始化&#xff0c;下面几种方法是经本人自测最有效的解决方案。 报错截图 解决方案&#xff1a; 1. this.$nextTick 该方法思路是将回调延迟…

Vue|样式绑定

class 与 style 是 HTML 元素的属性&#xff0c;用于设置元素的样式&#xff0c;我们可以用 v-bind 来设置样式属性。Vue.js v-bind 在处理 class 和 style 时&#xff0c; 专门增强了它。表达式的结果类型除了字符串之外&#xff0c;还可以是对象或数组。 文末名片获取源码 精…

【vue 组件化开发 一 】组件基本使用、全局和局部组件、父组件和子组件的区别

目录 前言&#xff1a; 完整内容请关注&#xff1a; 一、组件的基本使用 二、全局组件和局部组件 全局注册&#xff0c;通过 Vue.component 局部注册&#xff0c;通过 components:{} 全局组件 局部组件 三、父组件和子组件的区别 前言&#xff1a; 完整内容请关注&am…

vue2中使用axios,以及axios拦截器的配置

目录 一、vue2项目中如何实现异步请求 1、axios&#xff1a;是一个基于Promise的网络请求库。既可以在node.js&#xff08;服务器端&#xff09;使用&#xff0c;也可以在浏览器端使用 2、vue中的使用方法 ​ &#xff08;2&#xff09;引用方法&#xff1a; ​ A、原生的…

HTML侧边导航栏

HTML侧边导航栏 简介&#xff1a;本文用最简洁的语言&#xff0c;来教会读者&#xff0c;如果用htmlcss来制作&#xff0c;侧边导航栏&#xff0c;本案例以手机商城中的部分为例子来制作。 第一步&#xff1a;构建框架 <body><!-- 首先确定导航栏中的内容 每个内容…

【vue 项目】el-upload 上传文件以及回显照片和下载文件

本次需求是上传多种固定格式的文件&#xff0c;且回显的时候&#xff0c;图片可以正常显示&#xff0c;文件可以进行下载 主要采用element的el-upload组件实现 1、文件上传 先看下&#xff0c;上传文件效果图 点击上传将文件放到网页&#xff0c;还有一个点击确定的按钮再上传…

猿创征文|【Typescript入门】常用数据类型(3)

&#x1f373;作者&#xff1a;贤蛋大眼萌&#xff0c;一名很普通但不想普通的程序媛\color{#FF0000}{贤蛋 大眼萌 &#xff0c;一名很普通但不想普通的程序媛}贤蛋大眼萌&#xff0c;一名很普通但不想普通的程序媛&#x1f933; &#x1f64a;语录&#xff1a;多一些不为什么的…

Vue项目中的接口调用

在企业开发过程中&#xff0c;往往有着明确的前后端的分工&#xff0c;前端负责接收、使用接口&#xff0c;后端负责编写、处理接口。 对于前端如何使用接口&#xff0c;今天在Vue中进行讲解。 一个项目往往由这几个部分组成。 其中在src文件夹中&#xff0c;&#xff0c;有这…

windows系统完全卸载并重装Node(亲测可用)

windows系统完全卸载并重装Node(亲测可用) 完成上述6步之后开始重新下载配置Node 根据自己的需要下载对应版本即可 安装完成查看 查看是否安装成功 A、node -v 查看 node 版本 B、npm -v 查看 npm 版本 2、安装完成后&#xff0c;文件目录如下图 如果 npx 为 5.2.0&#xf…

第十四届蓝桥杯Web应用开发—模拟赛3期--网页PPT--蓝桥校园一卡通--心愿便利贴

文章目录1&#xff1a;网页PPT (5分) ✔✔✔2&#xff1a;蓝桥校园一卡通 &#xff08;10分&#xff09;✔✔✔3&#xff1a;心愿便利贴 (15分) ✔✔✔1&#xff1a;网页PPT (5分) ✔✔✔ switchPage( ) switchPage( ){ if(activeIndex 0 ){$(".btn.left").addClas…