Vue 從入門到進階之路(九)


之前的文章我們介紹了 vue 中父組件之間的傳值,本章我們再來看一下父子組件間傳值的參數校驗和非 Props 特性。

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>vue</title>
 6     <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
 7 </head>
 8 <body>
 9 <div id="app">
10     <child :title="123"></child>
11 </div>
12 <script>
13     Vue.component("child", {
14         props: ['title'],
15         template: `
16             <p>{{title}}</p>
17        `
18     });
19     var app = new Vue({
20         el: '#app',
21         data: {
22             title: "hello world"
23         },
24     })
25 </script>
26 </body>
27 </html>

 

上面的代碼中我們我們在父組件中定義了一個 title 數據,並通過 :title="" 的形式將 title 數據傳給子組件 child,然后子組件通過 props 屬性接收該 title,通過 template 模板將 title 輸出,結果如下:

但是我們現在有這樣一個需求,子組件想要校驗父組件傳過來的值,如果符合才顯示,那么我們就可以通過 props 屬性進行校驗,在上面的代碼中我們定義 props 為一個數組對象,其實我們可以將 props 定義為一個對象,如下:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>vue</title>
 6     <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
 7 </head>
 8 <body>
 9 <div id="app">
10     <child :title="title"></child>
11 </div>
12 <script>
13     Vue.component("child", {
14         props: {
15             title: Number
16         },
17         template: `
18             <p>{{title}}</p>
19        `
20     });
21     var app = new Vue({
22         el: '#app',
23         data: {
24             title: "hello world"
25         },
26     })
27 </script>
28 </body>
29 </html>

在上面的代碼我們將 props 改為了對象形式,並且定義 title: Number,意思是將 title 定義為一個 Number 類型,我們現在在頁面上看一下結果:

在控制台報錯,意思說 tltle: "hello world" 是一個字符串,但我們在子組件定義為了一個 Number 類型,兩者不符所以報錯,所以我們可以將 props 下的 title 定義為 String 類型就可以了,當然我們也可以這樣寫 : title: [Number, String] ,意思是傳入的 title 值既可以是 Number 類型也可以是 String 類型。

在 props 下的數據我們還可以定義其他屬性,如下:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>vue</title>
 6     <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
 7 </head>
 8 <body>
 9 <div id="app">
10     <child :title="title"></child>
11 </div>
12 <script>
13     Vue.component("child", {
14         props: {
15             title: {
16                 type: [Number, String],
17                 required: true,
18                 default: "hi vue",
19                 validator(value){
20                     return value.length > 5
21                 }
22             },
23         },
24         template: `
25             <p>{{title}}</p>
26        `
27     });
28     var app = new Vue({
29         el: '#app',
30         data: {
31             title: "hello world"
32         },
33     })
34 </script>
35 </body>
36 </html>

上面的代碼中我們將 props 中的 title 定義為了一個對象,對象中

  type 表示驗證父組件傳入數據的類型,

  required 表示該值是否必須傳入,false 表示可以不傳入,true 表示必須傳入,即 <child> 標簽內是否寫 :title="" 傳入該值。

  default 表示傳入該值的默認值,如果上面的 required 為 false 並且父組件並沒有傳入 title 值,我們可以自己定義 title 的值。

  validator 表示驗證的方法,我們可以自己定義傳入值的校驗方法,如傳入值的長度等。

接下來我們說一下 props 特性和非 props 特性,在上面的代碼中我們對父組件傳過來的值都用 props 屬性進行了接收,我們就可以把這個稱為 props 特性,那它跟非 props 特性有什么區別的,非 props 特性就是我們不在 props 里接收父組件傳過來的值,那么如果我們在子組件的 template 模板中使用該值,則會報錯,同時非 props 特性會在 HTML 頁面代碼內暴露出傳過來的值,即 title="",props 特性則不會,如下:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>vue</title>
 6     <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
 7 </head>
 8 <body>
 9 <div id="app">
10     <child :title="title"></child>
11 </div>
12 <script>
13     Vue.component("child", {
14         props: {
15             // title: {
16             //     type: [Number, String],
17             //     required: true,
18             //     default: "hi vue",
19             //     validator(value){
20             //         return value.length > 5
21             //     }
22             // },
23         },
24         template: `
25             <p>{{title}}</p>
26        `
27     });
28     var app = new Vue({
29         el: '#app',
30         data: {
31             title: "hello world"
32         },
33     })
34 </script>
35 </body>
36 </html>

 

我們在 props 中沒有接收父組件傳過來的 title 數據就在 template 模板中使用,則會在控制台報錯,且在 HTML 代碼中將 title: "hello word" 暴露在了標簽內。props 特性接收 title 值的會就不會出現上面的情況。

 

以上代碼演示我們是基於引入開發環境的 js 來演示的,即

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

如果我們使用生產環境則不會出現上面的控制台警告報錯,這是為了線上使用閱讀者舒適的閱讀,生產版本如下:

<script src="https://cdn.jsdelivr.net/npm/vue"></script>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM