最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue自定義組件實現(xiàn)v-model雙向綁定數(shù)據(jù)的實例代碼

 更新時間:2021年10月08日 10:13:44   作者:折月  
vue中父子組件通信,都是單項的,直接在子組件中修改prop傳的值vue也會給出一個警告,接下來就用一個小列子一步一步實現(xiàn)了vue自定義的組件實現(xiàn)v-model雙向綁定,需要的朋友可以參考下

項目中會遇到自定義公共組件供項目調(diào)用,正常情況可以使用 props定義參數(shù)接收父組件傳的參數(shù),然后通過子組件的$emits()方法回傳數(shù)據(jù)給父組件。

類似如下:

父組件

<common-checkbox :checked="goodsSelected" class="left" :height="'16px'" :width="'16px'"  @checkChange="checkChange"></common-checkbox>

     /**
     * 接收子組件回傳進行處理
     */
    checkChange(value) {
      this.goodsSelected=value//子組件數(shù)據(jù)賦值給父組件
    }

子組件

    /**
     * 切換選中回傳
     */
    toggleCheck(value) {
      this.$emit('changeCheck', value)//回傳方法,把子組件變化后的數(shù)據(jù)回傳給父組件處理
    }

但是這種寫法需要調(diào)用公共組件的頁面額外寫處理的方法,而且顯得太low,我們可不可以像是框架自帶的公共組件一樣去聲明直接v-model雙向綁定呢?接下來提供項目中實際遇到這種情況的處理方法

第一種方式:

正常情況下當你在父組件里給子組件綁定 v-model屬性時,子組件中會默認的將 v-model綁定的數(shù)據(jù),付給子組件 名為 value的props屬性,value依然需要提前在子組件props中聲明,否則接收不到。

當 value修改后,并不會立即雙向回傳給父組件。如果想回傳實現(xiàn)同步更新父組件的v-model需要如下操作

 this.$emit('input', value) 

當未聲明雙向綁定回傳的事件時,默認通過input事件回傳,為什么說 “當未聲明雙向綁定回傳的事件”,這個便是第二種方式,下面會講到。

簡單來說,第一種方式的實現(xiàn),首先是v-model綁定父組件數(shù)據(jù) ,然后子組件value 的props屬性自動接收,最后當數(shù)據(jù)更改后調(diào)用this.$emit('input', value) 回傳父組件,這樣父組件不需要額外實現(xiàn)子組件的回傳就可以實現(xiàn)雙向綁定

第二種方式:

前面提到 “當未聲明雙向綁定回傳的事件” 默認使用 input回傳,既然這樣說了那就存在,如果我不用input呢?這就需要了解vue的一個特殊的屬性:model,這個屬性可以用來聲明 子組件用哪個字段去接收雙向綁定的數(shù)據(jù),以及用哪個方法回調(diào)更新父組件v-model的數(shù)據(jù),寫法如下:

export default {
  name: 'CommonCkeckBox',
  model: {
    prop: 'checked',
    event: 'changeCheck'
  },
    props: {
    checked: {
      type: Boolean,
      default: false,
    }, // 選中狀態(tài)
  }
  }

這種寫法就意味著,父組件 雙向綁定的數(shù)據(jù)會綁定到子組件名為checked的props屬性,并且,當子組件調(diào)用this.$emit('changeCheck', value)時,會同步的更新父組件的數(shù)據(jù),實現(xiàn)雙向綁定。

接下來附一段自定義checkbox的代碼以作參考:

<template>
<div class="check-box-container"  @click="toggleCheck()" :style="{width:width,height:height}">
        <div class="checkbox-icon">
              <!-- 三種狀態(tài) 選中  未選  禁用 -->
              <img alt :src="`${$cdnImageUrl}/cart/icon-selected.png`" :width="width" :height="height" key="select" v-if="checked&&!disabled"/>
              <img alt :src="`${$cdnImageUrl}/cart/icon-unselected.png`" :width="width" :height="height" key="unselected" v-if="!checked&&!disabled" />
              <img alt :src="`${$cdnImageUrl}/cart/icon-unselected.png`" :width="width" :height="height" class="disabled" key="unselected"  v-if="disabled"/>
            </div>
        <slot></slot>
</div>
</template>
<script>
/**
 * 全局統(tǒng)一彈窗
 */
export default {
  name: 'CommonCkeckBox',
  model: {
    prop: 'checked',
    event: 'changeCheck'
  },
  props: {
    checked: {
      type: Boolean,
      default: false,
    }, // 選中狀態(tài)
    disabled: {
      type: Boolean,
      default: false,
    }, // 是否禁用
    width: {
      type: String,
      default: '16px',
    }, // 按鈕默認寬度
    height: {
      type: String,
      default: '16px',
    }, // 按鈕默認高度
  },
  created() {
  },
  data() {
    return {
    }
  },
  methods: {
    /**
     * 切換選中回傳
     */
    toggleCheck() {
      this.$emit('changeCheck', !this.checked)
      this.$emit('toggleCheck')
    }
  },
  watch: {
    checked: {
      handler(newValue, oldValue) {
      // 開放狀態(tài)變更事件
        this.$emit('onChange')
      },
      deep: true
    }
  },
}
</script>
<style lang="scss"  scoped>
.check-box-container{
    display: inline-block;
    .checkbox-icon{
        img{
          transform: translateZ(0);
          will-change: auto;
        }
        .disabled{
          background-color:#f5f5f5;
          border-radius: 50%;
        }
    }
}
</style>

