目錄
 前面的話
#靜態props
修改prop数据
首頁 web前端 js教程 Vue組件選項props

Vue組件選項props

Aug 19, 2017 am 10:32 AM
props 組件 選項

 前面的話

  元件接受的選項大多與Vue實例一樣,而選項props是元件中非常重要的選項。在 Vue 中,父子元件的關係可以總結為 props down, events up。父元件透過 props 向下傳遞資料給子元件,子元件透過 events 給父元件發送訊息。本文將詳細介紹Vue元件選項props

 

#靜態props

  元件實例的作用域是孤立的。這表示不能 (也不應該) 在子元件的範本內直接引用父元件的資料。要讓子元件使用父元件的數據,需要透過子元件的 props 選項

  使用Prop傳遞資料包含靜態和動態兩種形式,以下先介紹靜態props

#  子元件要顯式地用 props 選項宣告它所期待獲得的資料

var childNode = {
  template: '<p>{{message}}</p>',
  props:['message']
}
登入後複製

  靜態Prop透過為子元件在父元件中的佔位符新增特性的方式來達到傳值的目的

<p id="example">
  <parent></parent></p>
登入後複製

#
<script>var childNode = {
  template: '&lt;p&gt;{{message}}&lt;/p&gt;',
  props:['message']
}var parentNode = {
  template: `  <p class="parent">
    <child message="aaa"></child>
    <child message="bbb"></child>
  </p>`,  components: {    'child': childNode
  }
};// 创建根实例new Vue({
  el: '#example',
  components: {    'parent': parentNode
  }
})</script>
登入後複製

#

var parentNode = {
  template: `  <p class="parent">
    <child my-message="aaa"></child>
    <child my-message="bbb"></child>
  </p>`,
  components: {
    'child': childNode
  }
};
登入後複製

# # 

命名約定

  對於props宣告的屬性來說,在父級HTML範本中,屬性名稱需要使用中劃線寫法

#

var childNode = {
  template: '<p>{{myMessage}}</p>',
  props:['myMessage']
}
登入後複製
登入後複製

  子級props屬性宣告時,使用小駝峰或中劃線寫法都可以;而子級模板使用從父級傳來的變數時,需要使用對應的小駝峰寫法

var childNode = {
  template: '<p>{{myMessage}}</p>',
  props:['my-message']
}
登入後複製

var childNode = {
  template: '<p>{{myMessage}}</p>',
  props:['myMessage']
}
登入後複製
登入後複製

動態props

  在範本中,要動態地綁定父元件的資料到子模板的props,與綁定到任何普通的HTML特性相類似,就是用 

v-bind

。每當父元件的資料變更時,此變更也會傳導給子元件

var parentNode = {
  template: `
  <p class="parent">
    <child :my-message="data1"></child>
    <child :my-message="data2"></child>
  </p>`,
  components: {
    'child': childNode
  },
  data(){
    return {
      'data1':'aaa',
      'data2':'bbb'
    }
  }
};
登入後複製

<!-- 传递了一个字符串 "1" --><comp some-prop="1"></comp>
登入後複製

  

傳遞數字

  初學者常犯的一個錯誤是使用字面量語法傳遞數值

<p id="example">
  <my-parent></my-parent></p>
登入後複製

<script>var childNode = {
  template: '<p>{{myMessage}}的类型是{{type}}</p>',
  props:['myMessage'],
  computed:{
    type(){      return typeof this.myMessage
    }
  }
}var parentNode = {
  template: `  <p class="parent">
    <my-child my-message="1"></my-child>
  </p>`,  components: {    'myChild': childNode
  }
};// 创建根实例new Vue({
  el: '#example',
  components: {    'MyParent': parentNode
  }
})</script>
登入後複製

<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;!-- 传递实际的 number --&gt;&lt;comp v-bind:some-prop=&quot;1&quot;&gt;&lt;/comp&gt;</pre><div class="contentsignin">登入後複製</div></div>

#  因為它是一個字面上prop,它的值是字串

"1"

而不是number。如果想要傳遞一個實際的number,就需要使用

v-bind

,從而讓它的值被當作JS表達式計算 

var parentNode = {
  template: `  <p class="parent">
    <my-child :my-message="1"></my-child>
  </p>`,
  components: {
    'myChild': childNode
  }
};
登入後複製

var parentNode = {
  template: `  <p class="parent">
    <my-child :my-message="data"></my-child>
  </p>`,
  components: {
    'myChild': childNode
  },
  data(){
    return {
      'data': 1
    }
  }
};
登入後複製

  或可以使用動態props,在data屬性中設定對應的數字1

