国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

利用JS響應(yīng)式修改vue實(shí)現(xiàn)頁面的input值

2019-11-19 10:55:47
字體:
供稿:網(wǎng)友

前言

大部分人在看到這篇文章的標(biāo)題時(shí)第一時(shí)間可能有點(diǎn)懵,我先簡單介紹一下背景:

公司有一個(gè)基于Vue實(shí)現(xiàn)的登錄中心是我負(fù)責(zé)維護(hù)的,頁面上是一個(gè)常規(guī)的登錄界面,用戶名輸入框、密碼輸入框和登錄按鈕各一個(gè)

今天有個(gè)同事(之后簡稱A)過來找我問到這么一個(gè)問題:

他負(fù)責(zé)的應(yīng)用將登錄中心集成到了APP端,他接到的需求是希望在APP端拉起登錄頁面時(shí),自動將用戶帳號和密碼填入,然后自動點(diǎn)擊登錄。

開始正題

我們把登錄頁面簡化成以下代碼

<template> <div> <input name="username" type="text" v-model="account.username"> <input name="password" type="password" v-model="account.password"> <button class="login-button" @click="login">LOGIN</button> </div></template><script>export default { name: 'app', components: { }, data () { return {  account: {  username: '',  password: ''  } } }, methods: { login () {  $ajax({  method: 'POST',  url: '/api/login',  data: this.account  }) } }}</script>

APP端在拉起登錄頁面時(shí),可以傳入js代碼并在當(dāng)前頁面執(zhí)行,拋開MVVM框架Vue的影響,在前端的遠(yuǎn)古時(shí)代這其實(shí)是個(gè)很簡單的問題

const usernameInput = document.querySelector('input[name=username]')const passwordInput = document.querySelector('input[name=password]')const button = document.querySelector('.login-button')usernameInput.value = 'test@dji.com' // 修改用戶名輸入框的值passwordInput.value = 'xxxxxxxx' // 修改密碼輸入框的值button.click() // 觸發(fā)按鈕點(diǎn)擊事件

上面也正是同事A所嘗試的方法,然而他在實(shí)際測試中發(fā)現(xiàn),運(yùn)行js后,雖然頁面上的input框正確變更為修改后的值,但發(fā)起的ajax請求中 username 和 password 均為空字符串,于是將問題反饋到了我這邊

原理

其實(shí)如果對Vue的響應(yīng)式數(shù)據(jù)原理有一定理解的話,就可以很快的想到這個(gè)問題的原因。問題的根源就在 v-model 的原理上:

v-model 其實(shí)是vue為了方便使用提供的一個(gè)語法糖,實(shí)際展開來是這樣子

<input name="username" type="text" :value="account.username" @input="account.username = $event.target.value">

當(dāng)用戶在輸入框輸入時(shí)會觸發(fā)input事件,從而更新 account.username 值

而上一步中使用 document.querySelector('input[name=username]').value = 'test@dji.com' 模擬的輸入行為實(shí)際上并不能觸發(fā) oninput 事件,那么模擬 button 的點(diǎn)擊事件后發(fā)起的 ajax 請求拿到的數(shù)據(jù)自然也就是未修改前的值(即空字符串)

解決方案

弄明白了問題的原理之后,解決方案自然也就很容易想到。既然js模擬輸入無法觸發(fā) oninput 事件,那我們就再進(jìn)一步,在修改完值后用js手動觸發(fā) oninput 事件

實(shí)現(xiàn)代碼如下:

const usernameInput = document.querySelector('input[name=username]')const passwordInput = document.querySelector('input[name=password]')const button = document.querySelector('.login-button')const event = document.createEvent('HTMLEvents')event.initEvent('input', false, true)usernameInput.value = 'test@dji.com' // 修改用戶名輸入框的值usernameInput.dispatchEvent(event) // 手動觸發(fā)輸入框的input事件passwordInput.value = 'xxxxxxxx' // 修改密碼輸入框的值passwordInput.dispatchEvent(event) // 手動觸發(fā)輸入框的input事件button.click() // 觸發(fā)按鈕點(diǎn)擊事件

以上代碼未考慮兼容性、代碼封裝等問題,僅提供解決思路的參考

寫在最后

其實(shí)問題說不上多難,但是對于很多學(xué)習(xí)知識時(shí)只是淺嘗輒止的同學(xué),很可能會是個(gè)不小的麻煩。平時(shí)經(jīng)常能聽到一些 框架會用就行了,原理什么的也就應(yīng)付一下面試,工作壓根用不到 之類的言論,希望大家可以在日趨浮躁的大環(huán)境下,守住極客精神,認(rèn)真鉆研技術(shù),做一個(gè)真正的程序員,而不僅僅只是個(gè)搬磚的。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對武林網(wǎng)的支持。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 墨竹工卡县| 五大连池市| 河东区| 福鼎市| 兴安盟| 图木舒克市| 木里| 巴南区| 北安市| 松溪县| 武功县| 磐石市| 伊吾县| 方城县| 泸溪县| 贺州市| 五台县| 镇平县| 博客| 叙永县| 丰城市| 体育| 巴南区| 高碑店市| 新绛县| 邹平县| 策勒县| 田东县| 元阳县| 托克逊县| 武汉市| 汶上县| 瑞金市| 扬中市| 江源县| 仲巴县| 额敏县| 平乡县| 金坛市| 通许县| 通许县|