父組件:

      <common-checkbox v-model="item.goodsSelected" class="left" :width="'16px'"  :height="'16px'"></common-checkbox>

具體用哪種方式根據(jù)項目場景選擇,若第一種不滿足需求,可以嘗試第二種實現(xiàn)。

總結(jié)

到此這篇關(guān)于vue自定義組件實現(xiàn)v-model雙向綁定數(shù)據(jù)的文章就介紹到這了,更多相關(guān)vue v-model雙向綁定數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue中設(shè)置背景圖片和透明度的簡單方法

    Vue中設(shè)置背景圖片和透明度的簡單方法

    在做項目的時候常需要設(shè)置背景圖片和透明度,下面這篇文章主要給大家介紹了關(guān)于Vue中設(shè)置背景圖片和透明度的簡單方法,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • 將vue項目打包成電腦端應(yīng)用.exe的完整步驟

    將vue項目打包成電腦端應(yīng)用.exe的完整步驟

    最近接了個小活,其中甲方要求把vue項目打包成exe安裝在windows上,其中有也會出現(xiàn)一些小問題和優(yōu)化,特此記錄,這篇文章主要給大家介紹了關(guān)于將vue項目打包成電腦端應(yīng)用.exe的完整步驟,需要的朋友可以參考下
    2023-10-10
  • vue.js實現(xiàn)表格合并示例代碼

    vue.js實現(xiàn)表格合并示例代碼

    最近工作中遇到一個需求,是要做一個頁面放張大表格用來顯示數(shù)據(jù)項,純粹為了view層操作方便,就用了vue做渲染。然而又被提出了一個需求,需要相鄰的相同值的行數(shù)據(jù)項進行單元格合并,這就醉了。沒辦法,只能想辦法解決,下面通過這篇文章來一起看看吧。
    2016-11-11
  • Vue的生命周期一起來看看

    Vue的生命周期一起來看看

    這篇文章主要為大家詳細介紹了Vue的生命周期,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Vue CLI 2.x搭建vue(目錄最全分析)

    Vue CLI 2.x搭建vue(目錄最全分析)

    這篇文章主要介紹了Vue CLI 2.x搭建vue(目錄最全分析),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • Vue路由Hash模式分析

    Vue路由Hash模式分析

    Vue-router是Vue的核心組件,主要是作為Vue的路由管理器,Vue-router默認hash模式,本文講給大家詳細分析Vue路由Hash模式,文中有相關(guān)的代碼示例供大家參考,感興趣的同學(xué)可以借鑒一下
    2023-06-06
  • vue3+vite中使用vuex的具體步驟

    vue3+vite中使用vuex的具體步驟

    在vue3+vite創(chuàng)建的項目中使用vuex,要注意的是vite有部分寫法和之前的webpack是不同的,這篇文章主要介紹了vue3+vite中使用vuex的具體步驟,需要的朋友可以參考下
    2022-11-11
  • vue 里面的 $forceUpdate() 強制實例重新渲染操作

    vue 里面的 $forceUpdate() 強制實例重新渲染操作

    這篇文章主要介紹了vue 里面的 $forceUpdate() 強制實例重新渲染操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • vue組件數(shù)據(jù)傳遞、父子組件數(shù)據(jù)獲取,slot,router路由功能示例

    vue組件數(shù)據(jù)傳遞、父子組件數(shù)據(jù)獲取,slot,router路由功能示例

    這篇文章主要介紹了vue組件數(shù)據(jù)傳遞、父子組件數(shù)據(jù)獲取,slot,router路由功能,結(jié)合實例形式分析了vue.js組件數(shù)據(jù)傳遞、路由相關(guān)概念、原理及相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • 一文搞懂Vue2中的組件通信

    一文搞懂Vue2中的組件通信

    這篇文章主要為大家介紹了Vue2中的組件通信方式,文中通過示例進行了詳細的介紹,對我們學(xué)習(xí)Vue有一定的幫助,感興趣的小伙伴可以了解一下
    2022-07-07

最新評論

左云县| 新宾| 南溪县| 宜丰县| 平安县| 呈贡县| 昂仁县| 高密市| 奉新县| 遵义县| 乡宁县| 化州市| 南漳县| 调兵山市| 牡丹江市| 乌拉特中旗| 洛扎县| 成武县| 仪陇县| 滨海县| 周宁县| 安仁县| 安仁县| 高台县| 漯河市| 星子县| 莫力| 酒泉市| 肇庆市| 萍乡市| 微博| 三穗县| 徐闻县| 阿拉善右旗| 台山市| 建宁县| 肥西县| 巴南区| 临邑县| 西乌珠穆沁旗| 玛多县|