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

一文詳析vue3?Props的用法(父傳子)

 更新時間:2024年10月26日 11:36:23   作者:fishmemory7sec  
這篇文章主要給大家介紹了關于vue3?Props的用法(父傳子)的相關資料,在Vue3中Props用于組件間數(shù)據(jù)傳遞,允許類型檢查和默認值設置,文中將用法介紹的非常詳細,需要的朋友可以參考下

在 Vue 3 中,Props(屬性)用于在組件之間傳遞數(shù)據(jù)。

vue官網(wǎng) Props

Props的作用

  • 傳參:Props 允許父組件向子組件傳遞數(shù)據(jù)。
  • 類型檢查:Vue 允許在定義 Props 時指定數(shù)據(jù)的類型,這有助于在開發(fā)過程中進行類型檢查,提前發(fā)現(xiàn)潛在的類型錯誤。
  • 設置默認值:可以為 Props 設置默認值。當父組件沒有傳遞該 Prop 時,子組件會使用默認值進行渲染。

Vue 中的 Props 遵循單向數(shù)據(jù)流原則,即父組件向子組件傳遞數(shù)據(jù),子組件不能直接修改父組件傳遞過來的 Prop。

父組件傳值給子組件

在父組件的模板中,可以使用屬性綁定的方式將數(shù)據(jù)傳遞給子組件(靜態(tài)傳值):

<ChildComponent title="哈嘿" />

可以使用變量或表達式來動態(tài)地傳遞 Props:

<!-- 根據(jù)一個變量的值動態(tài)傳入 -->
<ChildComponent :title="title" />
 
<!-- 根據(jù)一個更復雜表達式的值動態(tài)傳入 -->
<ChildComponent :title="someCondition ? titleA : titleB" />

可以使用 v-bind 動態(tài)綁定所有的 props:

可以將一個對象傳遞給 v-bind,這個對象的屬性將被用作組件的 props。

<template>
  <ChildComponent v-bind="obj" />
</template>

<script setup lang="ts">
import ChildComponent from './ChildComponent.vue';
import { reactive } from 'vue'
let obj = reactive({
  message: 'Hello',
  count: 5
})
</script>

<ChildComponent v-bind="obj" /> 等價于:

<ChildComponent :message="message" :count="count" />

聲明 Props

  • 使用 defineProps 函數(shù):
    • 在 <script setup> 語法中,可以直接使用 defineProps 函數(shù)來聲明組件接收的 Props。
    • 在 Vue 3 中,基于類型的聲明通常用于組合式 API 。
<script setup lang="ts">
import { defineProps } from 'vue';

// 字符串數(shù)組形式
const props = defineProps(['message', 'count']);
</script>

在這個例子中,聲明了兩個 Props:message 和count 。

可以使用對象字面量的方式來聲明 Props:

<script setup lang="ts">
import { defineProps } from 'vue';

const props = defineProps({
  message: String,
  count: Number,
});
</script>

在這個例子中,聲明了兩個 Props:message 是字符串類型,count 是數(shù)字類型。通過類型注解,TypeScript 可以在開發(fā)過程中進行類型檢查,確保傳入的 props 值符合預期的類型。

在 <script setup> 語法中,使用 defineProps 函數(shù)結合類型注解來進行基于類型的聲明。

如果項目沒有使用 TypeScript,就無法使用基于類型的聲明進行聲明。

基于類型的聲明可以在開發(fā)過程中利用 TypeScript 的類型檢查機制,提前發(fā)現(xiàn)類型錯誤。

  • 在選項式 API 中(沒有使用 <script setup> 語法糖),props 是通過 props 選項進行聲明的。
    • 必須要用props選項聲明組件接收的Props,在setup()props參數(shù)里,才有Props數(shù)據(jù)。
    • 在 Vue 3 中,運行時聲明通常用于選項式 API。
export default {
  props: ['message'],
  setup(props) {
    // setup() 接收 props 作為第一個參數(shù)
    console.log(props.message)
  }
}

必須要用props選項聲明組件接收的Props。如果沒有 props: ['message']

export default {
  setup(props) {
    // 報錯: 類型“LooseRequired<{} & {}>”上不存在屬性“message”。
    console.log(props.message)  
  }
}

通過在組件選項對象中直接定義 props 屬性來進行運行時聲明

export default {
  props: {
    message: String,
    count: Number,
  },
  setup() {}
  // 組件的其他選項和邏輯
};

