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

詳解vue.js之props傳遞參數(shù)

 更新時(shí)間:2017年12月12日 08:33:43   投稿:laozhang  
給大家詳細(xì)分析了vue.js之props傳遞參數(shù)的相關(guān)知識(shí)以及問(wèn)題解決方法,需要的朋友參考下吧。

本篇文章通過(guò)demo實(shí)例給大家詳細(xì)分析了props傳遞參數(shù)的用法以及遇到問(wèn)題后的解決辦法,以下是全部?jī)?nèi)容。

前段時(shí)間用vue做一個(gè)后臺(tái)管理系統(tǒng),其中每一頁(yè)都需要一個(gè)表格來(lái)展示信息。自然就想到了將表格提取出來(lái)做成公共組件,將不同頁(yè)面的數(shù)據(jù)傳入進(jìn)行渲染,達(dá)到復(fù)用的目的。

demo地址

1. 問(wèn)題發(fā)現(xiàn)

在父組件中,需要向表格組件傳遞的數(shù)據(jù)有表格的內(nèi)容數(shù)據(jù)tableData,表格的頁(yè)面數(shù)據(jù)page。

<div>
 <my-table :table-data="tableData" :page-info="pageInfo" id="myTable"></my-table>
</div>

其中tableData是個(gè)Array對(duì)象,是所有需要在表格中展示的數(shù)據(jù)對(duì)象組成的一個(gè)數(shù)組。而pageInfo是個(gè)Object對(duì)象,包含了表格頁(yè)面信息。在父組件對(duì)兩個(gè)數(shù)據(jù)對(duì)如下初始化,形式如下

tableData:[],
pageInfo: {
 current: 1, // 當(dāng)前是第幾頁(yè)
 total: 100, // 數(shù)據(jù)對(duì)象的總數(shù)
 size: 20 // 每頁(yè)顯示的數(shù)量
}

 

按照官方文檔上的說(shuō)明,prop是單向綁定的,不應(yīng)該在子組件內(nèi)部改變prop。之所以有想修改prop中數(shù)據(jù)的沖動(dòng),主要是prop作為初始值傳入后,子組件想把它當(dāng)作局部數(shù)據(jù)來(lái)用。對(duì)于這種情況,官方的說(shuō)法是定義一個(gè)局部變量,并用 prop 的值初始化它:

props: ['tableData', 'pageInfo'],
data() {
 return {
  tData: this.tableData,
  page: this.pageInfo
 }
}

然后根據(jù)官方文檔的說(shuō)法,當(dāng)每次父組件更新時(shí),子組件的所有prop都會(huì)更新為最新值。而tableData和pageInfo的信息是異步通過(guò)api從server端獲取的:

{
 error: 0,
 msg: "調(diào)用成功.",
 data: {
  restrictioninfo: [...],
  total: 42
 }
}

 

因此當(dāng)獲取到數(shù)據(jù)時(shí)父組件需要改變傳入子組件中的值:

me.tableData = Json.data.restrictioninfo;
me.pageInfo.total = Json.data.total;

按理說(shuō)這時(shí)候子組件中的值應(yīng)該更新成server返回的值,但是子組件頁(yè)面的總數(shù)更新了,但table數(shù)據(jù)依然是初始化時(shí)的空數(shù)組。(黑人問(wèn)號(hào)???)


。

2.賦值與綁定

首先需要定位數(shù)據(jù)是在哪個(gè)地方出了問(wèn)題,于是我做了一個(gè)demo來(lái)定位問(wèn)題。

首先看父組件與子組件中各元素的初始值:


然后當(dāng)只改變父組件中數(shù)組的引用時(shí)可以看到子組件的props數(shù)組隨之改變,而子組件中綁定的數(shù)組確并沒(méi)有隨之改變


因此,可以發(fā)現(xiàn),問(wèn)題是出在了這一步

props: ['tableData', 'pageInfo'],
data() {
 return {
  tData: this.tableData,
  page: this.pageInfo
 }
}

 

而要弄清楚問(wèn)題的根源,就得弄清楚vue文檔中深入響應(yīng)式原理。


"在Vue實(shí)例的data選項(xiàng)中,Vue將遍歷此對(duì)象所有的屬性,并使用Object.defineProperty把這些屬性全部轉(zhuǎn)為 getter/setter","每個(gè)組件實(shí)例都有相應(yīng)的 watcher 實(shí)例對(duì)象,它會(huì)在組件渲染的過(guò)程中把屬性記錄為依賴,之后當(dāng)依賴項(xiàng)的 setter 被調(diào)用時(shí),會(huì)通知 watcher 重新計(jì)算,從而致使它關(guān)聯(lián)的組件得以更新。"文檔中說(shuō)了這么一大堆,簡(jiǎn)單理解就是Vue將data選項(xiàng)中的vm.$data.a與DOM中的vm.a進(jìn)行了雙向綁定,即其中一個(gè)變化,另一個(gè)也會(huì)跟著變化。在Vue源碼中是由defineReactive$$1函數(shù)實(shí)現(xiàn)的:

