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

如何用细节提升用户体验?

前端给用户反馈是提升用户体验的重要部分,根据场景选择不同的方式可以有效地提升产品的易用性和用户满意度。以下是常见的方法:

1. 视觉反馈

用户执行了某些操作后,需要即时确认操作结果。例如:按钮点击、数据提交、页面加载等。同时,在加载过程中,避免空白页面带来的不适感。

1.1 按钮状态变化

🌰:用户点击按钮后按钮变为不可点击,并显示“提交中...”。

<template>
  <el-button :loading="isSubmitting" @click="handleSubmit">
    {{ isSubmitting ? '提交中...' : '提交' }}
  </el-button>
</template>

<script>
import { ref } from 'vue';

export default {
  setup() {
    const isSubmitting = ref(false);
    const handleSubmit = async () => {
      isSubmitting.value = true;
      // 模拟耗时操作
      await new Promise(resolve => setTimeout(resolve, 2000));
      isSubmitting.value = false;
      alert('提交成功!');
    };
    return { isSubmitting, handleSubmit };
  },
};
</script>

适用场景:数据提交、文件上传等耗时操作。

1.2 骨架屏

🌰:页面加载时显示骨架屏代替真实内容。

<template>
  <div>
    <el-skeleton v-if="loading" :rows="5" />
    <div v-else>加载完成的内容</div>
  </div>
</template>

<script>
import { ref, onMounted } from 'vue';
export default {
  setup() {
    const loading = ref(true);
    onMounted(() => {
      // 模拟加载数据
      setTimeout(() => {
        loading.value = false;
      }, 2000);
    });
    return { loading };
  },
};
</script>

适用场景:页面加载、图片加载等需要较长时间的操作。  

1.3 占位符

🌰:图片加载失败时显示默认占位符。

<template>
  <el-image src="invalid-url.jpg" :fallback="defaultImage" alt="图片加载失败" />
</template>

<script>
export default {
  data() {
    return {
      defaultImage: 'https://via.placeholder.com/150',
    };
  },
};
</script>

2. 声音反馈

用户操作需要即时感知但不便通过视觉传达。例如:移动端设备、盲人用户辅助、警报系统等。

2.1 提示音、警告音等

表单提交成功时:

const audio = new Audio('/success.mp3');
audio.play();

用户输入错误密码时: 

const audio = new Audio('/error.mp3');
audio.play();

3. 文本提示

需要向用户提供明确的操作结果或错误原因。

3.1 通知栏提示

🌰:数据保存成功后,页面右上角弹出提示。

ElMessage.success('保存成功!');
3.2 错误信息

🌰:表单校验错误高亮

<template>
  <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
    <!-- 邮箱输入项 -->
    <el-form-item label="邮箱" prop="email">
      <el-input v-model="form.email" placeholder="请输入邮箱" />
    </el-form-item>
    <!-- 提交按钮 -->
    <el-form-item>
      <el-button type="primary" @click="handleSubmit">提交</el-button>
    </el-form-item>
  </el-form>
</template>

<script>
import { reactive, ref } from 'vue';

export default {
  setup() {
    const form = reactive({
      email: '',
    });
    const formRef = ref(null);
    // 校验规则
    const rules = {
      email: [
        { required: true, message: '邮箱不能为空', trigger: 'blur' },
        { type: 'email', message: '请输入有效的邮箱地址', trigger: 'blur' },
      ],
    };
    // 提交表单
    const handleSubmit = () => {
      // 调用校验方法
      formRef.value.validate((valid) => {
        if (valid) {
          alert('提交成功!');
        } else {
          alert('校验失败,请检查输入内容!');
        }
      });
    };
    return { form, rules, formRef, handleSubmit };
  },
};
</script>

适用场景:表单提交失败时,高亮显示错误字段。

4. 进度条

用户操作需要较长时间完成,需要明确告知用户操作的进度。

分为:

- 线性进度条:文件上传、任务进度显示。 

- 环形进度条:图表渲染、复杂计算加载。

<template>
  <div>
    <h2>线形进度条</h2>
    <el-progress :percentage="uploadProgress" />

    <h2>圆形进度条</h2>
    <el-progress :percentage="loadingProgress" type="circle" />

    <div style="margin-top: 20px;">
      <!-- 按钮控制进度条模拟 -->
      <el-button type="primary" @click="startUpload">开始上传</el-button>
      <el-button type="success" @click="startLoading">开始加载</el-button>
    </div>
  </div>
</template>

<script>
import { ref } from 'vue';

