国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

Vue中props的詳解

2019-11-19 11:33:02
字體:
來源:轉載
供稿:網友

看一下官方文檔:

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

也就是props是子組件訪問父組件數據的唯一接口。

詳細一點解釋就是:

一個組件可以直接在模板里面渲染data里面的數據(雙大括號)。

子組件不能直接在模板里面渲染父元素的數據。

如果子組件想要引用父元素的數據,那么就在prop里面聲明一個變量(比如a),這個變量就可以引用父元素的數據。然后在模板里渲染這個變量(前面的a),這時候渲染出來的就是父元素里面的數據。

1. 基本用法

圖1-props

 <div id="app1">    <!-- hello引用父元素的hello,它也可以引用message,greet,world等 -->    <child :hello='hello'></child>  </div>  <script>    var com1 = Vue.component('child',{      // 聲明在prop中的變量可以引用父元素的數據      props:['hello'],      // 這里渲染props中聲明的那個hello      template:'<div><p>{{ hello }}</p></div>',    })     var app1 = new Vue ({      el: '#app1',      data: {        greet: {          hello:'hello,',          world: 'world',        },        message: 'message1',      }    })  </script>

2. 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>

3.單向數據流: 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

4. props驗證

可以為prop指定驗證規則,如果傳入的數據不符合要求,Vue會發出警告。

具體驗證規則見官方文檔:Prop驗證規則

5. $parent

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

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

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

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

以上所述是小編給大家介紹的Vue中props的詳解詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 凉城县| 巨野县| 龙海市| 惠东县| 新绛县| 泸西县| 镇康县| 米林县| 宜章县| 阿拉尔市| 东台市| 伊吾县| 咸宁市| 广南县| 金堂县| 陆河县| 麻阳| 沾化县| 凌云县| 乐清市| 弋阳县| 得荣县| 莆田市| 延边| 岢岚县| 郓城县| 两当县| 伽师县| 宁武县| 镇沅| 长阳| 上思县| 沅陵县| 宁远县| 望城县| 五台县| 无为县| 遂宁市| 林西县| 微山县| 连云港市|