<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        vue組件中watch props根據v-if動態判斷并掛載DOM的問題

        來源:懂視網 責編:小采 時間:2020-11-27 21:57:11
        文檔

        vue組件中watch props根據v-if動態判斷并掛載DOM的問題

        vue組件中watch props根據v-if動態判斷并掛載DOM的問題:問題復現:父組件中通過名為 source 的 prop 向子組件 Chart 傳入數據 <Chart :source=chartData></Chart> import Chart from '../components/Chart' export default { name: 'Home', com
        推薦度:
        導讀vue組件中watch props根據v-if動態判斷并掛載DOM的問題:問題復現:父組件中通過名為 source 的 prop 向子組件 Chart 傳入數據 <Chart :source=chartData></Chart> import Chart from '../components/Chart' export default { name: 'Home', com

        在代碼中增加一行代碼:

        watch: {
         source (newVal, oldVal) {
         console.log(newVal, this.$refs.main) // [Array ...] undefined
         this.setOpts()
         }
         },
        

        啟示 source 數據雖然有了,但 div 還并未掛載,因此 echarts 無法完成初始化

        那么想當然的我們就會去在 mounted 生命周期函數中調用 setOpts 方法:

        mounted () {
         console.log(this.source, this.$refs.main) // [] undefined
         this.setOpts()
         },
        

        這樣也是錯的,因為模板語法中使用了 v-if,那么當 source 并未滿足條件的時候,div 當然也不會掛載。因此 div 仍然無法訪問到。

        Error in mounted hook: "TypeError: Cannot read property 'getAttribute' of undefined"

        解決辦法是要么去掉 v-if 要么換另一種寫法

        有時我們需要在沒有數據的情況下增加一個占位標簽用來展示一些額外的提醒信息,如“暫未獲取到數據”等。那么去掉 v-if 肯定不行。

        既然如此我們保留 v-if 但寫法有所改變:

        修改 Chart 組件:

        <template>
         <div>
         <div id="main" ref="main" style="width: 600px;height: 400px;"></div>
         </div>
        </template>
        

        我們只需要一個 source 數據源,當 mounted 的時候調用 setOpts 方法,當 watch 數據變化的時候再次調用以更新數據

        export default {
         name: 'Chart',
         props: ['source'],
         mounted () {
         this.setOpts()
         },
         watch: {
         source () {
         this.setOpts()
         }
         },
         methods: {
         setOpts () {
         let myChart = this.$echarts.init(this.$refs.main)
         myChart.setOption({
         dataset: {
         dimensions: ['score', 'amount', 'product'],
         source: this.source
         },
         xAxis: { type: 'category' },
         yAxis: {},
         series: [
         {
         type: 'bar',
         encode: {
         x: 'product',
         y: 'amount'
         }
         }
         ]
         })
         }
         }
        }

        v-if 的判斷我們把他移出去了我們判斷 chartData 是否獲取到,一旦獲取到數據,馬上加載 Chart 組件,這樣就可以避開在組件內部調用 v-if 帶來的問題:

        <template>
         <div>
         <Chart :source="chartData" v-if="flag"></Chart>
         <div v-else>none</div>
         </div>
        </template>
        import Chart from '../components/Chart'
        
        export default {
         name: 'Home',
         components: { Chart },
         data () {
         return {
         chartData: [],
         flag: false
         }
         },
         methods: {
         getData () {
         setTimeout(() => {
         this.chartData = [
         [89.3, 58212, 'Matcha Latte'],
         [57.1, 78254, 'Milk Tea'],
         [74.4, 41032, 'Cheese Cocoa'],
         [50.1, 12755, 'Cheese Brownie'],
         [89.7, 20145, 'Matcha Cocoa'],
         [68.1, 79146, 'Tea'],
         [19.6, 91852, 'Orange Juice'],
         [10.6, 101852, 'Lemon Juice'],
         [32.7, 20112, 'Walnut Brownie']
         ]
         this.flag = true
         }, 2000)
         }
         },
         mounted () {
         this.getData()
         }
        }
        
        

        另外還可將 Chart 組件和站位標簽一同封裝成一個 ChartWrapper。

        這樣就不會因在組件內部調用 watch 監聽 props 的變化動態 v-if 判斷并掛載數據到 DOM 上出現的這種問題了。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        vue組件中watch props根據v-if動態判斷并掛載DOM的問題

        vue組件中watch props根據v-if動態判斷并掛載DOM的問題:問題復現:父組件中通過名為 source 的 prop 向子組件 Chart 傳入數據 <Chart :source=chartData></Chart> import Chart from '../components/Chart' export default { name: 'Home', com
        推薦度:
        標簽: 動態 動態的 watch
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲av无码一区二区乱子伦as| 免费又黄又爽的视频| 亚洲AV成人片色在线观看| 一级美国片免费看| 久久精品国产精品亚洲艾草网美妙| 久久亚洲精品成人无码| 永久免费AV无码网站在线观看 | 久久亚洲春色中文字幕久久久 | 两个人看的www高清免费视频| 亚洲国产精品一区二区九九 | 亚洲无限乱码一二三四区| 182tv免费观看在线视频| 亚洲狠狠ady亚洲精品大秀| 国语成本人片免费av无码| 亚洲综合精品第一页| 国产一级一片免费播放| 国产精品免费在线播放| 亚洲男人的天堂在线播放| 国色精品卡一卡2卡3卡4卡免费| 亚洲AV综合色区无码二区爱AV| 好大好深好猛好爽视频免费| 亚洲AV无码一区二区二三区入口 | 亚洲视屏在线观看| 在线观看特色大片免费视频| 亚洲国产精品成人午夜在线观看 | 爽爽日本在线视频免费| 一级毛片视频免费| 亚洲午夜福利在线观看| 2020久久精品国产免费| 欧美亚洲国产SUV| 国产成人精品日本亚洲| 无码国产精品久久一区免费| 成人福利在线观看免费视频| 午夜亚洲国产理论秋霞| 成人免费无码大片A毛片抽搐 | 成年人网站在线免费观看| 一级毛片大全免费播放下载| 亚洲福利一区二区精品秒拍| 国产亚洲福利一区二区免费看| a级大片免费观看| 亚洲性色精品一区二区在线|