[Vue3 + echarts] props传异步数据问题

博客讲述了在Vue3中遇到的一个问题:父组件通过axios异步获取数据并处理后传递给子组件,但子组件无法通过props正确接收到。作者发现只有在ref中和onMounted中分别进行一次axios请求,才能使子组件接收到处理后的数据。这个离谱的解决办法虽然奏效,但并不理想。文章讨论了这一不寻常的解决策略。

今天用 v3+echarts 写时遇到一个难题:父组件中通过 axios 获取数据,然后在父组件中加工一下传给子组件(图表组件),子组件通过 props 接收。

问题就出在似乎异步获取数据后子组件不能通过 setup 的 props 参数正确获取处理后的数据(已经配置好了props项),数据仍然为初始的空数组[]。

然后就突发奇想写出了一个很离谱的写法,竟然还成功了,

setup() {
    let data = ref(
      (() => {
        axios
          .get("./static/data.json")
          .then((res) => {
            return res.data;
          })
          .catch((err) => {
            console.log(err.message);
          });
      })()
    );

    onMounted(() => {
      axios
        .get("./static/data.json")
        .then((res) => {
          data.value = res.data;
        })
        .catch((err) => {
          console.log(err.message);
        });
    });

    const getFromData = (keyName) => {
      let arr = [];
      data.value.forEach((item) => {
        for (const key in item) {
          if (Object.hasOwnProperty.call(item, key)) {
            if (key == keyName) arr.push(item[key]);
          }
        }
      });
      return arr;
    };
    let sleep_time = computed(() => getFromData("sleep_time"));
    let run_distance = computed(() => getFromData("run_distance"));
    let sport_time = computed(() => getFromData("sport_time"));
    let step_number = computed(() => getFromData("step_number"));
    let study_time = computed(() => getFromData("study_time"));
    let recreate_time = computed(() => getFromData("recreate_time"));
    let expense = computed(() => getFromData("expense"));
    let mood = computed(() => getFromData("mood"));
    return {
      data,
      sleep_time,
      run_distance,
      sport_time,
      step_number,
      study_time,
      recreate_time,
      expense,
      mood,
    };
  },

ref 里面写了一个立即执行函数,里面 axios 请求一下数据,然后之后 onMounted 里再请求一次,就可以了。少一步都不行,真的离谱。

<think>好的,我现在需要帮助用户了解如何设计和实现一个基于VueECharts数据可视化系统。首先,我应该回顾用户提供的引用内容,确保我的回答符合他们的需求。用户提到了两个引用,一个是关于Vue3ECharts的大屏展示系统,另一个是使用Vue、DataV和ECharts的可视化大屏项目。 首先,我需要确定用户可能需要的步骤。通常,设计和实现这样的系统包括技术选型、环境搭建、数据管理、可视化组件开发、交互优化、部署等。用户可能希望了解每个步骤的具体内容,以及如何整合VueECharts。 接下来,我应该考虑用户可能的背景。他们可能有一定的前端基础,但对VueECharts的结合使用不太熟悉。因此,我需要用清晰的结构,分步骤说明,并提供示例代码,这样他们可以更容易理解。 然后,我需要确保遵循用户提供的系统级指令,比如使用正确的LaTeX格式,但在这个问题中可能数学公式较少,重点在代码和架构。不过如果有涉及算法或计算,可能需要用到LaTeX,例如在性能优化部分提到的防抖函数,但用户示例中没有使用数学公式,所以可能不需要。 用户还要求生成相关问题,我需要根据回答内容提出相关的问题,比如技术选型、图表优化、数据实时更新等。 另外,引用部分提到的项目使用了Vue3的新API和DataV组件库,这些应该在回答中提到,特别是组合式API和动态组件加载的优势。同时,需要提到如何利用ECharts的配置项来定制图表,以及如何通过Vue组件管理数据动态刷新。 可能还需要考虑响应式设计,如何适配不同屏幕尺寸,这在数据可视化大屏中很重要。引用中提到了使用rem或vw单位,以及CSS的缩放,这些细节应该包含在实现步骤中。 在数据管理方面,需要说明如何从后端API获取数据,使用axios进行异步请求,并在Vue组件中处理数据更新,利用生命周期钩子或定时器实现实时刷新。 最后,部署方面需要简要说明如何打包和优化项目,以及可能的自动化部署流程。 现在需要检查是否有遗漏的部分,比如权限控制或错误处理,但根据引用内容,可能这些不是重点。应专注于核心功能的实现步骤,确保用户能有一个清晰的路线图来开发数据可视化系统。</think>### 基于VueECharts数据可视化系统设计与实现方案 #### 一、技术选型与架构设计 1. **前端框架**: Vue3(组合式API)+ TypeScript 2. **可视化库**: ECharts 5 + DataV组件库 3. **状态管理**: Pinia 4. **构建工具**: Vite 4 5. **响应式设计**: 采用rem+vw双单位体系实现大屏自适应[^2] #### 二、实现步骤与核心代码 1. **环境搭建** ```bash npm create vue@latest npm install echarts datavjs vue-router pinia ``` 2. **基础图表组件封装(示例)** ```vue <template> <div ref="chartRef" style="width:100%;height:400px"></div> </template> <script setup> import { ref, onMounted, watch } from &#39;vue&#39;; import * as echarts from &#39;echarts&#39;; const props = defineProps([&#39;option&#39;]); const chartRef = ref(null); let chartInstance = null; onMounted(() => { chartInstance = echarts.init(chartRef.value); }); watch(() => props.option, (newVal) => { chartInstance.setOption(newVal); }, { deep: true }); </script> ``` 3. **数据管理方案** ```javascript // stores/dashboard.js import { defineStore } from &#39;pinia&#39;; export const useDashboardStore = defineStore(&#39;dashboard&#39;, { state: () => ({ realtimeData: [], historicalData: [] }), actions: { async fetchData() { const res = await axios.get(&#39;/api/data-source&#39;); this.realtimeData = res.data; } } }); ``` #### 三、关键实现技术 1. **动态主题切换** ```javascript // 注册主题 import theme from &#39;./theme.json&#39;; echarts.registerTheme(&#39;customTheme&#39;, theme); ``` 2. **性能优化方案** - 数据更新防抖处理 - Web Worker处理大数据计算 - 虚拟滚动长列表渲染 3. **大屏适配方案** ```css /* 基准尺寸基于1920x1080设计稿 */ :root { --base-viewport: 1920; } @media screen and (max-width: 2560px) { html { font-size: calc(100vw / var(--base-viewport) * 100px); } } ``` #### 四、典型应用场景 1. 实时业务监控大屏(每秒更新数据)[^1] 2. 多维度数据对比分析 3. 地理信息数据可视化 4. 时序数据趋势展示 #### 五、部署方案 1. **构建优化**: 配置gzip压缩和CDN加速 2. **容器化部署**: 使用Docker+Nginx方案 3. **监控系统**: 集成Sentry错误追踪
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值