但在子其中主要是利用了Object.defineProperty的get和set方法實(shí)現(xiàn)了雙向綁定。而在子組件中,pros數(shù)據(jù)和子組件的$data是通過(guò)如下方式聯(lián)系在一起的:

tData: this.tableData

 

查詢Vue源碼可知this.tableData與tData之間僅僅是賦值,即"="關(guān)系

而上述的initData函數(shù)是在組件構(gòu)建時(shí)候執(zhí)行的,因此只會(huì)在create時(shí)執(zhí)行一次。這也是為什么官方文檔中"作為初始值傳入"這一說(shuō)法,因?yàn)樗揪椭粫?huì)執(zhí)行一次。當(dāng)組件構(gòu)建完成后,this.tableData與tData就沒(méi)有半毛錢(qián)關(guān)系了,其中一個(gè)的變化并不會(huì)引起另一個(gè)變化。當(dāng)然,這種說(shuō)法并不準(zhǔn)確,因?yàn)樵谏衔闹?,我們?dòng)態(tài)改變父組件傳入的total,子組件也"隨之"改變,感覺(jué)就像是綁定在一起了啊,這又是怎么回事呢?

3.引用類(lèi)型帶來(lái)的假象

當(dāng)然,我們還是要從官方文檔出發(fā)來(lái)解決這個(gè)問(wèn)題。文檔中有這樣一個(gè)提示:


這里就需要理解引用類(lèi)型的概念,引用數(shù)據(jù)類(lèi)型值指保存在堆內(nèi)存中的對(duì)象。也就是,變量中保存的實(shí)際上的只是一個(gè)指針,這個(gè)指針指向內(nèi)存中的另一個(gè)位置,該位置保存著對(duì)象。訪問(wèn)方式是按引用訪問(wèn)。例如一個(gè)js對(duì)象a,他在內(nèi)存中的存儲(chǔ)形式如下圖所示:

var a = new Object();

 


當(dāng)操作時(shí),需要先從棧中讀取內(nèi)存地址,然后再延指針找到保存在堆內(nèi)存中的值再操作。

a.name = 'xz';

 


引用類(lèi)型變量賦值,本質(zhì)上賦值的是存儲(chǔ)在棧中的指針,將指針復(fù)制到棧中未新變量分配的空間中,而這個(gè)指針副本和原指針指向存儲(chǔ)在堆中的同一個(gè)對(duì)象;賦值操作結(jié)束后,兩個(gè)變量實(shí)際上將引用同一個(gè)對(duì)象。因此,在使用時(shí),改變其中的一個(gè)變量的值,將影響另一個(gè)變量。

var b = a;

 


在了解了引用類(lèi)型之后,我們?cè)趤?lái)看看上文提到的動(dòng)態(tài)改變傳入子組件前后內(nèi)存中的情況:

me.tableData = Json.data.restrictioninfo;
me.pageInfo.total = Json.data.total;
========================================
props: ['tableData', 'pageInfo'],
data() {
 return {
  tData: this.tableData,
  page: this.pageInfo
 }
}

 

首先對(duì)tableData的改變是改變了其引用的指針,而對(duì)pageInfo則改變了其中一個(gè)屬性的值,因此動(dòng)態(tài)改變前:


動(dòng)態(tài)改變后:


這樣就解釋了為什么子組件頁(yè)面的總數(shù)更新了,但table數(shù)據(jù)依然是初始化時(shí)的空數(shù)組。因?yàn)橐妙?lèi)型的存在,我們動(dòng)態(tài)改變父組件傳入的total,子組件也"隨之"改變了。

相關(guān)文章

  • 基于Vue 2.0的模塊化前端 UI 組件庫(kù)小結(jié)

    基于Vue 2.0的模塊化前端 UI 組件庫(kù)小結(jié)

    AT-UI 是一款基于 Vue.js 2.0 的輕量級(jí)、模塊化前端 UI 組件庫(kù),主要用于快速開(kāi)發(fā) PC 網(wǎng)站產(chǎn)品。下面通過(guò)本文給大家介紹Vue 2.0的模塊化前端 UI 組件庫(kù),需要的朋友參考下吧
    2017-12-12
  • Vue集成lodop插件實(shí)現(xiàn)打印功能

    Vue集成lodop插件實(shí)現(xiàn)打印功能

    lodop 取意自“l(fā)oad or print”,是一款優(yōu)秀的 Web 打印控件。本文將在Vue中集成lodop插件實(shí)現(xiàn)打印功能,感興趣的小伙伴可以了解一下
    2023-01-01
  • vue之原生上傳圖片加水印并壓縮圖片大小方式

    vue之原生上傳圖片加水印并壓縮圖片大小方式

    文章介紹了如何使用Vue原生上傳圖片,并在圖片上添加水印并壓縮圖片大小,首先,安裝了相應(yīng)的插件并進(jìn)行封裝,然后,介紹了添加水印的方法和上傳圖片的過(guò)程,最后,作者分享了自己的經(jīng)驗(yàn),并希望對(duì)大家有所幫助
    2025-01-01
  • Vue集成TinyMCE富文本編輯器的流程步驟

    Vue集成TinyMCE富文本編輯器的流程步驟

    TinyMCE 是一款功能強(qiáng)大的富文本編輯器,廣泛應(yīng)用于各種 Web 應(yīng)用中,本文將詳細(xì)介紹如何在 Vue 項(xiàng)目中集成 TinyMCE,通過(guò)詳盡的步驟說(shuō)明、示例代碼展示以及豐富的配置選項(xiàng),助力開(kāi)發(fā)者輕松實(shí)現(xiàn)內(nèi)容編輯的增強(qiáng)與美化,需要的朋友可以參考下
    2024-11-11
  • Vue實(shí)現(xiàn)監(jiān)聽(tīng)dom節(jié)點(diǎn)寬高變化方式

    Vue實(shí)現(xiàn)監(jiān)聽(tīng)dom節(jié)點(diǎn)寬高變化方式

    這篇文章主要介紹了Vue實(shí)現(xiàn)監(jiān)聽(tīng)dom節(jié)點(diǎn)寬高變化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Jenkins自動(dòng)化部署Vue項(xiàng)目的方法實(shí)現(xiàn)

    Jenkins自動(dòng)化部署Vue項(xiàng)目的方法實(shí)現(xiàn)

    本文主要介紹了Jenkins自動(dòng)化部署Vue項(xiàng)目的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • vue3點(diǎn)擊不同的菜單頁(yè)切換局部頁(yè)面實(shí)現(xiàn)方法

    vue3點(diǎn)擊不同的菜單頁(yè)切換局部頁(yè)面實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于vue3點(diǎn)擊不同的菜單頁(yè)切換局部頁(yè)面實(shí)現(xiàn)的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用vue3具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-08-08
  • vue項(xiàng)目中使用天地圖的簡(jiǎn)單代碼示例

    vue項(xiàng)目中使用天地圖的簡(jiǎn)單代碼示例

    這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目中使用天地圖的相關(guān)資料,在Vue.js項(xiàng)目中使用天地圖,首先需要申請(qǐng)apikey并在index.html中引入天地圖的js文件,然后創(chuàng)建一個(gè)div元素作為地圖容器,并通過(guò)CSS設(shè)置其樣式,需要的朋友可以參考下
    2024-11-11
  • 淺談Vue.js應(yīng)用的四種AJAX請(qǐng)求數(shù)據(jù)模式

    淺談Vue.js應(yīng)用的四種AJAX請(qǐng)求數(shù)據(jù)模式

    本篇文章主要介紹了淺談Vue.js應(yīng)用的四種AJAX請(qǐng)求數(shù)據(jù)模式,本文將詳細(xì)介紹在Vue應(yīng)用程序中實(shí)現(xiàn)AJAX的四個(gè)方法,有興趣的可以了解一下
    2017-08-08
  • vue 指定組件緩存實(shí)例詳解

    vue 指定組件緩存實(shí)例詳解

    keep-alive 是 Vue 內(nèi)置的一個(gè)組件,可以使被包含的組件保留狀態(tài),或避免重新渲染。這篇文章主要介紹了vue 指定組件緩存,需要的朋友可以參考下
    2018-04-04

最新評(píng)論

南充市| 永寿县| 南江县| 普安县| 镇江市| 潮州市| 祁连县| 巫溪县| 喀什市| 中方县| 泸定县| 红原县| 房产| 常山县| 禄劝| 绩溪县| 定日县| 萝北县| 肥城市| 临夏市| 化隆| 治多县| 凤庆县| 营山县| 兴义市| 从化市| 自贡市| 江安县| 南江县| 枣阳市| 新蔡县| 鄂托克旗| 芜湖市| 光泽县| 尚志市| 天柱县| 淅川县| 新蔡县| 黔东| 伽师县| 南靖县|