JS响应式修改基于vue实现的页面的input值

大部分人在看到这篇文章的标题时第一时间可能有点懵,我先简单介绍一下背景:

公司有一个基于Vue实现的登录中心是我负责维护的,页面上是一个常规的登录界面,用户名输入框、密码输入框和登录按钮各一个
今天有个同事(之后简称A)过来找我问到这么一个问题:
他负责的应用将登录中心集成到了APP端,他接到的需求是希望在APP端拉起登录页面时,自动将用户帐号和密码填入,然后自动点击登录。

我们把登录页面简化成以下代码

<span class="hljs-tag"><<span class="hljs-name">template>
  <span class="hljs-tag"><<span class="hljs-name">div>
    <span class="hljs-tag"><<span class="hljs-name">input <span class="hljs-attr">name=<span class="hljs-string">"username" <span class="hljs-attr">type=<span class="hljs-string">"text" <span class="hljs-attr">v-model=<span class="hljs-string">"account.username">
    <span class="hljs-tag"><<span class="hljs-name">input <span class="hljs-attr">name=<span class="hljs-string">"password" <span class="hljs-attr">type=<span class="hljs-string">"password" <span class="hljs-attr">v-model=<span class="hljs-string">"account.password">
    <span class="hljs-tag"><<span class="hljs-name">button <span class="hljs-attr">class=<span class="hljs-string">"login-button" @<span class="hljs-attr">click=<span class="hljs-string">"login">LOGIN<span class="hljs-tag">button>
  <span class="hljs-tag">div>
<span class="hljs-tag">template>

<span class="hljs-tag"><<span class="hljs-name">script><span class="javascript">
<span class="hljs-keyword">export <span class="hljs-keyword">default {
  <span class="hljs-attr">name: <span class="hljs-string">'app',
  <span class="hljs-attr">components: {
  },
  data () {
    <span class="hljs-keyword">return {
      <span class="hljs-attr">account: {
        <span class="hljs-attr">username: <span class="hljs-string">'',
        <span class="hljs-attr">password: <span class="hljs-string">''
      }
    }
  },
  <span class="hljs-attr">methods: {
    login () {
      $ajax({
        <span class="hljs-attr">method: <span class="hljs-string">'POST',
        <span class="hljs-attr">url: <span class="hljs-string">'/api/login',
        <span class="hljs-attr">data: <span class="hljs-keyword">this.account
      })
    }
  }
}
<span class="hljs-tag">script>
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

APP端在拉起登录页面时,可以传入js代码并在当前页面执行,抛开MVVM框架Vue的影响,在前端的远古时代这其实是个很简单的问题

<span class="hljs-keyword">const usernameInput = <span class="hljs-built_in">document.querySelector(<span class="hljs-string">'input[name=username]')
<span class="hljs-keyword">const passwordInput = <span class="hljs-built_in">document.querySelector(<span class="hljs-string">'input[name=password]')
<span class="hljs-keyword">const button = <span class="hljs-built_in">document.querySelector(<span class="hljs-string">'.login-button')

usernameInput.value = <span class="hljs-string">'test@dji.com' </span></span></span></span></span></span></span></span></span></span>

上面也正是同事A所尝试的方法,然而他在实际测试中发现,运行js后,虽然页面上的input框正确变更为修改后的值,但发起的ajax请求中 usernamepassword 均为空字符串,于是将问题反馈到了我这边

其实如果对Vue的响应式数据原理有一定理解的话,就可以很快的想到这个问题的原因。问题的根源就在 v-model 的原理上:

v-model 其实是vue为了方便使用提供的一个语法糖,实际展开来是这样子

<input name="<span" class="hljs-string">"username" <span class="hljs-built_in">type=<span class="hljs-string">"text" :value=<span class="hljs-string">"account.username" @input=<span class="hljs-string">"account.username = <span class="hljs-variable">$event.target.value">
</span></span></span></span></span>

当用户在输入框输入时会触发input事件,从而更新 account.username

而上一步中使用

<span class="hljs-built_in">document.querySelector(<span class="hljs-string">'input[name=username]').value = <span class="hljs-string">'test@dji.com'
</span></span></span>

模拟的输入行为实际上并不能触发 oninput 事件,那么模拟 button 的点击事件后发起的 ajax 请求拿到的数据自然也就是未修改前的值(即空字符串)

弄明白了问题的原理之后,解决方案自然也就很容易想到。既然js模拟输入无法触发 oninput 事件,那我们就再进一步,在修改完值后用js手动触发 oninput 事件

实现代码如下:

<span class="hljs-keyword">const usernameInput = <span class="hljs-built_in">document.querySelector(<span class="hljs-string">'input[name=username]')
<span class="hljs-keyword">const passwordInput = <span class="hljs-built_in">document.querySelector(<span class="hljs-string">'input[name=password]')
<span class="hljs-keyword">const button = <span class="hljs-built_in">document.querySelector(<span class="hljs-string">'.login-button')

<span class="hljs-keyword">const event = <span class="hljs-built_in">document.createEvent(<span class="hljs-string">'HTMLEvents')
event.initEvent(<span class="hljs-string">'input', <span class="hljs-literal">false, <span class="hljs-literal">true)

usernameInput.value = <span class="hljs-string">'test@dji.com' </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

以上代码未考虑兼容性、代码封装等问题,仅提供解决思路的参考