Vue.component('example', {
  props: {
    // 基础类型检测 (`null` 意思是任何类型都可以)
    propA: Number,
    // 多种类型
    propB: [String, Number],
    // 必传且是字符串
    propC: {
      type: String,
      required: true
    },
    // 数字,有默认值
    propD: {
      type: Number,
      default: 100
    },
    // 数组/对象的默认值应当由一个工厂函数返回
    propE: {
      type: Object,
      default: function () {
        return { message: 'hello' }
      }
    },
    // 自定义验证函数
    propF: {
      validator: function (value) {
        return value > 10
      }
    }
  }
})
登入後複製

 

props驗證

  可以為元件的props 指定驗證規格。如果傳入的資料不符合規格,Vue會發出警告。當元件給其他人使用時,這很有用

  要指定驗證規格,需要用物件的形式,而不能用字串陣列

String
Number
Boolean
Function
Object
Array
Symbol
登入後複製

#  type 可以是下面原生建構器

<p id="example">
  <parent></parent>
</p>
登入後複製
登入後複製
登入後複製
  type 也可以是自訂建構器函數,使用instanceof 檢測。   當 prop 驗證失敗,Vue 會在拋出警告 (如果使用的是開發版本)。 props會在元件實例創建之前進行校驗,所以在default 或

validator

函數裡,諸如

data

computed

methods

等實例屬性還無法使用

  下面是一個簡單例子,如果傳入子元件的message不是數字,則拋出警告

#

<script>
var childNode = {
  template: '<p>{{message}}</p>',
  props:{
    'message':Number
  }
}
var parentNode = {
  template: `
  <p class="parent">
    <child :message="msg"></child>
  </p>`,
  components: {
    'child': childNode
  },
  data(){
    return{
      msg: '123'
    }
  }
};
// 创建根实例
new Vue({
  el: '#example',
  components: {
    'parent': parentNode
  }
})
</script>
登入後複製

var childNode = {
  template: '<p>{{message}}</p>',
  props:{
    'message':{
      validator: function (value) {
        return value > 10
      }
    }
  }
}
登入後複製

  傳入數字123時,則無警告提示。當傳入字串'123'時,結果如下所示

  將上面程式碼中,子元件的內容修改如下,可自訂驗證函數,當函數傳回為false時,則輸出警告提示

var parentNode = {
  template: `
  <p class="parent">
    <child :message="msg"></child>
  </p>`,
  components: {
    'child': childNode
  },
  data(){
    return{
      msg:1
    }
  }
};
登入後複製

  在父元件中傳入msg值為1,由於小於10,則輸出警告提示

<p id="example">
  <parent></parent>
</p>
登入後複製
登入後複製
登入後複製

############ #######單向資料流######  prop 是單向綁定的:當父元件的屬性變化時,將傳導給子元件,但是不會反過來。這是為了防止子元件無意修改了父元件的狀態-這會讓應用程式的資料流難以理解###

  另外,每次父组件更新时,子组件的所有 prop 都会更新为最新值。这意味着不应该在子组件内部改变 prop。如果这么做了,Vue 会在控制台给出警告

  下面是一个典型例子

<p id="example">
  <parent></parent>
</p>
登入後複製
登入後複製
登入後複製

<script>
var childNode = {
  template: `
  <p class="child">
    <p>
      <span>子组件数据</span>
      <input v-model="childMsg">
    </p>
    <p>{{childMsg}}</p>
  </p>
  `,
  props:['childMsg']
}
var parentNode = {
  template: `
  <p class="parent">
    <p>
      <span>父组件数据</span>
      <input v-model="msg">
    </p>
    <p>{{msg}}</p>
    <child :child-msg="msg"></child>
  </p>
  `,
  components: {
    'child': childNode
  },
  data(){
    return {
      'msg':'match'
    }
  }
};
// 创建根实例
new Vue({
  el: '#example',
  components: {
    'parent': parentNode
  }
})
</script>
登入後複製

  父组件数据变化时,子组件数据会相应变化;而子组件数据变化时,父组件数据不变,并在控制台显示警告

  修改子组件数据时,打开浏览器控制台会出现下图所示警告提示

 

修改prop数据

  修改prop中的数据,通常有以下两种原因

  1、prop 作为初始值传入后,子组件想把它当作局部数据来用

  2、prop 作为初始值传入,由子组件处理成其它数据输出

  [注意]JS中对象和数组是引用类型,指向同一个内存空间,如果 prop 是一个对象或数组,在子组件内部改变它会影响父组件的状态

  对于这两种情况,正确的应对方式是

  1、定义一个局部变量,并用 prop 的值初始化它

