在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 網頁設計教程 > 詳細頁面

Vue中用props給data賦初始值時遇到的問題及處理方法

Vue中用props給data賦初始值時遇到的問題及處理方法

更新時間:2025-12-07 文章作者:未知 信息來源:網絡 閱讀次數:

網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立...
網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立在超文本基礎之上的。超級文本標記語言之所以稱為超文本標記語言,是因為文本中包含了所謂“超級鏈接”點。
本篇文章給大家帶來的內容是關于Vue中用props給data賦初始值時遇到的問題及解決方法,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

前段時間做一個運營活動的項目,上線后產品反饋頁面埋點不對,在排查過程中發現,問題竟然是由于Vue中的data初始值導致,而data的初始值來自于props。為方便描述,現將問題抽象如下:

一、現象

代碼:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>用props初始化data中變量</title>
    <script src="https://cdn.bootcss.com/vue/2.5.16/vue.min.js"></script>
</head>
<body>
<div id="app">
    <user-info :user-data="user"></user-info>
</div>
<script>
    //全局組件
    let userInfo = Vue.component('userInfo' ,{
        name: 'user-info',
        props: {
            userData: Object
        },
        data() {
          return {
              userName: this.userData.name
          }
        },
        template: `
            <div>
                <div>姓名:{{userName}}</div>
                <div>性別:{{userData.gender}}</div>
                <div>生日:{{userData.birthday}}</div>
            </div>
        `
    });

    //Vue實例
    new Vue({
        el: '#app',
        data: {
            user: {
                name: '',
                gender: '',
                birthday: ''
            }
        },
        created(){
           this.getUserData();
        },
        methods:{
            getUserData(){
                setTimeout(()=>{
                    this.user = {
                        name: '于永雨',
                        gender: '男',
                        birthday: '1991-7'
                    }
                }, 500)
            }
        },
        components: {
            userInfo
        }
    });
</script>
</body>
</html>

代碼解讀:

  1. 根組件data中有一個對象:user,包含三個屬性:name、gender、birthday,初始值都為空字符串

  2. 模擬api異步請求,500毫秒后對user的重新賦值,三個屬性都不再為空

  3. 聲明一個子組件userInfo,props中有一個對象userData,用于接收父組件的user;data中有一個變量userName,初始值來自于userData.name

結果:

868320973-5bf9e66f0cf35_articlex.jpg

頁面初始化后,姓名、性別、生日都顯示為空,500毫秒后性別和生日顯示正常結果,僅姓名沒有變化。

為什么會這樣呢?

我最初的想法:user.name是String,屬于基本數據類型,用它給子組件data中userName賦值,屬于基本數據類型賦值,所以當父組件中user.name變化時,子組件中userName并不會隨之變化。

是這樣的嗎?于是我決定將user.name改為對象,通過引用數據類型賦值,然后觀察是否符合預期。代碼如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>用props初始化data中變量-對象形式</title>
    <script src="https://cdn.bootcss.com/vue/2.5.16/vue.min.js"></script>
</head>
<body>
<div id="app">
    <user-info :user-data="user"></user-info>
</div>
<script>
    //全局組件
    let userInfo = Vue.component('userInfo' ,{
        name: 'user-info',
        props: {
            userData: Object
        },
        data() {
          return {
              userName: this.userData.name
          }
        },
        template: `
            <div>
                <div>姓名:{{userName.text}}</div>
                <div>性別:{{userData.gender}}</div>
                <div>生日:{{userData.birthday}}</div>
            </div>
        `
    });


    //Vue實例
    new Vue({
        el: '#app',
        data: {
            user: {
                name: {text: ''},
                gender: '',
                birthday: ''
            }
        },
        created(){
           this.getUserData();
        },
        methods:{
            getUserData(){
                setTimeout(()=>{
                    this.user = {
                        name: {text: '于永雨'},
                        gender: '男',
                        birthday: '1991-7'
                    }
                }, 500)
            }
        },
        components: {
            userInfo
        }
    });
</script>
</body>
</html>

運行結果:姓名仍然沒有值,和第一次結果一樣!!!

二、原因

那么,原因到底是什么呢?百思不得解,后來和小伙伴們討論時,有人提出:會不會因為data在初始化時深拷貝?

我覺得這種解釋比較靠譜,于是去收集證據,首先去Vue官網翻了一下關于data的文檔,其中:

434540271-5bfbb5132e9c1_articlex.png

當看到"遞歸地"那個詞,基本上就能斷定上面的推論是正確的,因為深拷貝的核心原理就是遞歸

