当前位置: 首页 > news >正文

前端面试七之列表渲染和组件重用

一、列表渲染

<template><div><h1>用户列表</h1><div v-if="loading">加载中...</div><div v-else-if="error" class="error">加载失败:{{ error.message }}</div><ul v-else><li v-for="user in users" :key="user.id"><strong>{{ user.name }}</strong> - {{ user.email }}</li></ul></div>
</template><script>
import axios from 'axios';export default {data() {return {users: [], // 用于存储用户数据loading: true, // 加载状态error: null, // 错误信息};},methods: {// 将接口请求逻辑分离成一个独立方法async fetchUsers() {try {const response = await axios.get('https://jsonplaceholder.typicode.com/users');this.users = response.data; // 将获取到的用户数据存储到 users 中} catch (error) {this.error = error; // 存储错误信息} finally {this.loading = false; // 加载完成}},},mounted() {// 在 mounted 钩子中调用 fetchUsers 方法this.fetchUsers();},
};
</script><style>
.error {color: red;
}
</style>

代码解释

代码解释

(1)分离接口请求逻辑
  • 将接口请求逻辑封装到 fetchUsers 方法中,使代码更加模块化。

  • fetchUsers 方法中使用 async/await 处理异步请求。

  • 请求成功时,将响应数据存储到 users 中。

  • 请求失败时,将错误信息存储到 error 中。

  • finally 块中,将 loading 设置为 false,表示加载完成。

(2)在 mounted 钩子中调用方法
  • mounted 钩子中调用 fetchUsers 方法,确保在组件挂载完成后发起请求。

  • 这种方式使代码更加清晰,逻辑更加分离。

(3)v-for 和 v-if
  • v-for:用于循环渲染列表。v-for="user in users" 表示对 users 数组中的每个元素进行循环,并将每个元素赋值给 user

  • v-if:用于根据条件显示或隐藏元素。v-if="loading" 表示如果 loadingtrue,则显示加载提示;v-else-if="error" 表示如果存在错误,则显示错误信息。

二、组件重用

 组件重用是 Vue.js 的一个重要特性,允许你创建可复用的组件,从而提高代码的可维护性和可读性。通过将通用的功能封装成独立的组件,你可以在多个地方重复使用这些组件,并且可以通过传入不同的属性(props)和插槽(slots)来定制它们的行为和外观。

示例:创建一个可重用的自定义按钮组件

1. 创建自定义按钮组件

src/components 文件夹中创建一个名为 CustomButton.vue 的文件。

<template><button:style="buttonStyle"><slot>默认按钮文本</slot></button>
</template><script>
export default {name: 'CustomButton',props: {// 按钮的颜色color: {type: String,default: 'blue',},// 按钮的大小size: {type: String,default: 'medium',},},computed: {// 动态生成按钮的样式buttonStyle() {const baseStyle = {backgroundColor: this.color,color: this.textColor,border: 'none',borderRadius: '4px',cursor: 'pointer',transition: 'background-color 0.3s',padding: this.padding,fontSize: this.fontSize,};return baseStyle;},// 根据背景颜色动态调整文字颜色textColor() {return this.color === 'white' ? 'black' : 'white';},// 动态调整按钮的内边距padding() {switch (this.size) {case 'small':return '4px 8px';case 'medium':return '8px 16px';case 'large':return '12px 24px';default:return '8px 16px';}},// 动态调整按钮的字体大小fontSize() {switch (this.size) {case 'small':return '12px';case 'medium':return '14px';case 'large':return '16px';default:return '14px';}},},
};
</script><style scoped>
button {border: none;border-radius: 4px;padding: 8px 16px; /* 默认值 */cursor: pointer;transition: background-color 0.3s;font-size: 14px; /* 默认值 */
}button:hover {opacity: 0.8;
}
</style>

2. 在父组件中使用自定义按钮

src/App.vue 文件中引入并使用 CustomButton 组件。

<template><div id="app"><h1>自定义按钮示例</h1><CustomButton color="green" size="large">点击我</CustomButton><CustomButton color="red" size="small">删除</CustomButton><CustomButton color="blue" size="medium">提交</CustomButton><CustomButton color="white" size="medium">白色按钮</CustomButton></div>
</template><script>
import CustomButton from './components/CustomButton.vue';export default {name: 'App',components: {CustomButton,},
};
</script><style>
#app {text-align: center;margin-top: 60px;
}
</style>

(2)父组件

 

  • 1)CustomButton 组件
  • 插槽(Slot):使用 <slot> 元素允许父组件传入按钮的文本内容。如果父组件没有传入内容,则显示默认的“默认按钮文本”。

  • 属性(Props)

    • color:按钮的背景颜色,默认值为 'blue'

    • size:按钮的大小,默认值为 'medium'

  • 在父组件中,通过 colorsize 属性传入按钮的颜色和大小。

  • 使用插槽传入按钮的文本内容。

    • 计算属性(Computed Properties)

      • buttonClass:根据 size 动态生成按钮的类名。

      • buttonStyle:根据 color 动态生成按钮的样式。

      • textColor:根据背景颜色动态调整文字颜色,确保文字在不同背景颜色下都能清晰可见。

    • 样式(Style):为按钮定义了基本样式,并根据大小动态调整字体大小和内边距。

相关文章:

  • 新书速览|CUDA并行编程与性能优化
  • Transformer、RNN (循环神经网络) 和 CNN (卷积神经网络)的区别
  • 消除品类洞察:头部稳固,新玩家如何创新突围手游市场?
  • Lavazza拉瓦萨再度牵手兰博基尼汽车 百年咖啡注入超跑速度
  • 算法导论第二章:递归与分治的数学艺术
  • 行为模式-命令模式
  • 【Zephyr 系列 21】OTA 升级与产测系统集成:远程配置、版本验证、自动回滚机制设计
  • 分块解密,,,
  • 报表工具顶尖对决系列 --- 文本数据源
  • C++内存管理与编译链接
  • 数据结构 散列表 学习 2025年6月12日15:30:48
  • SpringMVC与Struts2对比教学
  • Jetpack LiveData 深度解析
  • 武汉科技大学人工智能与演化计算实验室许志伟课题组参加IEEE CEC 2025
  • AI集成运维管理平台的架构与核心构成解析
  • Python训练打卡Day48
  • 开源PSS解析器
  • Linux部署bmc TrueSight 监控agent步骤
  • 股指期货入门基础知识
  • 智能体应用开发课程体系规划说明
  • 怎么在网站底部做备案号/雅虎搜索
  • 网站建设面对的问题/企业网站制作模板
  • 网站链接视频怎么做/产品互联网推广
  • 线上推广工作是做什么的/seo站长工具平台
  • 佛山营销网站建设服务/竞价网络推广外包
  • wordpress 教育 演示/绍兴seo计费管理