props: ['initialCounter'],
data: function () {
  return { counter: this.initialCounter }
}
登入後複製

  但是,定义的局部变量counter只能接受initialCounter的初始值,当父组件要传递的值发生变化时,counter无法接收到最新值

<p id="example">
  <parent></parent></p><script>var childNode = {
  template: `  <p class="child">
    <p>
      <span>子组件数据</span>
      <input v-model="temp">
    </p>
    <p>{{temp}}</p>
  </p>  `,
  props:['childMsg'],
  data(){    return{
      temp:this.childMsg
    }
  },
};var parentNode = {
  template: `  <p class="parent">
    <p>
      <span>父组件数据</span>
      <input v-model="msg">
    </p>
    <p>{{msg}}</p>
    <child :child-msg="msg"></child>
  </p>  `,
  components: {    'child': childNode
  },
  data(){    return {      'msg':'match'
    }
  }
};// 创建根实例new Vue({
  el: '#example',
  components: {    'parent': parentNode
  }
})</script>
登入後複製

  下面示例中,除初始值外,父组件的值无法更新到子组件中

  2、定义一个计算属性,处理 prop 的值并返回

props: ['size'],
computed: {
  normalizedSize: function () {
    return this.size.trim().toLowerCase()
  }
}
登入後複製

  但是,由于是计算属性,则只能显示值,而不能设置值

<script src="https://unpkg.com/vue"></script><script>var childNode = {
  template: `  <p class="child">
    <p>
      <span>子组件数据</span>
      <input v-model="temp">
    </p>
    <p>{{temp}}</p>
  </p>  `,
  props:['childMsg'],
  computed:{
      temp(){        return this.childMsg
      }
  },
};var parentNode = {
  template: `  <p class="parent">
    <p>
      <span>父组件数据</span>
      <input v-model="msg">
    </p>
    <p>{{msg}}</p>
    <child :child-msg="msg"></child>
  </p>  `,
  components: {    'child': childNode
  },
  data(){    return {      'msg':'match'
    }
  }
};// 创建根实例new Vue({
  el: '#example',
  components: {    'parent': parentNode
  }
})</script>
登入後複製

  下面示例中,由于子组件使用的是计算属性,所以,子组件的数据无法手动修改

  3、更加妥帖的方案是,使用变量储存prop的初始值,并使用watch来观察prop的值的变化。发生变化时,更新变量的值

<p id="example">
  <parent></parent></p><script>var childNode = {
  template: `  <p class="child">
    <p>
      <span>子组件数据</span>
      <input v-model="temp">
    </p>
    <p>{{temp}}</p>
  </p>  `,
  props:['childMsg'],
  data(){    return{
      temp:this.childMsg
    }
  },
  watch:{
    childMsg(){      this.temp = this.childMsg
    }
  }
};var parentNode = {
  template: `  <p class="parent">
    <p>
      <span>父组件数据</span>
      <input v-model="msg">
    </p>
    <p>{{msg}}</p>
    <child :child-msg="msg"></child>
  </p>  `,
  components: {    'child': childNode
  },
  data(){    return {      'msg':'match'
    }
  }
};// 创建根实例new Vue({
  el: '#example',
  components: {    'parent': parentNode
  }
})</script>
登入後複製

 

以上是Vue組件選項props的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何在iPhone 15 Pro上設定預設相機焦距 如何在iPhone 15 Pro上設定預設相機焦距 Sep 22, 2023 pm 11:53 PM

在iPhone15Pro機型上,蘋果推出了三種焦距選項,用於使用主相機拍攝。本文介紹了這些選項是什麼,以及如何設定用於拍照的首選預設焦距。為了充分利用iPhone15Pro和iPhone15ProMax上的增強相機系統,蘋果為主相機的光學變焦添加了三種不同的焦距選項。在標準的預設1倍(24毫米)模式下,Apple添加了1.2倍(28毫米)和1.5倍(35毫米)設定。 iPhone15Pro用戶在拍照時可以從這些焦距中進行選擇,只需點擊相機應用程式中的1x按鈕即可。但是,由於技術原因,這些焦

在iPhone上找不到個人熱點選項[已修復] 在iPhone上找不到個人熱點選項[已修復] Jul 15, 2023 pm 08:45 PM

當我們周圍沒有Wi-Fi訊號時,我們想到的是iPhone上的個人熱點,對嗎?最近,許多iPhone用戶評論說,他們無法在iPhone上找到個人熱點選項,因此,這對他們所有人都造成了巨大的問題。可能導致iPhone上出現此特定問題的主要原因可能包括以下原因之一。 iPhone中的小軟體錯誤。 iPhone上的iOS軟體未更新至最新版本。對iPhone上的網路設定進行了更改。不更新運營商設定(如果有)。 iPhone上的行動網路訊號有問題。在處理了這些因素之後,我們找到了輕鬆解決此問題的解決方案,並使用