原來,Vue初始化時會遞歸地遍歷data所有的屬性,并使用Object.defineProperty把這些屬性全部轉為getter/setter,用于實現雙向綁定。官方文檔在Reactivity in Depth一章明確有說:

2191340175-5bfbb8747f671_articlex.png

還順便解釋了一下為什么Vue不支持IE8的原因:IE8不支持Object.defineProperty。

三、解決辦法

既然因為data深拷貝的原因,data無法隨著props的變化而更新,我們很自然的就想到Vue中有監聽作用的兩個功能:watch、computed
修改代碼如下,觀察結果:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>解決方案:watch、computed</title>
    <script src="https://cdn.bootcss.com/vue/2.5.16/vue.min.js"></script>
</head>
<body>
<div id="app">
    <user-info :user-data="user"></user-info>
</div>
<script>
    //全局組件
    let userInfo = Vue.component('userInfo' ,{
        name: 'user-info',
        props: {
            userData: Object
        },
        data() {
          return {
            userName: this.userData.name
          }
        },
        computed: {
            computedUserName(){
                return this.userData.name
            }
        },
        watch: {
            'userData.name': function (val) {//監聽props中的屬性
                this.userName = val;
            }
        },
        template: `
            <div>
                <div>姓名(watch):{{ userName }}</div>
                <div>姓名(computed):{{ computedUserName }}</div>
                <div>性別:{{ userData.gender }}</div>
                <div>生日:{{ userData.birthday }}</div>
            </div>
        `
    });


    //Vue實例
    new Vue({
        el: '#app',
        data: {
            user: {
                name: '',
                gender: '',
                birthday: ''
            }
        },
        created(){
           this.getUserData();
        },
        methods:{
            getUserData(){
                setTimeout(()=>{
                    this.user = {
                        name: '于永雨',
                        gender: '男',
                        birthday: '1991-7'
                    }
                }, 500)
            }
        },
        components: {
            userInfo
        }
    });
</script>
</body>
</html>

運行結果

1450334126-5bfbc2256a927_articlex.png

完美!!!

四、總結:關于Vue中props的要點

事后又仔細翻了一下關于props的文檔:

246091987-5bfbbb263f05f_articlex.png

大概梳理一下:

1.props是單向數據流:父組件的數據變化,通過props實時反應在子組件中,反之不然

2.不允許在子組件中直接操作props

3.可以變相操作props

(1)在data中聲明局部變量,并用props初始化,弊端:局部變量不隨著props更新而更新

(2)在computed中對props值轉換后輸出

以上就是Vue中用props給data賦初始值時遇到的問題及解決方法的詳細內容,更多請關注php中文網其它相關文章!


