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

vue項目中v-model父子組件通信的實現(xiàn)詳解

 更新時間:2017年12月10日 10:14:26   作者:http://www.haorooms.com/post/vue_vmodel  
vue.js,是一個構(gòu)建數(shù)據(jù)驅(qū)動的 web 界面的庫。Vue.js 的目標(biāo)是通過盡可能簡單的 API 實現(xiàn)響應(yīng)的數(shù)據(jù)綁定和組合的視圖組件。下面這篇文章主要給大家介紹了關(guān)于vue項目中v-model父子組件通信實現(xiàn)的相關(guān)資料,需要的朋友可以參考下。

前言

我們在vue項目中,經(jīng)常有這樣的需求,父組件綁定v-model,子組件輸入更改父組件v-model綁定的數(shù)值。很多朋友對這種操作不是很清楚,這需要對v-model有比較深入的了解,今天談?wù)剉-model。

vue的雙向數(shù)據(jù)綁定

v-model這個指令只能用在<input>, <select>,<textarea>這些表單元素上,所謂雙向綁定,指的就是我們在js中的vue實例中的data與其渲染的dom元素上的內(nèi)容保持一致,兩者無論誰被改變,另一方也會相應(yīng)的更新為相同的數(shù)據(jù)。

這個問題在很多前端面試中,會提及。面試官問你,vue的雙向數(shù)據(jù)綁定原理是什么?當(dāng)然,這個也是耳熟能詳?shù)膯栴},百度隨便一搜索,到處都能找到答案。

一般都會搜索到,是用Object.defineProperty( ) ,來監(jiān)聽數(shù)據(jù)get和set,來實現(xiàn)數(shù)據(jù)劫持的。

假如對Object.defineProperty( )不是很了解,可以點擊上面鏈接,看看其語法!

舉個簡單的例子:

var blog = {
 name: 'haorooms博客'
};
console.log(blog.name); // haorooms博客

如果想要在執(zhí)行console.log(blog.name)的同時,直接給haorooms博客加個書名號,那要怎么處理呢?或者說要通過什么監(jiān)聽對象 blog的屬性值。這時候Object.defineProperty( )就派上用場了,代碼如下:

var blog= {}
var name = '';
Object.defineProperty(blog, 'name', {
 set: function (value) {
 name = value;
 console.log('歡迎來到' + value);
 },
 get: function () {
 return '《' + name + '》'
 }
})
blog.name = 'haorooms博客'; // 歡迎來到haorooms博客
console.log(blog.name); // 《haorooms博客》

上面代碼執(zhí)行一下,可以查看效果!

關(guān)于 vue的雙向數(shù)據(jù)綁定,具體如何實現(xiàn)的?網(wǎng)上也有很多實現(xiàn)的代碼,這里就不多累贅了!

v-model 的使用

上面開了一個小差,講了那么多,其實就是為了說明Vue 是單項數(shù)據(jù)流,v-model 只是語法糖而已。

<input v-model="haorooms" />
<input v-bind:value="haorooms" v-on:input="haorooms= $event.target.value" />

第一行的代碼其實只是第二行的語法糖。然后第二行代碼還能簡寫成這樣:

<input :value="haorooms" @input="haorooms= $event.target.value" />

也就是說,

<input v-model="haorooms" />

也可以寫成

<input :value="haorooms" @input="haorooms= $event.target.value" />

v-model在組件上的使用

回到我們一開始的疑問了?vue中v-model如何進(jìn)行父子組件的通信?如何在組件中使用呢?假如你理解了我上面的例子,那么,我們就可以很簡單的在組件中使用v-model了。

父組件代碼如下:

 <template>
 <div id="demo">
 <test-model v-model="haorooms"></test-model>
 <span>{{haorooms}}</span>
</div>
</template>
<script>
  import testModel from 'src/components/testModel'
  export default {
   data(){
      return{
         haorooms: "haorooms"
      }
    },
    components: {
      testModel,
    }
  }
</script>
<style lang="scss" scoped>
</style>

子組件代碼如下:

<template>
<span>
   <input
    ref="input"
    :value="value"
    @input="$emit('balabala', $event.target.value)"
   >
  </span>
</template>
<script>
  export default {
    data(){
      return{
      }
    },
    props: ["value"],
    model: {
      prop: 'value',
      event: 'balabala'
    }
  }
</script>
<style lang="scss" scoped>
</style>

我們可以通過上面代碼,子組件修改父組件v-model綁定的值!

實現(xiàn)截圖如下:

v-model 的缺點和解決辦法

在創(chuàng)建類似復(fù)選框或者單選框的常見組件時,v-model就不好用了。

<input type="checkbox" v-model="haorooms" />

我們可以用如下方式解決:

<input type="checkbox" :checked="status" @change="status = $event.target.checked" />

父組件可以如下寫:

<my-checkbox v-model="haorooms"></my-checkbox>

子組件:

<input 
        type="checkbox"
        <!--這里就不用 input 了,而是 balabala-->
        @change="$emit('balabala', $event.target.checked)"
        :checked="value"
       />
 export default {
    data(){
      return{
      }
    },
    props: ['checked'], //這里就不用 value 了,而是 checked
   model: {
     prop: 'checked',
     event: 'balabala'
    },
  }

關(guān)于vue的v-model就寫到這里。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

最新評論

南康市| 常州市| 高阳县| 高要市| 罗定市| 开远市| 唐河县| 于都县| 西青区| 大厂| 扶余县| 永胜县| 井陉县| 永顺县| 呼伦贝尔市| 蒲城县| 辽阳县| 太保市| 惠州市| 黑山县| 遂平县| 枞阳县| 宜州市| 天水市| 安岳县| 永靖县| 桃江县| 色达县| 绵竹市| 达州市| 登封市| 台湾省| 新野县| 晴隆县| 青州市| 岢岚县| 涡阳县| 大同县| 应用必备| 长沙市| 象州县|