亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

從Echarts報(bào)錯(cuò)中學(xué)習(xí)Vue3?ref和shallowRef區(qū)別及其組件二次封裝demo

 更新時(shí)間:2023年11月07日 09:01:18   作者:水冗水孚  
這篇文章主要介紹了從Echarts報(bào)錯(cuò)中學(xué)習(xí)Vue3?ref和shallowRef區(qū)別及其組件二次封裝demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

報(bào)錯(cuò)場(chǎng)景

Uncaught TypeError: Cannot read properties of undefined (reading 'type') at LineView2.render (LineView.js:567:36) echarts.js:976

上述是報(bào)錯(cuò)信息

  • 筆者簡(jiǎn)單封裝一個(gè)Echarts組件,代碼文末附上,使用Vue3搭配Echarts5
  • 在初始化echarts.init圖表時(shí),沒有問題,但是當(dāng)進(jìn)行自適應(yīng)resize的時(shí)候報(bào)錯(cuò)了
  • 報(bào)錯(cuò)截圖如下:

報(bào)錯(cuò)截圖

報(bào)錯(cuò)原因分析

  • 報(bào)錯(cuò)的原因是Echarts初始化的實(shí)例變量受到了Vue響應(yīng)式ref的影響——啥意思呢?就是
  • 響應(yīng)式的原理就是代理,也就是說,通過ref函數(shù)加工代理的Echarts實(shí)例,已經(jīng)不是原來的實(shí)例了。通俗而言,就是ref函數(shù)“克隆”了一份Echarts本體實(shí)例,本體實(shí)例自帶resize方法,但是代理克隆體上的resize方法可能克隆的不太完美【這樣描述不太嚴(yán)謹(jǐn),反正是這個(gè)意思】
  • 也就可能導(dǎo)致了ref函數(shù)克隆體的Echarts實(shí)例在調(diào)用時(shí)出錯(cuò)

解決方案

  • 既然Echarts初始化的實(shí)例變量會(huì)受到Vue響應(yīng)式的影響
  • 那么我們?cè)诖鎯?chǔ)Echarts的時(shí)候,就不存到Vue的響應(yīng)式變量里面即可

如下:

思考,難道所有的變量,都要,都得,都必須通過ref或者reactive定義成響應(yīng)式的嗎?

原來的寫法用ref存儲(chǔ):不建議

import * as echarts from "echarts";
const eChaDom = ref(null); // 用于初始化Echarts畫布需要的dom元素
const chart = ref(null) // 用于存儲(chǔ)Echarts
chart.value = echarts.init(eChaDom.value) // 初始化實(shí)例

解決方案一:直接使用普通變量來存儲(chǔ)Echarts實(shí)例

import * as echarts from "echarts";
let eChaDom = document.querySelector('.eChaDom'); // 用于初始化Echarts畫布需要的dom元素
let chart = null // 用于存儲(chǔ)Echarts
chart = echarts.init(eChaDom) // 初始化實(shí)例

解決方案二:使用淺層響應(yīng)式shallowRef進(jìn)行存儲(chǔ)Echarts實(shí)例

  • 我們知道ref響應(yīng)式有些過頭了,稍微一變都能感應(yīng)到,而Echart的實(shí)例是不可變的
  • 你變我不變,就容易打架出問題
  • 所以,若是不想使用普通變量來存儲(chǔ)Echarts實(shí)例,使用shallowRef進(jìn)行定義存儲(chǔ)也是可以的
  • 如下:
import * as echarts from "echarts";
const eChaDom = shallowRef(null); // 用于初始化Echarts畫布需要的dom元素
const chart = shallowRef(null) // 用于存儲(chǔ)Echarts
chart.value = echarts.init(eChaDom.value) // 初始化實(shí)例

解決方案三:依舊用ref但是搭配markRaw強(qiáng)制返回自身,不讓代理克隆一份

import { ref, markRaw, shallowRef } from "vue";
import * as echarts from "echarts";
const eChaDom = ref(null); // 用于初始化Echarts畫布需要的dom元素
const chart = ref(null) // 用于存儲(chǔ)Echarts
chart.value = markRaw(echarts.init(eChaDom.value)) // 初始化實(shí)例
  • 這種方式有些多此一舉了,本來ref就是要代理克隆的一份,我們?cè)偈褂胢arkRaw去強(qiáng)制不允許代理克隆一份
  • 這種方式不太推薦
  • 屬于奇葩的操作

