vue組件詳解(二)——使用props傳遞數據

来源:https://www.cnblogs.com/chaixiaozhi/archive/2018/04/08/8745537.html
-Advertisement-
Play Games

在 Vue 中,父子組件的關係可以總結為 props向下傳遞,事件向上傳遞。父組件通過 props 給子組件下發數據,子組件通過事件給父組件發送消息。看看它們是怎麼工作的。 一、基本用法 組件不僅僅是要把模板的內容進行復用,更重要的是組件間要進行通信。 在組件中,使用選項props 來聲明需要從父級 ...


在 Vue 中,父子組件的關係可以總結為 props向下傳遞,事件向上傳遞。父組件通過 props 給子組件下發數據,子組件通過事件給父組件發送消息。看看它們是怎麼工作的。

 一、基本用法

組件不僅僅是要把模板的內容進行復用,更重要的是組件間要進行通信。

在組件中,使用選項props 來聲明需要從父級接收的數據, props 的值可以是兩種, 一種是字元串數組,一種是對象。

1.1 字元串數組:

       <div id="app4">
            <my-component4 message="數據來自父組件"></my-component4>
        </div>
Vue.component('my-component4',{
    props: ['message'],
    template: '<div>{{message}}</div>'
});

var app4 = new Vue({
    el: '#app4'
});
渲染後的結果為:
<div id= ” app4”>
  <div >來自父組件的數據</ div>
</div>

 props 中聲明的數據與組件data 函數return 的數據主要區別就是props 的來自父級,而data 中的是組件自己的數據,作用域是組件本身,這兩種數據都可以在模板template 及計算屬性computed和方法methods 中使用。

上例的數據message 就是通過props 從父級傳遞過來的,在組件的自定義標簽上直接寫該props 的名稱,如果要傳遞多個數據,在props 數組中添加項即可。

 

有時候,傳遞的數據並不是直接寫死的,而是來自父級的動態數據,這時可以使用指令v -bind來動態綁定props 的值,當父組件的數據變化時,也會傳遞給子組件。

        <div id="app5">
            <input type="text" v-model="text">
            <my-component5 :my-text="text"></my-component5>
        </div>
Vue.component('my-component5',{
    props: ['myText'],
    template: '<div>{{myText}}</div>'
});

var app5 = new Vue({
    el: '#app5',
    data: {
        text: '動態傳遞父組件數據'
    }
});

註意的幾個點:

1.如果你要直接傳遞數字、布爾值、數組、對象,而且不使用v-bind ,傳遞的僅僅是字元串。

2.如果你想把一個對象的所有屬性作為 prop 進行傳遞,可以使用不帶任何參數的 v-bind (即用 v-bind 而不是 v-bind:prop-name)。例如,已知一個 todo 對象:

 

1.2 對象:

當prop 需要驗證時,就需要對象寫法。

一般當你的組件需要提供給別人使用時,推薦都進行數據驗證,比如某個數據必須是數字類型,如果傳入字元串,就會在控制台彈出警告。

        <div id="app6">
            <input type="text" v-model="number">
            <my-component6 :my-text="number"></my-component6>
        </div>
Vue.component('my-component6',{
    props: {
      'myText':{
          type: Number, //必須是數字類型的
          required: true,    //必須傳值
          default: 1    //如果未定義,預設值就是1
      }
    },
    template: '<div>{{myText}}</div>'
});

var app6 = new Vue({
    el: '#app6',
    data: {
        number: 1
    }
});

驗證的type 類型可以是:
• String
• Number
• Boolean
• Object
• Array
• Function
type 也可以是一個自定義構造器,使用instanceof 檢測。
當prop 驗證失敗時,在開發版本下會在控制台拋出一條警告。

 

二、單向數據流

Vue 2.x 與Vue l.x 比較大的一個改變就是, Vue2.x 通過props 傳遞數據是單向的了, 也就是父組件數據變化時會傳遞給子組件,但是反過來不行。

業務中會經常遇到兩種需要改變prop 的情況,

2.1 一種是父組件傳遞初始值進來,子組件將它作為初始值保存起來,在自己的作用域下可以隨意使用和修改。(Prop 作為初始值傳入後,子組件想把它當作局部數據來用;)

