当前位置:首页 > VUE

at 功能实现vue

2026-01-17 23:07:21VUE

实现 Vue 中的 @ 功能

在 Vue 中实现类似社交平台的 @ 提及功能,通常需要结合输入框(如 <textarea> 或可编辑的 <div>)和用户列表的交互。以下是具体实现方法:

监听输入事件

通过 @input@keyup 监听输入框内容的变化,检测用户是否输入了 @ 符号。可以使用正则表达式匹配 @ 后的字符:

methods: {
  handleInput(event) {
    const text = event.target.value;
    const lastAtPos = text.lastIndexOf('@');
    if (lastAtPos >= 0) {
      const query = text.substring(lastAtPos + 1);
      this.showUserList = true;
      this.filterUsers(query);
    } else {
      this.showUserList = false;
    }
  }
}

过滤和显示用户列表

根据输入的字符过滤用户列表,动态展示匹配的用户:

filterUsers(query) {
  if (query.trim() === '') {
    this.filteredUsers = this.users;
    return;
  }
  this.filteredUsers = this.users.filter(user => 
    user.name.toLowerCase().includes(query.toLowerCase())
  );
}

插入提及的用户

当用户从列表中选择一个用户时,将用户名插入到输入框中,并替换 @ 后的部分:

selectUser(user) {
  const text = this.message;
  const lastAtPos = text.lastIndexOf('@');
  this.message = text.substring(0, lastAtPos) + `@${user.name} `;
  this.showUserList = false;
}

高亮提及的用户名

在显示消息时,使用 v-html 或自定义组件高亮 @ 提及的用户名:

at 功能实现vue

highlightMentions(text) {
  return text.replace(/@(\w+)/g, '<span class="mention">@$1</span>');
}

完整示例代码

<template>
  <div>
    <textarea 
      v-model="message" 
      @input="handleInput" 
      placeholder="输入消息..."
    ></textarea>
    <ul v-if="showUserList" class="user-list">
      <li 
        v-for="user in filteredUsers" 
        :key="user.id" 
        @click="selectUser(user)"
      >
        {{ user.name }}
      </li>
    </ul>
    <div v-html="highlightMentions(message)"></div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: '',
      users: [
        { id: 1, name: 'Alice' },
        { id: 2, name: 'Bob' },
        { id: 3, name: 'Charlie' }
      ],
      filteredUsers: [],
      showUserList: false
    };
  },
  methods: {
    handleInput(event) {
      const text = event.target.value;
      const lastAtPos = text.lastIndexOf('@');
      if (lastAtPos >= 0) {
        const query = text.substring(lastAtPos + 1);
        this.showUserList = true;
        this.filterUsers(query);
      } else {
        this.showUserList = false;
      }
    },
    filterUsers(query) {
      if (query.trim() === '') {
        this.filteredUsers = this.users;
        return;
      }
      this.filteredUsers = this.users.filter(user => 
        user.name.toLowerCase().includes(query.toLowerCase())
      );
    },
    selectUser(user) {
      const text = this.message;
      const lastAtPos = text.lastIndexOf('@');
      this.message = text.substring(0, lastAtPos) + `@${user.name} `;
      this.showUserList = false;
    },
    highlightMentions(text) {
      return text.replace(/@(\w+)/g, '<span class="mention">@$1</span>');
    }
  }
};
</script>

<style>
.mention {
  color: blue;
  font-weight: bold;
}
.user-list {
  border: 1px solid #ccc;
  max-height: 150px;
  overflow-y: auto;
}
.user-list li {
  padding: 5px;
  cursor: pointer;
}
.user-list li:hover {
  background-color: #f0f0f0;
}
</style>

注意事项

  • 如果输入框支持富文本(如使用 contenteditable),需要额外处理 HTML 转义。
  • 对于大型用户列表,建议加入防抖(debounce)优化搜索性能。
  • 后端需要配合存储和解析提及的用户 ID,而不仅仅是用户名。

标签: 功能at
分享给朋友:

相关文章

vue前端实现打印功能

vue前端实现打印功能

使用Vue实现前端打印功能 使用window.print()方法 Vue中可以直接调用浏览器的window.print()方法实现打印功能。这种方法简单快捷,适用于打印整个页面或特定区域。 meth…

js实现 功能

js实现 功能

在 JavaScript 中实现功能通常涉及多个关键步骤,具体取决于功能需求。以下是常见功能的实现方法和示例: 基本功能实现 使用函数封装逻辑是最直接的方式。例如,实现一个计算两数之和的函数: f…

vue实现弹窗功能

vue实现弹窗功能

实现基础弹窗组件 在Vue中创建弹窗通常需要定义一个组件,利用v-if或v-show控制显示隐藏。以下是一个基础弹窗组件的实现: <template> <div class="…

vue实现的功能

vue实现的功能

Vue.js 的核心功能 Vue.js 是一个渐进式 JavaScript 框架,专注于构建用户界面。其核心功能包括数据绑定、组件化开发、指令系统和状态管理,适用于从简单交互到复杂单页应用(SPA)的…

vue简单功能实现

vue简单功能实现

Vue 简单功能实现示例 以下是一个基于 Vue 3 的简单计数器功能实现,包含模板、脚本和样式部分: <template> <div class="counter">…

vue打印功能实现

vue打印功能实现

使用Vue实现打印功能 Vue中实现打印功能可以通过浏览器原生的window.print()方法或借助第三方库如vue-print-nb来实现。以下是两种常见方法: 方法一:使用原生JavaScri…