vue3.0项目中,成功获取后端数据,却发现渲染失败,页面还是没数据?

本文分析了在Vue中,如何通过ref()和reactive()实现响应式数据绑定,解释了渲染失败的原因——数据未被正确地响应式处理,以及解决方法。作者推荐使用ref()来简化代码并保持响应性。

建议先看下这篇:简析vue中的声明式渲染&响应式,ref()&reactive()-优快云博客

渲染失败的原因,是你声明的东西,不具备响应性,或者响应性丢失。

甚至,你在console打印出来,的确有值,为什么页面没有加载出来?因为响应性不存在的情况下,HTML不会检测任何变量&常量的变化,即使它真的变化了,但不会进行检测,仍然使用最开始的值,所以渲染失败,页面没有数据。

解决的办法:赋予响应性即可,使用ref()或者reactive()。

注:el-tree是element-plus的树形组件,无须过多关注,利用其它组件完成视图部分即可,建议后续再深入。

<template>
  <el-tree :data="resData" :props="defaultProps" />
</template>

<script lang="ts" setup>
import axios from 'axios';
import { ref } from 'vue'

const resData = ref<Tree[]>([]) // 赋予响应性
const getData = async () => {
  axios.get('/product/category/treeList')
    .then(response => {
      resData.value = response.data.tree
    });
  console.log(resData)
}

getData() // 记得一定要调用,上面是声明

interface Tree {
  name: string
  children?: Tree[]
}
const defaultProps = {
  children: 'children',
  label: 'name',
}
</script>

或者:

<template>
  <el-tree :data="resData" :props="defaultProps" />
</template>

<script lang="ts" setup>
import axios from 'axios';
import { reactive } from 'vue'

const resData = reactive<Tree[]>([]) // 赋予响应性
const getData = async () => {
  axios.get('/product/category/treeList')
    .then(response => {
      for (let i = 0; i < response.data.tree; i++) {
        resData.push({
          name: response.data.tree[i].name,
          children: response.data.tree[i].children
        })
      }
    });
  console.log(resData)
}

getData() // 记得一定要调用,上面是声明

interface Tree {
  name: string
  children?: Tree[]
}
const defaultProps = {
  children: 'children',
  label: 'name',
}
</script>

很明显,ref更简洁,同时reactive,对响应性的维持,更加苛刻,需要借助push等函数。

总而言之,建议使用ref()。

### Vue 前端搭配 Flask 后端开发教程 #### 1. 技术背景 Vue.js 是一种流行的前端框架,专注于构建用户界面;Flask 则是一种轻量级的 Python Web 框架。两者的结合可以实现前后端分离的应用架构,在现代 Web 应用中非常常见。 #### 2. 集成流程概述 为了使 Vue 和 Flask 能够协同工作,通常需要完成以下几个核心部分: - **后端(Flask)**: 创建 API 接口并处理数据逻辑。 - **前段(Vue.js)**: 使用 HTTP 客户端库(如 Axios)调用这些接口并与用户交互[^2]。 --- #### 3. 实现步骤 ##### 3.1 后端配置 (Flask) ###### 3.1.1 初始化 Flask 应用 创建一个新的 Flask 项目文件 `app.py` 并定义基本路由: ```python from flask import Flask, jsonify, request from flask_cors import CORS app = Flask(__name__) CORS(app) # 设置跨域支持 @app.route(&#39;/api/data&#39;, methods=[&#39;GET&#39;]) def get_data(): data = {"message": "Hello from Flask!"} return jsonify(data) if __name__ == &#39;__main__&#39;: app.run(debug=True) ``` 上述代码设置了 `/api/data` 的 GET 请求响应,并启用了 CORS 支持以便前端能够访问该资源。 ###### 3.1.2 运行 Flask 应用 执行命令启动服务器: ```bash python app.py ``` 默认情况下,Flask 将运行在本地主机上的 `http://localhost:5000/`. --- ##### 3.2 前端配置 (Vue.js) ###### 3.2.1 初始化 Vue 项目 使用 Vue CLI 工具快速搭建一个新项目: ```bash npm install -g @vue/cli vue create frontend cd frontend npm run serve ``` 这会生成一个基于 Vue 的标准模板工程,并将其部署至 `http://localhost:8080/` 上运行。 ###### 3.2.2 编写组件以调用后端服务 编辑主要入口文件 `src/App.vue`, 添加以下内容来展示来自 Flask 提供的信息: ```javascript <template> <div id="app"> {{ message }} </div> </template> <script> import axios from &#39;axios&#39;; export default { name: &#39;App&#39;, data() { return { message: &#39;&#39; }; }, mounted() { this.fetchData(); }, methods: { async fetchData() { try { const response = await axios.get(&#39;http://localhost:5000/api/data&#39;); this.message = response.data.message; } catch (error) { console.error(error); } } } }; </script> ``` 此脚本利用了 Axios 发起异步请求获取远程 JSON 数据,并更新视图显示消息。 --- #### 4. 动态样式绑定示例 如果希望进一步增强用户体验,则可以通过 Vue 的 `:class` 属性机制动态调整 CSS 类名。例如: ```html <div :class="{ active: isActive }">Dynamic Class Binding Example</div> ``` 配合 JavaScript 控制变量状态即可轻松切换不同视觉效果[^3]。 --- ### 总结 以上介绍了如何借助 Flask 构建 RESTful APIs 来支撑由 Vue 执行渲染操作的整体解决方案。这种模式不仅有助于提高应用程序性能还便于维护扩展功能模块[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值