關於Vue中props的詳解


看一下官方文檔:

組件實例的作用域是孤立的。這意味着不能 (也不應該) 在子組件的模板內直接引用父組件的數據。父組件的數據需要通過 prop 才能下發到子組件中.

也就是props是子組件訪問父組件數據的唯一接口。
詳細一點解釋就是:
一個組件可以直接在模板里面渲染data里面的數據(雙大括號)。
子組件不能直接在模板里面渲染父元素的數據。
如果子組件想要引用父元素的數據,那么就在prop里面聲明一個變量(比如a),這個變量就可以引用父元素的數據。然后在模板里渲染這個變量(前面的a),這時候渲染出來的就是父元素里面的數據。

基本用法

<!--父組件-->
<template>
  <div>
      <hello-world2 :good = "good"></hello-world2> //向子組件傳值
  </div>
</template>

<script>
  import helloWorld2 from "./HelloWorld2"  //引用子組件頁面

  export default {
    name: "HelloWorld3",
    data() {
      return {
        good: "我是從hello word3傳遞過來的"
      }
    },
    components: {
      'hello-world2': helloWorld2   //注冊子組件
    },
  }
</script>
<!--子組件-->
<template>
    <div>{{good}}</div>
</template>

<script>
  export default {
    props: ['good'], //通過props獲取父組件傳遞過來的值
    data: function () {
      return {}
    },
    methods: {}
  }
</script>

總結:父組件通過v-bind向子組件傳值,子組件通過props來獲取父組件傳遞過來的值,被引用的就是子組件

camelCase vs. kebab-case:js中用駝峰式命名,在html中替換成短橫線分隔式命名

<!-- 在 HTML 中使用 kebab-case -->
<child my-message="hello!"></child>
 
<script>
    Vue.component('child', {
        // 在 JavaScript 中使用 camelCase
        props: ['myMessage'],
        template: '<span>{{ myMessage }}</span>'
    })
</script>

單向數據流: props是單向綁定的

父組件的屬性變化時,將傳導給子組件,但是反過來不會。
每次父組件更新時,子組件的所有 prop 都會更新為最新值。
不要在子組件內部改變 prop。如果你這么做了,Vue 會在控制台給出警告。
在兩種情況下,我們很容易忍不住想去修改 prop 中數據:

  1. Prop 作為初始值傳入后,子組件想把它當作局部數據來用;
  2. Prop 作為原始數據傳入,由子組件處理成其它數據輸出。
    對這兩種情況,正確的應對方式是:
    定義一個局部變量,並用 prop 的值初始化它:
 props: ['initialCounter'],
    data: function () {
      return { counter: this.initialCounter }
    }

定義一個計算屬性,處理 prop 的值並返回:

props: ['size'],
    computed: {
      normalizedSize: function () {
        return this.size.trim().toLowerCase()
      }
    }

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

舉個例子:

<div id="app3">
        <my-component :object='object'></my-component>
    </div>
    <script src="http://vuejs.org/js/vue.min.js"></script>
    <script>
        //
        var mycom = Vue.component('my-component', {
            //添加一個input改變子組件的childOject,那么父元素的object也會被改變,但是Vue沒有報錯!
            template: '<p>{{ object.name }} is {{ object.age }} years old.<br><input v-model="childObject.name" type="text"></p>',
            props: ['object','school'],
            data: function () {
                // 子組件的childObject 和 父組件的object 指向同一個對象
                return {
                    childObject: this.object
                }
            }
        });
        var app3 = new Vue({
            el: '#app3',
            data: {
                object:{
                    name: 'Xueying',
                    age: '21',
                },
                school:'SCUT',
            },
        })
    </script>

圖2-改變childObject.name,object.name也改變

圖3-控制台輸出app3.object.name

props驗證

可以為prop指定驗證規則,如果傳入的數據不符合要求,Vue會發出警告。
具體驗證規則見官方文檔:Prop驗證規則

$parent

$parent 也可以用來訪問父組件的數據。

而且子組件可以通過$parent 來直接修改父組件的數據,不會報錯!

可以使用props的時候,盡量使用props顯式地傳遞數據(可以很清楚很快速地看出子組件引用了父組件的哪些數據)。

另外在一方面,直接在子組件中修改父組件的數據是很糟糕的做法,props單向數據流就沒有這種顧慮了。


免責聲明!

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



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