思考ref和shallowRef應(yīng)用場(chǎng)景————性能優(yōu)化

  • 我們平常定義一個(gè)變量,可以將其定義成響應(yīng)式的,或者非響應(yīng)式的
  • 定義成響應(yīng)式的是為了后續(xù)改它,自動(dòng)觸發(fā)頁(yè)面視圖更新
  • 可是啊,在Echarts中,初始化的實(shí)例一般也不用去更改,更多的是去調(diào)用其自帶的方法
  • 所以我們沒必要還用ref將其定義響應(yīng)式存儲(chǔ)
  • 直接定義一個(gè)非響應(yīng)式數(shù)據(jù)去存儲(chǔ)一下也沒問題的
  • 當(dāng)然,折中一下,就是用淺層響應(yīng)式的shallowRef來定義存儲(chǔ)吧

實(shí)際上,這也是性能優(yōu)化提升的一種方式

因?yàn)閞ef是把一個(gè)變量遞歸深層次加工成響應(yīng)式【耗時(shí)不少】,而shallowRef操作加工【耗時(shí)少】

我們看官方的shallowRef和markRaw這兩張圖,就能夠理解明白了:

圖:

圖:

官方地址在這

小結(jié)

  • 響應(yīng)式變量有對(duì)應(yīng)的好處、非響應(yīng)式變量也有其優(yōu)點(diǎn)
  • 我們應(yīng)該根據(jù)實(shí)際情況,去靈活定義一個(gè)變量到底是響應(yīng)式還是非響應(yīng)式的【亦或是淺層響應(yīng)式的】
  • 本文就是一個(gè)實(shí)際情況【shallowRef折中定義一個(gè)淺層響應(yīng)式的Echarts實(shí)例的變量】
  • 時(shí)間允許下,可以多研究研究一些報(bào)錯(cuò)的具體原因,這樣可以加深我們對(duì)于技術(shù)的理解

當(dāng)然,github就這個(gè)問題,也有對(duì)應(yīng)的issue。地址在這里

一句話總結(jié),某些大一些的、不需要更改的實(shí)例化的數(shù)據(jù)對(duì)象,就不需使用ref定義成深層響應(yīng)式啦(直接用普通變量存儲(chǔ)也無(wú)妨)。若是依舊想定義成響應(yīng)式的,那就使用shallowRef即可

  • 一句話總結(jié),某些大一些的、不需要更改的實(shí)例化的數(shù)據(jù)對(duì)象,就不需使用ref定義成深層響應(yīng)式啦
  • 直接用普通變量存儲(chǔ)也無(wú)妨
  • 若是依舊想定義成響應(yīng)式的,那就使用shallowRef即可

嗯,這樣記,通俗易懂

封裝的Echarts組件,可復(fù)現(xiàn)對(duì)應(yīng)報(bào)錯(cuò)bug

組件二次封裝Echarts代碼

<template>
    <div ref="eChaDom" :style="{ height: h }" />
</template>
<script setup>
import { watch, onMounted, onBeforeUnmount, ref, shallowRef } from "vue";
import * as echarts from "echarts";
import debounce from 'lodash/debounce'
const props = defineProps({
    h: {
        type: String,
        default: '360px'
    },
    options: {
        type: Object,
        default: () => ({})
    },
    theme: {
        type: String,
        default: 'dark'
    }
})
// const eChaDom = ref(null); // 這樣resize有報(bào)錯(cuò)
// const chart = ref(null)
const eChaDom = shallowRef(null); // 這樣resize就沒報(bào)錯(cuò)了
const chart = shallowRef(null)
const init = () => {
    chart.value = echarts.init(eChaDom.value, props.theme)
    chart.value.setOption(props.options);
    window.addEventListener('resize', debounce(resizeFn, 360))
}
const resizeFn = () => {
    chart.value.resize()
}
onMounted(() => {
    init()
})
watch(
    () => props.options,
    (newOptions) => {
        chart.value.setOption(newOptions);
    },
    { deep: true }
)
onBeforeUnmount(() => {
    window.removeEventListener('resize', resizeFn)
})
</script>

使用組件

<template>
    <div class="tenBox">
        <eCha :options="options" h="600px" />
    </div>
