vue原生input输入框原理剖析

目录
  • 正文
  • v-model

正文

首先我们来看一段代码:

<input value="value">

这里是一个原生的input输入框,每一个原生的输入框都会有一个value的属性来用于存储用于输入的最新的数据。

如果我们想要获取到这个值我们可以通过input.target.value或者通过$event.target.value来获取这个存储的值。

只要用户输入了数据,那么此时input标签就会将输入的数据放到这个value中(新数据会覆盖旧数据,所以我们获取到的都是最新的)。

现在我们来看上面的标签,我们为input标签添加了一个value属性,并且赋值'value'。其实在标签上设置value属性它的作用有两个:

  • 在第一次创建input标签的时候,将对应的初始值展示到输入框中 (在无该属性使输入框不展示任何数据)
  • 使用value属性的初始值来初始化input.target.value(无该属性时input.target.value为空串)

上面的那段代码的意思是通过添加value="value"属性,初始化input.target.value的值并且将初始值展示到对应的输入框中

这里需要注明一点,在后续用户输入的操作中,输入框中的数据只是方便让用户看到自己输入了什么仅此而已。 有人可以会有疑问,难道不是input.target.value里是什么所以输入框内就显示什么吗?其实不是的。

输入框显示什么和 input.target.value并没有直接联系,输入框内的显示只是方便用户自己看到自己输入了什么。

小结:

input中的value有两种:value="xxx"input.target.value 我们需要知道两个分别有什么作用。在整个输入显示流程中, 他们分别扮演什么角色。

现在我们来看在vue中的输入框,首先我们来看一段代码:

<input
   v-bind:value
   @input="value = $event.target.value"
/>
data(){
    return {
          value:'123'
    }
}

我们一般使用v-bind:value来给Input标签绑定一个vue中的的,这里我们绑定的是this.value。 在这里v-bind:value === :value="value"。 这样实现的原理比较简单。

首先我们定义了this.value因为将this.value绑定到了:value上,所以初始时会在输入框展示我们指定的 值,即'123'。当我们输入数据之后,此时$envet.target.value(这里的$event.target.value就是input.target.value)就会存储我们最新的输入的值,然后将最新的值赋值给this.value

因为this.value变化了,此时vue对页面进行更新,此时更新后的input:value是最新值。

但是这里有一个问题,那就是<input>并不会被销毁重建,也就是说this.value = $event.target.value只是改变了this.value 若别的地方引用了this.value,那么就会同步改变。那么this.value的更新对:value="value"的影响是什么呢?其实没有什么影响。

因为我们前面说了,:value的作用有两个:一是初始化input.value的值,二是将初始值渲染到对应的输入框中。 在一开始将this.value作为初始值给Input.value和展示在框里,他的任务已经完成了,后续的更改对:value没有一点关系。

其实:value="value"的唯一作用就是将this.value作为初始值绑定和展示到input上。

v-model

现在对于原始元素进行算双向数据绑定已经完成。那么如何实现父组件和子组件之间的双向数据绑定嗯? 此时我们需要在子组件中使用v-model。 关于 v-model 的使用这里不再赘述。这里只讨论如何在自定义组件实现 v-model。根据vue 的官网的描述,我们大概知道,v-model 的本质就是语法糖,即:

<input type="text" v-model="name">
相当于:
<input type="text" :value="name" @input="name = $event.target.value">

vue监听输入框输入行为然后改变对应的值。 如果对子组件进行双向数据绑定该如何实现呢?这里的双向数据绑定指的是父组件将值传递给子组件使用,并且子组件可以改变父组件的值 其实上述的双向绑定可以通过v-bind:propName.sync = 'xxx'来实现。 除了以上的方式,并且Vue还给我们提供了另一种方式:

<!-- 父组件.vue -->
<child-component :propName="data" @change="change" />
export default {
    data(){
     data:'123'
  },
  methods:{
     change(value){
        this.data = value
     }
  }
}
//在组件中如何想要改变父组件的值,那么直接出发对应的事件即可:
this.$emit('change', newValue )

vue中,它将上述的方法进行了简化,我们可以使用v-model来对子组件进行双向数据绑定。例如:

<child-component v-model="pageTitle" />
<!-- 是以下的简写: -->
<child-component :value="pageTitle" @input="pageTitle = $event" />

在默认情况下v-model的触发事件名称为input。 子组件想要使用的话,需要定义一个名为valueprop才能使用。 而在子组件中更改该值,只需要定义一个函数,有必要的时候执行 this.$emit('input', newValue) 即可。

这里的newValue就是$event。 这样就可以改变对应的值。 当然除了默认的valueinput的命名,vue还给我们提过了更加灵活的方式。

