您好,登錄后才能下訂單哦!
這篇“vue2怎么封裝input組件”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“vue2怎么封裝input組件”文章吧。
首先我們要明白 vue中v-modle 的對于input 做了什么
<input type="text" v-model="username"> <input type="text" :value="username" @input="username = $event.target.value">
以上的兩行代碼,所呈現的效果是一樣的。也就是說: v-model=“username” 在input中做了兩件事情。
:value 綁定了值
@input=“username = $event.target.value” 監聽了值的改變
代碼示例:
父組件
<template> <div id="app"> <lj-input placeholder="請輸入" v-model="username"></lj-input> <div>{{username}}</div> </div> </template> <script> import ljInput from './components/inputCom/LjInput.vue' export default { name: 'App', components: { ljInput }, data(){ return{ username:'', } }, methods: { } } </script>
子組件
<template> <div class="lj-input"> <input :class="{'is-disabled':disabled}" :placeholder="placeholder" :type="type" :disabled ='disabled' :value="value" @input="handleInput" > </div> </template> <script> export default { name:'ljInput', props: { placeholder:{ type:String, default:'' }, type:{ type:String, default:'' }, disabled:{ type:Boolean, default:false }, value:{ type:String, default:'' } }, methods:{ handleInput(e){ // 這句代碼是關鍵 this.$emit('input',e.target.value) } } } </script> <style> .is-disabled{ cursor: not-allowed; } </style>
下面就是自己封裝input 框實現的效果
在看如何封裝之前,先來了解一下v-model是怎么回事。
其實說白了,v-model就是change和value的結合體。
廢話不多說,下面就來看一下在vue中如何封裝自定義的input組件。
<template> <input type="text" :value="value" @input="handleChange" /> </template> <script> export default { name: "AppInput", model: { prop: "value", event: "change", }, props: { value: "", }, data() { return { }; }, created() {}, mounted() {}, methods: { handleChange(e) { this.$emit("change", e.target.value); }, }, }; </script>
<template> <!-- 對el-input進行了包裝--> <div> <el-input v-model="localValue" @change="$emit('change', $event)"></el-input> <!-- el-input提供了input事件,讓我們感知el-input內部原生input值的變化,通過$event可以獲取到具體的值 通過emit再次傳遞給父組件一個input事件,父組件中,v-on:input="searchText = $event"這句就能正常使用了 --> <span ></span> </div> </template> <script> export default { name: "input-name", props: { // 保證父組件中,v-bind:value可以正常設置值 value: [String], }, data() { return { // 獲取props中value的值,并與el-input綁定,過程中不修改props中value的值,保證了單向數據流原則 localValue: this.value } } } </script> <style lang="less" scoped> </style>
上面的那種方式會在回顯數據時有問題。解決辦法就是:如果出現異步回顯數據那么就需要用計算來作為中間值轉換。
<template> <!-- 對el-input進行了包裝--> <div> <el-input v-model="localValue" @change="$emit('change', $event)"></el-input> <!-- el-input提供了input事件,讓我們感知el-input內部原生input值的變化,通過$event可以獲取到具體的值 通過emit再次傳遞給父組件一個input事件,父組件中,v-on:input="searchText = $event"這句就能正常使用了 --> <span ></span> </div> </template> <script> export default { name: "input-name", props: { // 保證父組件中,v-bind:value可以正常設置值 value: [String], }, data() { return { } }, computed: { localValue: { get: function () { console.log(this.value) return this.value; }, set: function (v) { v; }, }, }, } </script> <style lang="less" scoped> </style>
這種方式更加簡潔,并且不會出現第二種封裝方式出現的bug。
<template> //這里不能使用v-model,會報子組件不能直接操作父組件傳入參數的錯誤 //使用value的話其實就是做一個回顯因為外層的v-model在這里使用已經改變了外層的值了 <el-input v-bind="$attrs" v-on="$listeners" :value="value" ></el-input> </template> <script> export default { name: "f-input", data() { return { }; }, props: { value:"" }, created() {}, mounted() {}, methods: {} }; </script>
//正常的使用方式 <f-input v-model="number"></f-input> //不用v-model語法糖的方式 <f-input :value="number" @change="number = $event,target.value"></f-input>
這里核心用到了兩個方法 attrs 和 listeners 其中 atters 可以把父組件標簽上的所有自定義屬性(不包括props,tyle,class)同步到當前元素中,listeners 可以把 f-input 標簽上的所有方法同步到子組件中當前元素中。
那么上面已經知道 v-model 就是 change 和 value 的語法糖,那在 f-input 上綁定 listeners 就可以讀取到 f-input 的 v-model 的 change 事件,atters 可以讀取到 f-input 的 v-model 的 value 值。
$ 符號打不出來了,將就著看吧。如果還是不明白 atters和 listeners是怎么回事的可以看一下vue官網中的介紹。
看官網又出了一種封裝的寫法,感覺挺有意思,在這里記錄一下。
默認情況下,組件上的 v-model 使用 modelValue 作為 prop 和 update:modelValue 作為事件。我們可以通過向 v-model 傳遞參數來修改這些名稱
子組件將需要一個 firstName prop 和 lastName prop并發出 update:firstName 和 update:lastName要同步的事件
var Component = { props: { firstName: String, lastName: String }, emits: ['update:firstName', 'update:lastName'], //vue3可以支持多個根元素,所有這個地方不會有報錯,vue2是會報錯的。 template: ` <input type="text" :value="firstName" @input="$emit('update:firstName', $event.target.value)"> <input type="text" :value="lastName" @input="$emit('update:lastName', $event.target.value)"> ` }
<template> <my-component v-model:first-name="firstName" v-model:last-name="lastName"> </my-component> firstName:{{firstName}} lastName:{{lastName}} </template> <script> const App = { setup(props, context) { const data= reactive({ firstName: 0, lastName: 0, }); return { ...toRefs(data), } }, components: { 'my-component': Component, }, methods: { }, }; const app = createApp(App).mount('#app'); </script>
以上就是關于“vue2怎么封裝input組件”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。