<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
首先我們來看一段程式碼:
<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。根據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
。 子元件想要使用的話,需要定義一個名為value
的prop
才能使用。 而在子元件中更改該值,只需要定義一個函數,有必要的時候執行 this.$emit('input', newValue)
即可。
這裡的newValue
就是$event
。 這樣就可以改變對應的值。 當然除了預設的value
和input
的命名,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-model
的prop
。 然後設定set
。當改變currentValue
的值時,此時就會觸發對應的事件。 當觸發之後父元件中的值就會變化。這就實現了雙向資料繫結。
我們可以看到,其實this.currentValue
的作用就是v-model
操作的語法糖。 它並沒有什麼特別之處,只是將v-model
傳入的資料的存取和更改簡單化了,都集中與一個值this.currentValue
。
以上就是vue原生input輸入框原理剖析的詳細內容,更多關於vue原生input輸入框的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45