在這個例子中,message 被聲明為字符串類型的 Prop,count 被聲明為數(shù)字類型的 Prop。這種方式在運行時,Vue 會根據(jù)聲明的類型對傳入的 Props 進行驗證。

運行時聲明通常在不需要進行嚴格類型檢查或者需要更靈活地處理 Props 的情況下使用。它主要依賴于 Vue 的運行時機制來處理 Props 的傳遞和驗證。

傳遞給 defineProps() 的參數(shù)和提供給 props 選項的值是相同的,本質(zhì)上都是在使用 prop 選項。

Props 的驗證

Props 驗證的主要目的是確保組件接收到的數(shù)據(jù)符合預期的格式和類型。

類型驗證

  • 可以指定 Props 的類型,如 String、Number、BooleanArray、Object 等。
  • 也可以是函數(shù)類型 Function 、自定義類型。
<script setup lang="ts">
import { defineProps } from 'vue';
// 定義一個接口作為自定義類型
interface MyCustomType{
  property1: string;
  property2: number;
}
const props = defineProps({
  name: String,
  age: Number,
  hobbies: Array,
  address: Object,
  customType: MyCustomType, // 自定義類型
  onButtonClick: Function   // 函數(shù)類型
});
</script>

確保父組件傳遞給子組件的Props值與聲明的類型一致,避免類型錯誤。

必需性

- 可以指定 Props 是否為必需,如果為必需,則必須在父組件中傳入。
<script setup lang="ts">
import { defineProps } from 'vue';

const props = defineProps({
  message: {
    type: String,
    required: true
  }
});
</script>

在這個例子中,message 是必需的 Prop,如果父組件沒有傳遞 message ,則會拋出警告。

自定義驗證

- 可以使用 validator 函數(shù)進行自定義驗證。
<script setup lang="ts">
import { defineProps } from "vue";

let props = defineProps({
  b: {
    type: Number,
    validator: (value: number) => {
      return value >= 0; // 自定義驗證,確保寬度非負
    }
  }
})
console.log(props)
</script>

在這個例子中,b 使用了自定義驗證函數(shù),確保b 的值不為負數(shù)。

在父組件傳入b = -10,瀏覽器控制臺輸出警告:

默認值

可以為 Props 設置默認值,當父組件沒有傳遞該 Prop 時,子組件會使用默認值進行渲染。

<script setup lang="ts">
import { defineProps } from 'vue';

const props = defineProps({
  message: {
    type: String,
    default: 'Hello, Vue 3!',
  },
  count: {
    type: Number,
    default: 0,
  },
});
</script>

在這個例子中,message 的默認值為 'Hello, Vue 3!',count 的默認值為 0

withDefaults

在 Vue 3 中,withDefaults 是一個用于為 defineProps 定義的 props 設置默認值的函數(shù)。

withDefaults 參數(shù)說明:

  • withDefaults 的第一個參數(shù)是 defineProps 的返回值,它表示組件接收的 props 對象。
  • 第二個參數(shù)是一個對象,其中的鍵對應于 props 的名稱,值是相應的默認值。
    • 默認值是通過函數(shù)返回的。

假設有一個組件,定義了一些 props,并且希望為其中一些 props 設置默認值:

<template>
  <div>{{ props.message }}</div>
  <div>{{ props.count }}</div>
</template>
<script setup lang="ts">
import { defineProps, withDefaults } from 'vue';

// 定義了一個接口 PropsInter  來描述組件的 props 結構
interface PropsInter {
  message: string;
  count: number;
  obj: { a: number; b: number; };
  arr: string[];
}

const props = withDefaults(defineProps<PropsInter>(), {
  message: 'Hello, Vue 3!',
  count: 0,
  obj: () => {
  	return { a: 10, b: 5 }
  },
  arr: () => return [ 'item1', 'item2' ]
});
</script>

Boolean 類型轉(zhuǎn)換

當聲明為 Boolean 類型的 props 時,有特別的類型轉(zhuǎn)換規(guī)則,以便更貼近原生的 boolean attributes 的行為。

  • 當一個 prop 明確被聲明為布爾類型時,真值會被轉(zhuǎn)換為 true,假值會被轉(zhuǎn)換為 false
    • 當父組件傳遞一個真值(如 true、字符串 "true"、數(shù)字 1 等)時,該 prop 將被轉(zhuǎn)換為 true。
    • 當父組件傳遞一個假值(如 false、字符串 "false"、數(shù)字 0、空字符串 ""、null、undefined 等)時,該 prop 將被轉(zhuǎn)換為 false

在子組件中:

