当前位置:首页 > 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 或自定义组件高亮 @ 提及的用户名:

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

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

相关文章

vue实现收货功能

vue实现收货功能

Vue实现收货功能的基本思路 收货功能通常涉及前端界面交互、后端数据更新和状态管理。在Vue中,可以通过组件化开发实现这一功能,结合API调用与状态管理工具(如Vuex或Pinia)。 创建收货按钮…

vue实现拨号功能

vue实现拨号功能

Vue实现拨号功能的方法 使用HTML5的tel协议 在Vue模板中直接使用<a>标签的tel:协议实现拨号功能。这种方法适用于移动端浏览器,点击后会调起系统的拨号界面。 <tem…

vue实现聊天功能

vue实现聊天功能

Vue实现聊天功能的方法 使用WebSocket实现实时通信 安装WebSocket客户端库如socket.io-client,在Vue组件中建立连接。创建一个消息列表和数据输入框,通过WebSock…

vue实现分页功能

vue实现分页功能

Vue 分页功能实现 在 Vue 中实现分页功能通常需要结合后端 API 或前端数据分页逻辑。以下是两种常见的实现方式: 前端分页实现 适用于数据量较小的情况,直接在 Vue 组件中处理分页逻辑。…

前端vue登录功能实现

前端vue登录功能实现

登录功能实现步骤 在Vue中实现登录功能通常需要结合后端API,以下是关键步骤和代码示例: 创建登录表单组件 <template> <div> <form…

vue实现考试多选功能

vue实现考试多选功能

Vue实现考试多选功能 数据绑定与选项渲染 使用v-model绑定用户选择的答案数组,结合v-for循环渲染选项列表。示例代码: <template> <div>…