這種情況可以在組件data 內再聲明一個數據,引用父組件的prop ,示例代碼如下:

        <div id="app7">
            <my-component7 :init-count="1"></my-component7>
        </div>
Vue.component('my-component7',{
    props: ['initCount'],
    template: '<div>{{count}}</div>',
    data: function(){
        return {
            count: this.initCount
        }
    }
});
var app7 = new Vue({
    el: '#app7'
});

組件中聲明瞭數據count , 它在組件初始化時會獲取來自父組件的initCount , 之後就與之無關了,只用維護c ount , 這樣就可以避免直接操作initCount 。

 

2.2 prop 作為需要被轉變的原始值傳入。(Prop 作為原始數據傳入,由子組件處理成其它數據輸出。)

這種情況用計算屬性就可以了, 示例代碼如下:

        <div id="app8">
            <my-component8 :width="100"></my-component8>
        </div>
Vue.component('my-component8',{
    props: ['width'],
    template: '<div :style="style">組件內容</div>',
    computed: {
        style: function(){
            return {
                width: this.width+'px'
            }
        }
    }
});
var app8 = new Vue({
    el: '#app8'
});

註意在 JavaScript 中對象和數組是引用類型,指向同一個記憶體空間,如果 prop 是一個對象或數組,在子組件內部改變它會影響父組件的狀態。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、什麼是slot 在使用組件時,我們常常要像這樣組合它們: 當需要讓組件組合使用,混合父組件的內容與子組件的模板時,就會用到slot , 這個過程叫作內容分發( transclusion )。 註意兩點: 1.< app>組件不知道它的掛載點會有什麼內容。掛載點的內容是由<app >的父組件決定的 ...
  • 原型與原型鏈是學習JavaScript這門語言不能不理解的兩個重要概念,為什麼?因為JavaScript是一門基於原型的語言。 怎麼理解“JavaScript是一門基於原型的語言”?在軟體設計模式中,有一種模式叫做原型模式,JavaScript正是利用這種模式而被創建出來。先來瞭解下原型模式的概念... ...
  • 自己跟著網上教程複習上學期的HTML+CSS,因為已經忘得差不多了,而且現在學的js也要以HTML+CSS為基礎,堅持每天持續更新。 n B/S 網路結構 Browser/Server 瀏覽器/伺服器,這是現在最流行的網路模式。如新浪網、鳳凰網等。 C/S Client/Server 客戶端/伺服器 ...
  • 昨天編輯朋友圈文章,無法修改提交的bug終於找到了,原因是用錯了一個標點... 把req點body寫成req逗號body,印象深刻,發人深省。 編輯後,終於可以修改成功了。 雖然只是一個小小的bug,,但是印象實在太過深刻。 所以說寫代碼的時候不用心,改bug的時候就耽誤一天。 晚上還嘗試做了一個刪 ...
  • 組件之間通信可以用下圖表示: 組件關係可分為父子組件通信、兄弟組件通信、跨級組件通信。 一、自定義事件 當子組件需要向父組件傳遞數據時,就要用到自定義事件。 子組件用$emit ()來觸發事件,父組件用$on()來監昕子組件的事件。 父組件可以直接在子組件的自定義標簽上使用v-on 來監昕子組件觸發 ...
  • vueJs 源碼解析 (三) 具體代碼 在之前的文章中提到了 vuejs 源碼中的 架構部分,以及 談論到了 vue 源碼三要素 vm、compiler、watcher 這三要素,那麼今天我們就從這三要素逐步瞭解清楚 好了,話不多說, let's do it 在這之前,我們需要 對上文中講到的 vu ...
  • 不知不覺做nodejs開發已經將近一年多了,過程中學了很多,也忘了很多,所以還是堅持在博客裡面留下點內容,方便以後查看。 本文主要實現一個簡單的網站爬蟲功能,抓取網站裡面的圖片以及內容。 在抓取之前用到了superagent、cheerio、request、fs模塊。 superagent和http ...
  • 1、let和const:最基礎也很容易理解的,let是 聲明一個變數,const是聲明一個常量。 具體細節看如下實例代碼 2、解構賦值,簡單來說就是將等號兩邊寫成一樣的模式,然後進行對應的賦值。如下實例 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...