中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue2怎么封裝input組件

發布時間:2023-04-26 15:12:15 來源:億速云 閱讀:132 作者:iii 欄目:開發技術

這篇“vue2怎么封裝input組件”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“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>

    vue二次封裝input的幾種方式

    下面就是自己封裝input 框實現的效果

    vue2怎么封裝input組件

    在看如何封裝之前,先來了解一下v-model是怎么回事。

    vue2怎么封裝input組件

    其實說白了,v-model就是change和value的結合體。

    廢話不多說,下面就來看一下在vue中如何封裝自定義的input組件。

    封裝原生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>

    封裝el-input

    <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>

    VUE高級用法封裝input

    這種方式更加簡潔,并且不會出現第二種封裝方式出現的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官網中的介紹。

    vue2怎么封裝input組件

    看官網又出了一種封裝的寫法,感覺挺有意思,在這里記錄一下。

    默認情況下,組件上的 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組件”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    耒阳市| 白玉县| 乐山市| 林周县| 富蕴县| 玛多县| 宝山区| 新兴县| 平谷区| 宁城县| 辽宁省| 永平县| 台江县| 宣威市| 梓潼县| 南江县| 广东省| 封开县| 祁东县| 定陶县| 繁昌县| 贡山| 巴青县| 光山县| 莱芜市| 广平县| 澄城县| 崇信县| 新野县| 西乌| 濮阳县| 临潭县| 凤台县| 汝阳县| 丹寨县| 岫岩| 长丰县| 南城县| 宝坻区| 环江| 哈尔滨市|