其实问题说不上多难,但是对于很多学习知识时只是浅尝辄止的同学,很可能会是个不小的麻烦。平时经常能听到一些 &#x6846;&#x67B6;&#x4F1A;&#x7528;&#x5C31;&#x884C;&#x4E86;&#xFF0C;&#x539F;&#x7406;&#x4EC0;&#x4E48;&#x7684;&#x4E5F;&#x5C31;&#x5E94;&#x4ED8;&#x4E00;&#x4E0B;&#x9762;&#x8BD5;&#xFF0C;&#x5DE5;&#x4F5C;&#x538B;&#x6839;&#x7528;&#x4E0D;&#x5230; 之类的言论,希望大家可以在日趋浮躁的大环境下,守住极客精神,认真钻研技术,做一个真正的程序员,而不仅仅只是个搬砖的。

Original: https://www.cnblogs.com/waw/p/15531898.html
Author: 狼人:-)
Title: JS响应式修改基于vue实现的页面的input值

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/546216/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 钓鱼邮件

    最近收到的一些 钓鱼邮件,分享一下 备案钓鱼邮件 财务部钓鱼邮件: 补贴页面有二维码 ,扫描后需要输入 银行卡账号&密码 OA邮箱升级钓鱼 这些邮件大多是,为了骗取你的账号…

    技术杂谈 2023年5月31日
    088
  • 如何使能TF-A的调试开关?

    答: 编译时指定DEBUG=1,示例如下:$ make .. DEBUG=1 .. (..表示其它参数) Original: https://www.cnblogs.com/dak…

    技术杂谈 2023年5月31日
    070
  • C#调用C++dll,传指针释放内存问题

    一、传入dll前,在C#中申请内存空间 c#里面的指针即 IntPtr 申请如下: 这种需要提前知道空间大小,否则无法确定空间大小,会导致dll内部处理时越界报错。 c#里面申请空…

    技术杂谈 2023年7月24日
    074
  • 腾讯社会招聘内推(长期有效)

    一、内推方式 扫描以下图二维码,选择自己想要投递的岗位直接投递,即可以博主名义进行内推。 如以上二维码过期可添加博主微信,寻求新的内推链接: 二、投递建议 一是工作年限/学历/证书…

    技术杂谈 2023年5月31日
    098
  • 这样配置,让你的VS Code好用到飞起!

    「来源: |Vue中文社区 ID:vue_fe」 基本插件 这个部分介绍一些必装的开发插件,帮你大大提升代码编辑效率。 Chinese(Simplified) Language P…

    技术杂谈 2023年5月31日
    088
  • mean-shift算法详解(转)

    MeanShift最初由Fukunaga和Hostetler在1975年提出,但是一直到2000左右这篇PAMI的论文Mean Shift: A Robust Approach T…

    技术杂谈 2023年6月1日
    084
  • MyBatis快速上手与知识点总结

    1、MyBatis概述 1.1 MyBatis概述 1.2 JDBC缺点 1.3 MyBatis优化 2、MyBatis快速入门 3、Mapper代理开发 3.1 Mapper代理…

    技术杂谈 2023年7月24日
    073
  • python练习题:利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法

    方法一: 方法二: (此方法会有一个问题,当字符串仅仅是一个空格时’ ‘,会返回return s[1:0];虽然不会报错,但是会比较奇怪。测试了下,当s=&…

    技术杂谈 2023年7月24日
    082
  • python 对潜在客户数据集 进行数据分析

    大家好,我是小寒。 今天给大家带来一篇 探索性数据分析(EDA) 案例分享。如果觉得不错,可以多多分享。 什么是探索性数据分析 探索性数据分析 (EDA) 是任何数据科学或数据分析…

    技术杂谈 2023年7月25日
    077
  • 【考研】C语言

    考研C语言 收录数据结构会用到的C语言知识,建议有基础的情况下再学习,针对性学习即可。 往后的学习要多从内存角度去学习计算机的知识 1. 数组 1.1 一维数值数组 具备相同的数据…

    技术杂谈 2023年7月10日
    074
  • Locationhttpd反向代理

    Location\httpd\反向代理 参考:http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_core_mod…

    技术杂谈 2023年7月11日
    054
  • 华为学习笔记一初识VRP

    VRP简介 VRP是Versatile Routing Platform的简称,是华为公司从低端到高端的全系列路由器、交换机等数据通信产品的通用网络操作系统。华为网络设备功能的配置…

    技术杂谈 2023年7月11日
    071
  • Flink学习笔记(整理)

    Fink简介 简单入门 Flink安装部署 Standalone模式 Yarn模式 Kubernetes部署 Flink运行架构 运行时四大组件 任务提交流程 任务调度原理 Fli…

    技术杂谈 2023年7月11日
    064
  • mysql踩坑(二)-字符集与排序规则

    字符集 mysql数据库支持多种字符集,并且在支持服务器、数据库、表、列和字符串常量等不同层次单独指定字符集。 查看字符集 查看服务器的默认字符集 show variables l…

    技术杂谈 2023年7月24日
    0104
  • Map–部分方法

    1.Map.values()方法:获取Map集合中的所有键值对象 获取 Map 集合中的所有键值对象,这些键值对象将存放在另一个集合对象中 2.getOrDefault() 方法 …

    技术杂谈 2023年7月24日
    080
  • 动手搭建ServerLess服务

    一、前言 ​ 通常我们在做ServerLess的时候会想到用各种云的Faas服务,比如腾讯云,AWS,阿里云等等。但我们很少去研究自己怎么搭建一个ServerLess服务。本篇文章…

    技术杂谈 2023年5月31日
    0111
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球