如何安裝Win10舊版元件DirectPlay 如何安裝Win10舊版元件DirectPlay Dec 28, 2023 pm 03:43 PM

不少用戶在玩win10的的一些遊戲的時候總是會遇到一些問題,比如說卡屏和花屏等等情況,這個時候我們是可以採用打開directplay這個功能來解決的,而且功能的操作方法也很簡單。 win10舊版元件directplay怎麼安裝1、在搜尋框裡面輸入「控制台」然後開啟2、檢視方式選擇大圖示3、找到「程式與功能」4、點選左側的啟用或關閉win功能5、選擇舊版這裡的勾選上就可以了

修復:停靠在工作列選項中,在 Windows 11 上灰顯 修復:停靠在工作列選項中,在 Windows 11 上灰顯 Sep 15, 2023 pm 05:35 PM

語言欄是Windows中的重要功能,可讓使用者快速切換輸入,而不是使用+鍵盤快速鍵。但在某些情況下,工作列中的停靠選項在Windows11中顯示為灰色。 WindowsSpacebar這個問題似乎很普遍,沒有解決方法。我們嘗試更改語言設定並重新配置內容,但都是徒勞的。儘管我們最終設法找到了根本原因和解決方案。為什麼我無法將語言列停靠在Windows11的工作列中?您只安裝了一種語言,語言列僅適用於多種語言。語言安裝不正確。 Windows11中的一個錯誤。損壞的系統檔案或使用者設定檔。如果在W

如何檢查iPhone型號國家 如何檢查iPhone型號國家 Jul 09, 2023 pm 11:33 PM

您知道蘋果將其產品的某些部分外包給不同的國家嗎?是的。它們專門用於在這些國家/地區銷售,因此在該國製造。您可能從其他人那裡購買了二手iPhone/iPad,並且可能想知道是否有可能知道您的iPhone來自哪個國家。是的,有一種方法可以找出答案,我們現在將在本文中對此進行更多討論。在這篇文章中,您將找到解釋如何使用簡單步驟來了解iPhone原產國的方法。如何知道iPhone的原產國步驟1:首先,您應該點擊主畫面中的設定圖示。步驟2:這是打開“設定”應用程序,打開後,單擊它轉到“常規”選項,如下所示。

如何在Windows 11的右鍵選單中預設'顯示更多選項” 如何在Windows 11的右鍵選單中預設'顯示更多選項” Jul 10, 2023 pm 12:33 PM

我們用戶從來不想要的最煩人的更改之一是在右鍵單擊上下文功能表中包含“顯示更多選項”。但是,您可以刪除它並取回Windows11中的經典上下文功能表。不再需要多次點擊並在上下文選單中尋找這些ZIP捷徑。請依照本指南返回Windows11上成熟的右鍵點選上下文功能表。修復1–手動調整CLSID這是我們清單中唯一的手動方法。您將在登錄編輯器中調整特定鍵或值以解決此問題。注意–像這樣的註冊表編輯非常安全,並且可以正常工作。因此,在系統上嘗試此操作之前,您應該建立註冊表備份。步驟1–嘗試

如何在蘋果筆記中使用區塊引號 如何在蘋果筆記中使用區塊引號 Oct 12, 2023 pm 11:49 PM

在iOS17和macOSSonoma中,Apple為AppleNotes新增了新的格式選項,包括區塊引號和新的Monostyle樣式。以下是使用它們的方法。使用AppleNotes中的其他格式選項,您現在可以在筆記中新增區塊引用。區塊引用格式可以輕鬆地使用文字左側的引用欄直觀地偏移部分的寫作。只需點擊/點擊“Aa”格式按鈕,然後在鍵入之前或當您在要轉換為區塊引用的行上時選擇區塊引用選項。此選項適用於所有文字類型、樣式選項和列表,包括清單。在同一「格式」功能表中,您可以找到新的「單樣式」選項。這是對先前「等寬

如何處理PHP表單中的複選框和單選框 如何處理PHP表單中的複選框和單選框 Aug 11, 2023 am 08:39 AM

如何處理PHP表單中的複選框和單選框在Web開發中,表單是應用程式與使用者之間進行資料互動的主要方式之一。而在表單中,有時我們需要使用複選框(Checkbox)和單選框(RadioButton)來進行選項選擇。本文將介紹如何在PHP中處理複選框和單選框。一、複選框的處理在HTML中,我們可以使用&lt;inputtype="checkbox&qu

See all articles