defineProps({
  disabled: Boolean
})

在父組件中:

<!-- 等同于傳入 :disabled="true" -->
<MyComponent disabled />
 
<!-- 等同于傳入 :disabled="false" -->
<MyComponent />
  • 當一個 prop 被聲明為允許多種類型時,聲明順序會影響 Boolean 轉(zhuǎn)換規(guī)則是否適用:
    • 當同時允許字符串和布爾類型時,如果布爾類型出現(xiàn)在字符串類型之前,Boolean 轉(zhuǎn)換規(guī)則才適用。
const props = defineProps({
  myProp: [Boolean, String],
});

如果父組件傳遞 "true",這個值將被轉(zhuǎn)換為布爾值 true。如果傳遞 "false",將被轉(zhuǎn)換為布爾值 false。其他字符串值將保持為字符串。
但是,如果聲明順序是 [String, Boolean],那么 "true" 和 "false" 將被視為字符串,而不會進行布爾類型的轉(zhuǎn)換。

這種邊緣情況可能會導致在不同的聲明順序下,相同的輸入值被解釋為不同的類型。

使用 Props

在父組件的模板中傳值給子組件:

<ChildComponent title="哈嘿" />

在子組件的模板中,可以直接使用定義的 Props:

<template>
  <div>{{ title }}</div>
</template>
<script setup lang="ts" name="ChildComponent">
import { defineProps } from "vue";
defineProps(['title'])

// console.log(title)  // 報錯:找不到名稱“title”。
</script>

在模板中,可以直接使用title。

console.log(title) 報錯:找不到名稱“title”。

這是因為title 并沒有被直接聲明為一個可用的變量。

在 Vue 3 的 <script setup> 中,defineProps 的返回值是一個包含傳入的 props 的對象。

如果想要在組件中使用 title ,需要通過defineProps的返回值來讀?。?/p>

<template>
  <div>{{ props.title }}</div>
</template>
<script setup lang="ts" name="ChildComponent">
import { defineProps } from "vue";
// 只接收title屬性
let props = defineProps(['title'])

console.log(props)

if(props.title) {
  console.log(props.title)
}
</script>

defineProps 返回一個對象 props,props 對象中包含了 title 屬性,可以通過 props.title 的方式來訪問和使用這個 prop 的值。

defineProps 的返回值是一個包含組件接收的 props 的只讀對象:

  • 返回的 props 對象是只讀的。
  • 返回的 props 對象包含了組件所有接收的東西:父組件傳遞給當前組件的所有被組件明確聲明為 props 的屬性。
    • 必須在defineProps中顯式的接收父組件傳遞的屬性。假如父組件傳了幾個屬性,比如<ChildComponent title="哈嘿" id="id12345" />,子組件defineProps(['title'])只接收title屬性,不會接收id屬性。
  • 在組件內(nèi)部不能直接修改 props 對象的屬性值。

實戰(zhàn)演練

types/index.ts定義一個PersonInter接口:

// 定義一個接口,用于限制對象的具體屬性
// 接口在 TypeScript 中用于定義一種契約,確保實現(xiàn)該接口的對象都具有相同的結構。
export interface PersonInter {
  id: string;
  name: string;
  age: number;
}

在父組件有一個person傳遞給子組件:

<template>
  <div>
    <ChildComponent :personList="personList" />
  </div>
</template>

<script setup lang="ts" name="Person">
// 在 TypeScript 中,import type 語法用于僅導入類型信息而不導入實際的值或函數(shù)。
// 使用 import type 導入的類型信息僅在類型檢查時使用,不會在運行時產(chǎn)生任何影響。
import type { PersonInter } from '@/types';

import { reactive } from 'vue';
import ChildComponent from './ChildComponent.vue';
let personList = reactive<PersonInter>({
  id: 'person001',
  name: 'John',
  age: 18
});
</script>

子組件:

<template>
  <div>{{ person.name }}</div>
</template>
<script setup lang="ts" name="ChildComponent">
import type { PersonInter } from '@/types';
import { defineProps } from "vue";

// 只接收person
let props = defineProps(['person'])
console.log(props)

// 接收person+類型限制
let props = defineProps<{ person: PersonInter }>()

// 接收person+類型限制+限制必要性+默認值
// ?表示不必傳,父組件可傳可不傳,如果父組件不傳,則使用默認值
// 指定默認值需要使用withDefaults
withDefaults(defineProps<{ person?: PersonInter }>(), {
  person: () => {
    return { id: 'person000', name: 'Alice', age: 18 }
  }
})

