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

溫馨提示×

溫馨提示×

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

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

vue如何使用$attrs和$listeners進行多層級的數據和事件傳遞

發布時間:2022-03-21 09:52:53 來源:億速云 閱讀:505 作者:小新 欄目:開發技術

這篇文章主要介紹了vue如何使用$attrs和$listeners進行多層級的數據和事件傳遞,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

使用 $attrs 和 $listeners 進行多層級的數據和事件傳遞

先聊聊如何傳遞 Prop,可以分為靜態和動態的 Prop:

<!-- 靜態的prop -->
<blog-post title="My journey with Vue"></blog-post>
<!-- 動態的prop -->
<blog-post v-bind:title="post.title"></blog-post>
<!-- 動態的prop傳遞可以簡寫成 -->
<blog-post :title="post.title"></blog-post>
<!-- 需要傳遞多個prop的時候,可以一起寫在v-bind上 -->
<blog-post v-bind="{ editable, title: post.title}"></blog-post>

了解了 Props 的傳遞方式,在看看官方文檔是怎么定義 $attrs 的,  在尤大大的文檔中這樣介紹了 $attrs:

$attrs:  包含了父作用域中不作為 prop 被識別 (且獲取) 的 attribute 綁定 class 和 style 除外)。當一個組件沒有聲明任何 prop 時,這里會包含所有父作用域的綁定 (class 和 style 除外),并且可以通過 v-bind="$attrs" 傳入內部組件

$attrs  包含了傳入到父作用域中沒有在 props 聲明的其他 props,因此我們可以用 $attrs 去代替那些父組件中不需要的而子組件需要的 props, 通過 v-bind="$attrs" 統一傳遞給后代。這樣就避免了一個個聲明然后再一個個傳遞。

<blog-post v-bind="$attrs"></blog-post>

上面這一行代碼就通過 v-bind="$attrs" 的方式將本作用域中不作為 prop 的其他屬性傳遞給了 blog-post 組件。

父組件通過 $attrs 傳遞給后代組件后,后代組件如果想通過觸發事件來更新父組件狀態該如何處理?如果一級一級地往上 emit 事件,會不會弄得代碼太繁瑣復雜了?在 Vue 中可以通過 $listeners 解決這個問題,先看看官方文檔關于  $listeners 的說明:

包含了父作用域中的 (不含 .native 修飾器的) v-on 事件監聽器。它可以通過 v-on="$listeners" 傳入內部組件——在創建更高層次的組件時非常有用。

文檔中說了 $listeners 包含了父作用域中的事件監聽器。意思就是 $listeners 表示了父組件中的事件監聽器集合,只要是觸發父組件的事件,而不是自己的,就可以用一個 v-on="$listeners"表示。

<!-- 父組件(第一層組件) -->
<componentA @on-change="handleChange" v-bind="{ editable, title: post.title}" />

<!-- 中間層的組件 -->
<Child v-bind="$attrs" v-on="$listeners"/>

<!-- 數據傳遞的目標組件,事件觸發的組件 -->
<div @click="handleClick">{{ title }} </div>
<script>
  export default {
    props: {
      title: String
    }
    handleClick() {
      this.$emit('on-change', 'New Title');
    }
  }
</script>

上面的代碼示例中,中間層的組件內通過 v-bind="$attrs" 將其余的 Prop 傳遞給了 Child 組件,再通過 v-on="$listeners" 綁定父作用域中的事件監聽器,一旦 emit 就會傳給了父組件。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“vue如何使用$attrs和$listeners進行多層級的數據和事件傳遞”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

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

AI

神农架林区| 潼南县| 麦盖提县| 景德镇市| 电白县| 保康县| 黄石市| 扬中市| 阜平县| 独山县| 祁阳县| 成安县| 鄄城县| 宁海县| 万山特区| 海林市| 同仁县| 焦作市| 泾源县| 宾阳县| 保山市| 普格县| 彩票| 林西县| 馆陶县| 克什克腾旗| 广安市| 赤水市| 台江县| 新田县| 永春县| 五河县| 离岛区| 保山市| 乌拉特前旗| 茌平县| 曲沃县| 浪卡子县| 巴塘县| 陵川县| 深圳市|