<!-- 父组件 -->
<child-component v-model="pageTitle" />
//子组件
export default {
  model: {
    prop: 'title', //这里相当于别名,这里可以起其他名称
    event: 'change' //这里相当于事件的别名,这里可以起其他名称
  },
  props: {
    // 这将允许 `value` 属性用于其他用途
    value: String,
    // 使用 `title` 代替 `value` 作为 model 的 prop
    title: {
      type: String,
      default: 'Default title'
    }
  }
}

当我们想在子组件中改变传入的值,那么直接可以this.$emit('change', newValue)

所以,在这个例子中 v-model 是以下的简写:

<child-component :title="pageTitle" @change="pageTitle = $event" />

其实本质上,项目中的twowayFactor这个混入配置类,他本质上就是做了上面的操作。

  @Prop()
  @Model('valueChanged')
      bindValue!: T;

这样做的目的是将v-model传入的prop改为bindValue。 然后将默认事件的名称从input改为了valueChange。 接着设置get/set

        get currentValue() {
            return this.bindValue;
        }
        set currentValue(value) {
            this.$emit('valueChanged', value);
        }

这样做的目的是数据本地化。 在组件内部定义一个currentValue 然后为该值设置get,当访问currentValue等价于访问v-modelprop。 然后设置set。当改变currentValue的值时,此时就会触发对应的事件。 当触发之后父组件中的值就会变化。这就实现了双向数据绑定。

我们可以看到,其实this.currentValue的作用就是v-model操作的语法糖。 它并没有什么特别之处,只是将v-model传入的数据的访问和更改简单化了,都集中与一个值this.currentValue

以上就是vue原生input输入框原理剖析的详细内容,更多关于vue原生input输入框的资料请关注我们其它相关文章!

(0)