</script>
  • let props = defineProps(['person']) 只接收person,對person沒有任何限制。父組件可以給person賦任意類型的值。
  • defineProps<{ person: PersonInter }>(): 通過泛型參數(shù)指定了 props 的結構。具體來說,定義了一個名為 person 的 prop,其類型為 PersonInter
  • defineProps<{ person?: PersonInter }>():
    • 使用泛型參數(shù)指定了 props 的結構。定義了一個名為 person 的 prop,其類型為 PersonInter。
    • 后面的問號 ? 表示這個 prop 是可選的,即父組件可以選擇是否傳遞這個 prop。

總結 

到此這篇關于vue3 Props用法(父傳子)的文章就介紹到這了,更多相關vue3 Props用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • VUE+Canvas 實現(xiàn)桌面彈球消磚塊小游戲的示例代碼

    VUE+Canvas 實現(xiàn)桌面彈球消磚塊小游戲的示例代碼

    這篇文章主要介紹了VUE+Canvas 實現(xiàn)桌面彈球消磚塊小游戲,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Vue如何通過瀏覽器控制臺查看全局data值

    Vue如何通過瀏覽器控制臺查看全局data值

    在寫vue項目時想到一個問題,項目里面的文件都是一個個的組件,如何在控制臺中修改,查看組件data里的值呢,下面這篇文章主要給大家介紹了關于Vue如何通過瀏覽器控制臺查看全局data值的相關資料,需要的朋友可以參考下
    2023-04-04
  • vue input標簽通用指令校驗的實現(xiàn)

    vue input標簽通用指令校驗的實現(xiàn)

    這篇文章主要介紹了vue input標簽通用指令校驗的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • vue在路由中驗證token是否存在的簡單實現(xiàn)

    vue在路由中驗證token是否存在的簡單實現(xiàn)

    今天小編就為大家分享一篇vue在路由中驗證token是否存在的簡單實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Vue-element中el-input輸入卡頓問題的解決

    Vue-element中el-input輸入卡頓問題的解決

    這篇文章主要介紹了Vue-element中el-input輸入卡頓問題的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 實用的 vue tags 創(chuàng)建緩存導航的過程實現(xiàn)

    實用的 vue tags 創(chuàng)建緩存導航的過程實現(xiàn)

    這篇文章主要介紹了實用的 vue tags 創(chuàng)建緩存導航的過程實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • 詳細講一講vue3下會造成響應式丟失的情況

    詳細講一講vue3下會造成響應式丟失的情況

    vue3開發(fā)過程中,綁定的響應式數(shù)據(jù)失去了響應式,如何解決問題呢,下面這篇文章主要給大家介紹了關于vue3下會造成響應式丟失的情況,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • vue中axios的get請求和post請求的傳參方式、攔截器示例代碼

    vue中axios的get請求和post請求的傳參方式、攔截器示例代碼

    Post是向服務器提交數(shù)據(jù)的一種請求,get是向服務器發(fā)索取數(shù)據(jù)的一種請求,post在真正接受數(shù)據(jù)之前會先將請求頭發(fā)送給服務器進行確認,然后才真正發(fā)送數(shù)據(jù),本文給大家介紹vue中axios的get請求和post請求的傳參方式、攔截器示例代碼,感興趣的朋友一起看看吧
    2023-10-10
  • Vue組件設計升級之Composition API和Options API的區(qū)別

    Vue組件設計升級之Composition API和Options API的區(qū)別

    Vue中Composition API和Options API是Vue.js框架中的兩種不同的API,本文主要介紹了Composition API和Options API的區(qū)別,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • VueJS實現(xiàn)用戶管理系統(tǒng)

    VueJS實現(xiàn)用戶管理系統(tǒng)

    這篇文章主要為大家詳細介紹了VueJS實現(xiàn)用戶管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05

最新評論

阿合奇县| 开阳县| 温泉县| 江阴市| 平江县| 澄城县| 呼图壁县| 安徽省| 浮山县| 阿拉尔市| 珲春市| 东辽县| 武宣县| 松阳县| 邢台市| 扎鲁特旗| 张家界市| 太仓市| 高州市| 彰武县| 万宁市| 彝良县| 葵青区| 文水县| 广安市| 奈曼旗| 石泉县| 吐鲁番市| 元氏县| 曲阳县| 横山县| 砀山县| 武城县| 南阳市| 金阳县| 鲁山县| 浦县| 肥城市| 永安市| 昂仁县| 武宣县|