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

Vue2.4+新增屬性.sync、$attrs、$listeners的具體使用

 更新時間:2020年03月08日 10:58:37   作者:藍山牧童  
這篇文章主要介紹了Vue2.4+新增屬性.sync、$attrs、$listeners的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

sync

在vue2.4以前,父組件向子組件傳值用props;子組件不能直接更改父組件傳入的值,需要通過$emit觸發(fā)自定義事件,通知父組件改變后的值。比較繁瑣,寫法如下:

//父組件
<template>
 <div class="parent">
  <p>父組件傳入子組件的值:{{name}}</p>
  <fieldset>
   <legend>子組件</legend>
   <child :val="name" @update="modify">
   </child>
  </fieldset>
 </div>
</template>

<script>
import Child from './Child'
export default {
 components:{Child},
 data () {
  return {
   name:'linda'
  }
 },
 methods:{
  modify(newVal){
   this.name=newVal
  }
 }
}
</script>

//子組件
<template>
  <label class="child">
    輸入框:
    <input :value=val @input="$emit('update',$event.target.value)"/>
  </label>
</template>
<script>
export default {
  props:['val']
}
</script>

vue2.4以后的寫法明顯舒服許多,上面同樣的功能,直接上代碼

//父組件
<template>
 <div class="parent">
  <p>父組件傳入子組件的值:{{name}}</p>
  <fieldset>
   <legend>子組件</legend>
   <child :val.sync="name">
   </child>
  </fieldset>
 </div>
</template>

<script>
import Child from './Child'
export default {
 components:{Child},
 data () {
  return {
   name:'linda'
  }
 }
}
</script>

//子組件
<template>
  <label class="child">
    輸入框:
    <input :value=val @input="$emit('update:val',$event.target.value)"/>
  </label>
</template>
<script>
export default {
  props:['val']
}
</script>

寫法上簡化了一部分,很明顯父組件不用再定義方法檢測值變化了。其實只是對以前的$emit方式的一種縮寫,.sync其實就是在父組件定義了一update:val方法,來監(jiān)聽子組件修改值的事件。

$attrs

想象一下,你打算封裝一個自定義input組件——MyInput,需要從父組件傳入type,placeholder,title等多個html元素的原生屬性。此時你的MyInput組件props如下:

props:['type','placeholder','title',...]

很丑陋不是嗎?$attrs專門為了解決這種問題而誕生,這個屬性允許你在使用自定義組件時更像是使用原生html元素。比如:

//父組件
<my-input placeholder="請輸入你的姓名" type="text" title="姓名" v-model="name"/>

my-input的使用方式就像原生的input一樣。而MyInput并沒有設(shè)置props,如下

<template>
  <div>
    <label>輸入框:</label><input v-bind="$attrsAll" @input="$emit('input',$event.target.value)"/>
  </div>
</template>
<script>
export default {
  inheritAttrs:false,
  computed: {
    $attrsAll() {
      return {
        value: this.$vnode.data.model.value,
        ...this.$attrs
      }
    }
  }
}
</script>

基礎(chǔ)掃盲

v-model是v-bind:value和v-on:input的簡寫,所以在父組件你完全可以直接寫 :value="name",@input="val => name = val"。查看文檔

疑難

引用下vue的官方api中對$attrs的說明

$attrs包含了父作用域中不作為 prop 被識別 (且獲取) 的特性綁定 (class 和 style 除外)

比較迷惑的一點是給子組件設(shè)置:value="name"相當于給子組件設(shè)置props:['value'],所以在MyInput中直接從$attrs獲取不到value,需要重新包裝$attrsAll,添加value屬性。所以子組件還有下面寫法,我傾向于這種寫法,因為它更優(yōu)雅

<template>
  <div>
    <label>輸入框:</label><input v-bind="$attrs" :value="value" @input="$emit('input',$event.target.value)"/>
  </div>
</template>
<script>
export default {
  inheritAttrs:false,
  props:['value']
}
</script>

$listener

同上面$attrs屬性一樣,這個屬性也是為了在自定義組件中使用原生事件而產(chǎn)生的。比如要讓前面的MyInput組件實現(xiàn)focus事件,直接這么寫是沒用的

<my-input @focus="focus" placeholder="請輸入你的姓名" type="text" title="姓名" v-model="name"/>

必須要讓focus事件作用于MyInput組件的input元素上,最終的MyInput源碼如下:

<template>
  <div>
    <label>輸入框:</label><input v-bind="$attrsAll" v-on="$listenserAll"/>
  </div>
</template>
<script>
export default {
  inheritAttrs:false,
  props:['value'],
  computed:{
     $attrsAll() {
      return {
        value: this.value,
        ...this.$attrs
      }
    },
    $listenserAll(){
      return Object.assign(
        {},
        this.$listeners,
        {input:(event) => this.$emit('input',event.target.value)})
    }
  }
}
</script>

到此這篇關(guān)于Vue2.4+新增屬性.sync、$attrs、$listeners的具體使用的文章就介紹到這了,更多相關(guān)Vue2.4 .sync、$attrs、$listeners內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺析Vue如何巧用computed計算屬性

    淺析Vue如何巧用computed計算屬性

    在日常使用Vue開發(fā)項目的時候,計算屬性computed是一個非常常用的特性,本文就來分享一些使用Vue的computed計算屬性時的一些小技巧,希望能夠幫助到大家
    2023-06-06
  • 淺析webpack-bundle-analyzer在vue-cli3中的使用

    淺析webpack-bundle-analyzer在vue-cli3中的使用

    這篇文章主要介紹了webpack-bundle-analyzer在vue-cli3中的使用,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-10-10
  • Vuex之理解Store的用法

    Vuex之理解Store的用法

    本篇文章主要介紹了Vuex之理解Store的用法,Store類就是存儲數(shù)據(jù)和管理數(shù)據(jù)方法的倉庫,實現(xiàn)方式是將數(shù)據(jù)和方法已對象形式傳入其實例中
    2017-04-04
  • vue3實現(xiàn)點擊空白區(qū)域隱藏div

    vue3實現(xiàn)點擊空白區(qū)域隱藏div

    這篇文章主要介紹了vue3實現(xiàn)點擊空白區(qū)域隱藏div方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 前端報錯npm ERR! cb() never called!問題解決辦法

    前端報錯npm ERR! cb() never called!問題解決辦法

    最近接手了一個前臺項目,執(zhí)行npm install的時候一直報錯,所以這里就給大家總結(jié)下,這篇文章主要給給大家介紹了關(guān)于前端報錯npm?ERR! cb() never called!問題的解決辦法,需要的朋友可以參考下
    2024-05-05
  • 腳手架(vue-cli)創(chuàng)建Vue項目的超詳細過程記錄

    腳手架(vue-cli)創(chuàng)建Vue項目的超詳細過程記錄

    用vue-cli腳手架可以快速的構(gòu)建出一個前端vue框架的項目結(jié)構(gòu),下面這篇文章主要給大家介紹了關(guān)于腳手架(vue-cli)創(chuàng)建Vue項目的超詳細過程,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • vue 實現(xiàn) rem 布局或vw 布局的方法

    vue 實現(xiàn) rem 布局或vw 布局的方法

    這篇文章主要介紹了vue 實現(xiàn) rem 布局的 或者 vw 布局的方法,本文給提供多種方法,需要的朋友可以參考下
    2019-11-11
  • vue插件開發(fā)之使用pdf.js實現(xiàn)手機端在線預覽pdf文檔的方法

    vue插件開發(fā)之使用pdf.js實現(xiàn)手機端在線預覽pdf文檔的方法

    這篇文章主要介紹了vue插件開發(fā)之使用pdf.js實現(xiàn)手機端在線預覽pdf文檔的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Vue3中如何使用fullcalendar日歷插件

    Vue3中如何使用fullcalendar日歷插件

    這篇文章主要介紹了Vue3中如何使用fullcalendar日歷插件,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01
  • 解決vue 打包發(fā)布去#和頁面空白的問題

    解決vue 打包發(fā)布去#和頁面空白的問題

    今天小編就為大家分享一篇解決vue 打包發(fā)布去#和頁面空白的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09

最新評論

东阿县| 汉阴县| 阿拉善左旗| 英德市| 景泰县| 九龙县| 昭通市| 五寨县| 岳西县| 龙海市| 鄂伦春自治旗| 神木县| 永春县| 芜湖市| 庐江县| 怀仁县| 扎兰屯市| 枞阳县| 板桥市| 张掖市| 南阳市| 龙泉市| 宣武区| 宁陕县| 旌德县| 彩票| 同仁县| 米林县| 屏山县| 河津市| 潜江市| 庄河市| 株洲市| 拜城县| 临桂县| 苗栗市| 瓦房店市| 平果县| 咸阳市| 游戏| 合山市|