相关推荐

  • vue中监听input框获取焦点及失去焦点的问题

    目录 一.背景 二.首先是正宗的监听事件的写法 1.html代码 2.JS部分 三.为什么上次监听焦点事件失败呢 1.不好用的原因 2.新增指令的方法 一.背景 博主之前在用vue的获取焦点,失去焦点的时候,出现了@blur和@focus无效的情况.当时百思不得其解.今天又在写vue页面的时候,突然@blur和@focus又好用了.emmmm,看来这部分值得一战. 二.首先是正宗的监听事件的写法 1.html代码 //这是html的输入框.定义了一个获取焦点,失去焦点的方法 <input pla

  • Vue中input被赋值后,无法再修改编辑的问题及解决

    目录 input被赋值后,无法再修改编辑 我们直入主题 方法一 方法二 vue综合问题归纳input框赋值后不能进行编辑 项目场景 问题描述 原因分析 解决方案 input被赋值后,无法再修改编辑 我们直入主题 上面是我司的业务逻辑图,使用elementui框架,如图,请求数据赋值后,不仅有检测报错信息,而且还有无法修改编辑的问题. 起初以为是我的设置的对象问题,困扰我许久. 后来,翻阅了大佬的文章才了解. <el-form ref="formInline" :inline=&q

  • vue中的input框点击后不聚焦问题

    目录 input框点击后不聚焦问题 vue input聚焦的坑 点击按钮,使某个input框聚焦 加载页面时自动聚焦 [坑] input框点击后不聚焦问题 废话不多说直接上代码 哪个地方要写input框  就直接把这一部分代码放上   里面双向绑定的值和事件换上自己定义的  <div class="item" @click.stop.prevent="inputPaentClick('input1')">         <input      

  • vue3简单封装input组件和统一表单数据详解

    目录 前言 准备工作 用原生 input 封装 Input 封装表单数据 使用表单数据 总结 前言 vue3 支持用 jsx 实现组件,摆脱了 vue 文件式的组件,不再需要额外的指令,写法非常接近 React,减少记忆负担. 本文简单的练习,用 vue3 组件封装 input 组件和统一表单数据. 准备工作 用vue create example创建项目,参数大概如下: 用原生 input 原生的 input,主要是 value 和 change,数据在 change 的时候需要同步. App

  • vue中如何禁止input框和textarea编辑

    目录 如何禁止input框和textarea编辑 第一种方法 第二种方法 说说input无法输入原因 如何禁止input框和textarea编辑 在我们开发项目的时候,有时候我们不希望用户对我们的页面进行操作,尤其是输入框之类的,这时候我们需要设置一下 第一种方法 <input type="text" v-model="ConList.title" style="width: 100%;outline: none;height: 100%"

  • Vue使用antd中input组件去验证输入框输入内容(rules 案例)

    目录 效果图 示例代码 效果图 示例代码 <a-form-model-item prop="phone"> <a-input v-model="form.phone" :maxLength="11" placeholder="手机号" /> </a-form-model-item> <a-form-model-item prop="code"> <a-i

  • vue原生input输入框原理剖析

    目录 正文 v-model 正文 首先我们来看一段代码: <input value="value"> 这里是一个原生的input输入框,每一个原生的输入框都会有一个value的属性来用于存储用于输入的最新的数据. 如果我们想要获取到这个值我们可以通过input.target.value或者通过$event.target.value来获取这个存储的值. 只要用户输入了数据,那么此时input标签就会将输入的数据放到这个value中(新数据会覆盖旧数据,所以我们获取到的都是最新

  • vue实现Input输入框模糊查询方法

    本文实例为大家分享了vue实现Input输入框模糊查询方法的具体代码,供大家参考,具体内容如下 原理:原生js的indexOf() 方法,该方法将从头到尾地检索数组,看它是否含有对应的元素.开始检索的位置在数组 start 处或数组的开头(没有指定 start 参数时).如果找到一个 item,则返回 item 的第一次出现的位置.开始位置的索引为 0. 如果在数组中没找到指定元素则返回 -1. 下面先看示例: 搜索前: 搜索后: 实现方法: methods:{ // 点击搜索工程 search

  • 解决vue项目input输入框双向绑定数据不实时生效问题

    我就废话不多说了,大家还是直接看代码吧~ <input type="text" maxlength="11" placeholder="请输入联系人电话" v-model="form.phone" /> 这样的输入框,绑定的是data中的form对象上的phone字段. 在mounted钩子函数里边写: this.form.phone = '1888888888'; 这样在页面上时候不会随着输入框值改变而改变. 解

  • vue input输入框关键字筛选检索列表数据展示

    想必大家在项目开发中难免会用到关键字筛选的功能,正好这次项目有需求要做这一块,就整理一下vue的input输入框输入关键字检索数据列表的代码.下面直接上代码: html: <!-- 筛选demo --> <template> <div> <input type="text" v-model="search"> <ul> <!-- 注意!注意!注意!这里循环遍历的是items,不再是data里的list

  • vue表单验证之禁止input输入框输入空格

    测试小姐姐让输入框不允许输入空格,安排. 刚开始用的下面这个方法,因为我是电脑端f12的情况下调试移动端,所以下面这个方法可以实现禁止输入空格,于是就打包测试上线了,上线后才发现真机中不支持,应该是pc端和移动端事件不一样,所以如果你是pc端,可以使用下面这个方法. input上添加下方代码(我用的vant也一样,包括elemenui等) @keydown.native="keydown($event)" methods中写入下方代码 methods:{ // 禁止输入空格 keydo

  • vue input输入框模糊查询的示例代码

    Vue 模糊查询功能 原理:原生js的search() 方法,用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串.如果没有找到任何匹配的子串,则返回 -1. input输入框,模糊查询 <template> <div> <input type="text" placeholder="请输入..." v-model="searchVal"> <ul> <li v-for=&quo

  • Vue原理剖析 实现双向绑定MVVM

    本文能帮你做什么? 1.了解vue的双向数据绑定原理以及核心代码模块 2.缓解好奇心的同时了解如何实现双向绑定 为了便于说明原理与实现,本文相关代码主要摘自vue源码, 并进行了简化改造,相对较简陋,并未考虑到数组的处理.数据的循环依赖等,也难免存在一些问题,欢迎大家指正.不过这些并不会影响大家的阅读和理解,相信看完本文后对大家在阅读vue源码的时候会更有帮助< 本文所有相关代码均在github上面可找到 https://github.com/DMQ/mvvm 相信大家对mvvm双向绑定应该都不

  • vue element-ui实现input输入框金额数字添加千分位

    在util.js中定义方法 包含金额添加过滤千分位,验证金额格式等 const MoneyTest = /((^[1-9]\d*)|^0)(\.\d{0,2}){0,1}$/; // 金额添加千分位 const comdify = function (n) { if(!n) return n; let str = n.split('.'); let re = /\d{1,3}(?=(\d{3})+$)/g; let n1 = str[0].replace(re, "$&,");

  • 一起来看看Vue的核心原理剖析

    目录 前言: 学习目标: Object.defineProperty get.set 数据反应到视图 视图的变化反映到数据 M -> V V -> M 优化工作: 总结 前言: 相信大家阅读过很多关于Vue2的文章,我也阅读过很多,但是大部分文章介绍的都是如何在项目中进行应用,技术点如果使用,功能如何实现: 今天小编为大家带来这篇Vue2的核心原理剖析就是为大家介绍我们常用的Vue2他是如何实现的核心内容,我们简单代码的背后究竟他做了哪些,让大家能够 知其然,知其所以然 学习目标: 了解Obj

  • 解决Vue input输入框卡死的问题

    原因 我把 vuex 全局变量 $store.state.search.key 绑定到 v-model 上,然后在页面挂载时通过代码修改 $store.state.search.key 的值,最后在页面上输入任意值 input 框就卡住了 解决方法 1.input 标签增加 @input 属性 <input v-model='$store.state.search.key' @input="forceUpdateInput"> 2.methods 中增加对应方法 force

随机推荐