export default {
  setup() {
    // 定义上传进度和加载进度
    const uploadProgress = ref(0);
    const loadingProgress = ref(0);

    let uploadInterval = null;
    let loadingInterval = null;

    // 模拟上传进度
    const startUpload = () => {
      clearInterval(uploadInterval);
      uploadProgress.value = 0;
      uploadInterval = setInterval(() => {
        if (uploadProgress.value >= 100) {
          clearInterval(uploadInterval);
          alert('上传完成!');
        } else {
          uploadProgress.value += 10; // 每次增加 10%
        }
      }, 500);
    };

    // 模拟加载进度
    const startLoading = () => {
      clearInterval(loadingInterval);
      loadingProgress.value = 0;
      loadingInterval = setInterval(() => {
        if (loadingProgress.value >= 100) {
          clearInterval(loadingInterval);
          alert('加载完成!');
        } else {
          loadingProgress.value += 15; // 每次增加 15%
        }
      }, 400);
    };

    return {
      uploadProgress,
      loadingProgress,
      startUpload,
      startLoading,
    };
  },
};
</script>

加载过程中展示: 

5. 弹窗反馈

需要用户主动关注并采取操作时。

5.1 确认对话框
<template>
  <el-button type="danger" @click="confirmDelete">删除</el-button>
</template>

<script>
import { ElMessageBox } from 'element-plus';

export default {
  setup() {
    const confirmDelete = () => {
      ElMessageBox.confirm('确定要删除吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
        .then(() => {
          alert('删除成功!');
        })
        .catch(() => {
          alert('已取消删除');
        });
    };
    return { confirmDelete };
  },
};
</script>

5.2 信息弹窗

用户登录成功后弹出欢迎信息。

ElMessageBox.alert('欢迎回来!', '登录成功');

6. 微交互

需要提升用户体验的小型反馈,如鼠标悬停、点击等。

6.1 鼠标悬停效果

🌰:用户悬停到商品卡片上,显示“加入购物车”按钮。

<template>
  <div class="product-card" @mouseover="showButton = true" @mouseleave="showButton = false">
    <img src="https://via.placeholder.com/150" alt="商品" />
    <el-button v-if="showButton" type="primary" size="mini"> 加入购物车 </el-button>
  </div>
</template>

<script>
import { ref } from 'vue';
export default {
  setup() {
    const showButton = ref(false);
    return { showButton };
  },
};
</script>

适用场景:商品展示、菜单交互。 

总结:

以上使用 Vue 3 和 Element Plus 组件库实现的一些简单方式,可以根据不同场景选择合适的反馈方式,提升用户体验!


http://www.kler.cn/a/445242.html

相关文章:

  • QGIS二次开发(地图符号库操作)
  • OneNet平台2024版MQTT协议完整开发案例教程【MQTT数据流模式】
  • NestJS 中间件与拦截器:请求处理流程详解
  • 4.银河麒麟V10(ARM) 离线安装 MySQL
  • HEIC 是什么图片格式?如何把 iPhone 中的 HEIC 转为 JPG?
  • 大数据技术-Hadoop(二)HDFS的介绍与使用
  • 第33天:安全开发-JavaEE应用SQL预编译Filter过滤器Listener监听器访问控制
  • 配置flutter 解决andriod studio报错 no device selected
  • 揭秘语言模型后训练:指令微调、偏好调优与强化学习的深度解析
  • AdminJS - 现代化的 Node.js 管理面板框架详解
  • 【系统架构设计师】真题论文: 论数据分片技术及其应用(包括解题思路和素材)
  • 在THREEJS中加载3dtile模型
  • Mysql索引类型总结
  • 【华为OD-E卷-开心消消乐 100分(python、java、c++、js、c)】
  • 【软件开发】做出技术决策
  • 2024.2 ACM Explainability for Large Language Models: A Survey
  • 基于springboot的银行账目账户管理系统
  • maven项目运行时NoSuchMethodError问题排查记录(依赖冲突解决)
  • 使用yolo v5 识别月球极小撞击坑
  • 卫星综合电子软件系统
  • docling:PDF解析
  • DALL-M:基于大语言模型的上下文感知临床数据增强方法 ,补充
  • Ansible基本用法
  • 14:00面试,14:10就出来了,问的问题过于变态了。。。
  • Visio——导出的PDF文件缺乏嵌入字体的解决办法 / 设置导出的PDF文件添加嵌入字体的方法
  • 【HTML+CSS】深入理解HTML中的<div>标签:布局与样式的基石