所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。
额外的,每次父级组件发生变更时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。

这里有两种常见的试图改变一个 prop 的情形:

  • 这个 prop 用来传递一个初始值;这个子组件接下来希望将其作为一个本地的 prop 数据来使用。在这种情况下,最好定义一个本地的 data property 并将这个 prop 用作其初始值:

    1. props: ['initialCounter'],
    2. data: function () {
    3. return {
    4. counter: this.initialCounter
    5. }
    6. }
  • 这个 prop 以一种原始的值传入且需要进行转换。在这种情况下,最好使用这个 prop 的值来定义一个计算属性:

    1. props: ['size'],
    2. computed: {
    3. normalizedSize: function () {
    4. return this.size.trim().toLowerCase()
    5. }
    6. }

    数组与对象

    当prop 是一个数组与对象时,传递进来的是该数组或对象的索引值,子组件修改该数组或对象,父级也会跟着修改,简单来说父级与子组件中间传递的数组与对象都是存储该数组或对象的索引值,
    假如不想更改父级的数组或对象,应该数据进行深度克隆
    示例

    1. <section id="app" >
    2. <hr>
    3. <p>数组</p>
    4. <button @click='num++'>father:{{arr}}</button>
    5. <br>
    6. <app-son-2 :arr='arr'></app-son-2>
    7. </section>
    8. <script>
    9. Vue.component('app-son-2',{
    10. props:['arr'],
    11. data(){
    12. return {
    13. myArr:[...this.arr] // 将传递过来的数组展开
    14. }
    15. },
    16. template:`
    17. <button @click='myArr.push(555)'>son:{{ myArr }}</button>
    18. `
    19. })
    20. const vm = new Vue({
    21. el: '#app',
    22. data: {
    23. num:0,
    24. arr:[1,2,3,4]
    25. },
    26. })
    27. </script>