網站建設是一個廣義的術語,涵蓋了許多不同的技能和學科中所使用的生產和維護的網站。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 一级淫片在线观看| 国产又粗又长又爽又黄的视频| 手机看片福利盒子久久| 超薄肉色丝袜足j调教99| 亚洲 欧美 另类人妖| 91九色在线观看视频| 日本一区午夜艳熟免费| avove在线观看| 今天免费高清在线观看国语| 亚洲一区二区偷拍| gogogo高清免费观看在线视频| 男女视频一区二区三区| 50路60路老熟妇啪啪| 成人一级片网站| 成人午夜视频免费在线观看| 日韩一级性生活片| 国产曰肥老太婆无遮挡| 91精品国产91久久久久麻豆 主演| 狠狠干视频网站| 国内自拍中文字幕| 日韩xxxx视频| 免费日韩中文字幕| 久久国产精品国产精品| 中日韩av在线播放| 国产免费xxx| 日韩av高清在线看片| 国产精品自拍片| 色一情一乱一伦一区二区三区日本| 九色porny91| 亚洲一区二区福利视频| 日韩视频一二三| 欧美网站免费观看| 国产永久免费网站| www.avtt| 岛国毛片在线播放| 99精品一级欧美片免费播放| 黄色a级在线观看| 精品免费久久久久久久| 国产一线二线三线女| 九九九九免费视频| 97免费视频观看| 国产 福利 在线| 91精品国产毛片武则天| 日韩一级性生活片| 在线观看免费黄网站| 四季av一区二区三区| 一区二区三区日韩视频| 91麻豆天美传媒在线| 黄色www网站| 色乱码一区二区三区在线| 9999在线观看| 国产高清精品在线观看| www午夜视频| 成人毛片100部免费看| 国产精品网站免费| www.51色.com| 日本a视频在线观看| 国产九九热视频| 国产3p露脸普通话对白| 国产精品区在线| 91动漫在线看| 国产视频1区2区3区| 欧美狂野激情性xxxx在线观| 成人黄色一区二区| 国产精品av免费| 日韩久久一级片| 人人妻人人澡人人爽欧美一区双| 青青草原av在线播放| 四虎免费在线观看视频| 国产福利影院在线观看| 黄色成人免费看| 青青青在线观看视频| 一本色道久久亚洲综合精品蜜桃| 成年人视频观看| 精品一区二区成人免费视频| www午夜视频| 538在线视频观看| 国产成年人在线观看| 日本熟妇人妻中出| 天堂…中文在线最新版在线| 99久久久无码国产精品性色戒| 九九热在线免费| 久久久久久久久久久久久久国产| 欧美一级欧美一级| 欧洲美女和动交zoz0z| 制服丝袜综合网| 五月天婷婷亚洲| 久久午夜夜伦鲁鲁一区二区| 六月婷婷在线视频| 成人一级生活片| 久久国产精品网| 天堂av.com| 超碰在线免费观看97| 永久免费看av| 久久这里只有精品18| 国产欧美精品aaaaaa片| 国产又黄又爽免费视频| 日本一二三区在线| 青青草原网站在线观看| 精品国产av无码一区二区三区| 日韩欧美猛交xxxxx无码| 色欲色香天天天综合网www| 国产特级黄色大片| 亚洲熟妇无码一区二区三区导航| 日本在线视频www| 欧美成人免费高清视频| 国产精品乱码久久久久| xxww在线观看| 久久手机在线视频| 免费黄色福利视频| 婷婷激情四射五月天| 不卡中文字幕在线观看| 欧美性潮喷xxxxx免费视频看| 久久av综合网| 波多野结衣xxxx| 免费看欧美黑人毛片| 116极品美女午夜一级| 蜜臀一区二区三区精品免费视频| 色噜噜狠狠一区二区| 日韩精品视频久久| www.欧美激情.com| 久久视频这里有精品| 在线观看国产福利| www.成年人视频| 婷婷激情5月天| 成人免费观看视频在线观看| 成人av毛片在线观看| 波多野结衣综合网| 亚洲精品久久久久久宅男| 超碰人人爱人人| 亚洲欧美手机在线| 一卡二卡三卡视频| 亚洲自拍偷拍一区二区三区| 欧美在线观看视频网站| 国产精品久久久久久久久电影网| 999在线免费视频| 欧美日韩成人免费视频| 国产精品h视频| 九九热99视频| 男女爽爽爽视频| 欧美亚洲一二三区| 日本黄色片一级片| 九九热精品国产| 久久国产精品国产精品| 久久久亚洲精品无码| 欧美性受xxxx黒人xyx性爽| 亚洲成熟丰满熟妇高潮xxxxx| 日本欧美黄色片| 喜爱夜蒲2在线| 91欧美一区二区三区| 少妇黄色一级片| 成人性视频欧美一区二区三区| 日本中文字幕网址| 青青草国产免费| 日韩人妻无码精品久久久不卡| 强开小嫩苞一区二区三区网站 | 亚洲少妇第一页| 韩国日本在线视频| 国产日产欧美视频| 免费黄色日本网站| 午夜精品久久久内射近拍高清| 我的公把我弄高潮了视频| 日本福利视频一区| 国产精彩视频一区二区| 欧美精品自拍视频| 老司机激情视频| 久久综合九色综合88i| 亚洲熟妇无码一区二区三区| 国产在线青青草| 精品久久久久久无码国产| 四虎永久在线精品无码视频| 男女爽爽爽视频| 凹凸国产熟女精品视频| 久久久九九九热| 亚洲精品无码国产| 97在线免费公开视频| 日韩精品视频一二三| 300部国产真实乱| 欧美网站免费观看| 美女在线视频一区二区| 特级黄色录像片| 国产二级片在线观看| 人人干人人干人人| 国产毛片久久久久久| 四虎4hu永久免费入口| 免费一级特黄毛片| www.久久av.com| 成品人视频ww入口| 亚欧美在线观看| av在线观看地址| 8x8x最新地址| 免费一级特黄毛片| 91插插插影院| 中文字幕无码不卡免费视频| 男人添女荫道口女人有什么感觉| 中文字幕有码av| 黄页免费在线观看视频| www激情五月| 欧美日韩中文在线视频| 男同互操gay射视频在线看|