Vue組件選項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: '<p>{{message}}</p>', 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 } };
#
var childNode = { template: '<p>{{myMessage}}</p>', props:['myMessage'] }
var childNode = {
template: '<p>{{myMessage}}</p>',
props:['my-message']
}
登入後複製
var childNode = { template: '<p>{{myMessage}}</p>', props:['my-message'] }
var childNode = { template: '<p>{{myMessage}}</p>', props:['myMessage'] }
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'
}
}
};
登入後複製
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"><!-- 传递实际的 number --><comp v-bind:some-prop="1"></comp></pre><div class="contentsignin">登入後複製</div></div>
"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 } } };
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 指定驗證規格。如果傳入的資料不符合規格,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。如果这么做了,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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

在iPhone15Pro機型上,蘋果推出了三種焦距選項,用於使用主相機拍攝。本文介紹了這些選項是什麼,以及如何設定用於拍照的首選預設焦距。為了充分利用iPhone15Pro和iPhone15ProMax上的增強相機系統,蘋果為主相機的光學變焦添加了三種不同的焦距選項。在標準的預設1倍(24毫米)模式下,Apple添加了1.2倍(28毫米)和1.5倍(35毫米)設定。 iPhone15Pro用戶在拍照時可以從這些焦距中進行選擇,只需點擊相機應用程式中的1x按鈕即可。但是,由於技術原因,這些焦
![在iPhone上找不到個人熱點選項[已修復]](https://img.php.cn/upload/article/000/887/227/168942511475372.png?x-oss-process=image/resize,m_fill,h_207,w_330)
當我們周圍沒有Wi-Fi訊號時,我們想到的是iPhone上的個人熱點,對嗎?最近,許多iPhone用戶評論說,他們無法在iPhone上找到個人熱點選項,因此,這對他們所有人都造成了巨大的問題。可能導致iPhone上出現此特定問題的主要原因可能包括以下原因之一。 iPhone中的小軟體錯誤。 iPhone上的iOS軟體未更新至最新版本。對iPhone上的網路設定進行了更改。不更新運營商設定(如果有)。 iPhone上的行動網路訊號有問題。在處理了這些因素之後,我們找到了輕鬆解決此問題的解決方案,並使用

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

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

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

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

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

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