</template>
<script setup>
import eCha from "@/components/eCha/index.vue";
const options = {
    xAxis: {
        type: 'category',
        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
    },
    yAxis: {
        type: 'value'
    },
    series: [
        {
            data: [820, 932, 901, 934, 1290, 1330, 1320],
            type: 'line',
            smooth: true
        }
    ]
}

以上就是從Echarts報(bào)錯(cuò)中學(xué)習(xí)Vue3 ref和shallowRef區(qū)別及其組件二次封裝demo的詳細(xì)內(nèi)容,更多關(guān)于Vue3 ref shallowRef區(qū)別的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Vue?CompositionAPI中watch和watchEffect的區(qū)別詳解

    Vue?CompositionAPI中watch和watchEffect的區(qū)別詳解

    這篇文章主要為大家詳細(xì)介紹了Vue?CompositionAPI中watch和watchEffect的區(qū)別,文中的示例代碼簡(jiǎn)潔易懂,希望對(duì)大家學(xué)習(xí)Vue有一定的幫助
    2023-06-06
  • vue3基礎(chǔ)知識(shí)剖析

    vue3基礎(chǔ)知識(shí)剖析

    筆者這篇文章會(huì)從vue3基礎(chǔ)的知識(shí)點(diǎn)開始剖析,特別是在將composition?API的時(shí)候,在代碼示例中不會(huì)一上來就使用setup語(yǔ)法糖,而是用早期的setup函數(shù),這樣方便于初學(xué)的小伙伴們理解跟學(xué)習(xí)
    2022-08-08
  • 解讀Vue組件注冊(cè)方式

    解讀Vue組件注冊(cè)方式

    無(wú)論是Vue還是React,都有組件的概念。組件,就是能和別人組合在一起的物件。在前端頁(yè)面開發(fā)過程中,將一個(gè)頁(yè)面劃分成一個(gè)個(gè)小的模塊,每個(gè)模塊單獨(dú)定義,每個(gè)模塊就是一個(gè)組件。組件可以進(jìn)行復(fù)用,A頁(yè)面和B頁(yè)面有一個(gè)相似的模塊,可以抽離成一個(gè)可局部修改的組件。
    2021-05-05
  • 解決vue3.0運(yùn)行項(xiàng)目warning Insert `·` prettier/prettier問題

    解決vue3.0運(yùn)行項(xiàng)目warning Insert `·` prettier/pret

    這篇文章主要介紹了解決vue3.0運(yùn)行項(xiàng)目warning Insert `·` prettier/prettier問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Vue SPA 首屏優(yōu)化方案

    Vue SPA 首屏優(yōu)化方案

    這篇文章主要介紹了Vue SPA 首屏優(yōu)化方案的的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用vue,感興趣的朋友可以了解下
    2021-02-02
  • Vue路由傳參及props解耦深入分析

    Vue路由傳參及props解耦深入分析

    vue路由傳參的使用場(chǎng)景一般都是應(yīng)用在父路由跳轉(zhuǎn)到子路由時(shí),攜帶參數(shù)跳轉(zhuǎn),下面這篇文章主要給大家介紹了關(guān)于vue路由傳參方式的方式總結(jié)及獲取參數(shù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • element 穿梭框性能優(yōu)化的實(shí)現(xiàn)

    element 穿梭框性能優(yōu)化的實(shí)現(xiàn)

    本文主要介紹了element 穿梭框性能優(yōu)化,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Vue.js開發(fā)環(huán)境快速搭建教程

    Vue.js開發(fā)環(huán)境快速搭建教程

    這篇文章主要為大家詳細(xì)介紹了Vue.js開發(fā)環(huán)境快速搭建教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 深入理解Vue3組合式API的實(shí)現(xiàn)

    深入理解Vue3組合式API的實(shí)現(xiàn)

    組合式API為Vue3帶來了更好的邏輯組織和復(fù)用性,支持TypeScript,提供靈活的響應(yīng)式系統(tǒng),它允許開發(fā)者將相關(guān)邏輯組合在一起,通過composable函數(shù)實(shí)現(xiàn)邏輯復(fù)用,擺脫了mixin的缺點(diǎn),同時(shí),組合式API與TypeScript的集成更緊密,能夠提供更準(zhǔn)確的類型推斷
    2024-10-10
  • 詳解在vue使用weixin-js-sdk常見使用方法

    詳解在vue使用weixin-js-sdk常見使用方法

    這篇文章主要介紹了 詳解在vue使用weixin-js-sdk常見使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05

最新評(píng)論