当前位置:首页 > VUE

at 功能实现vue

2026-02-18 15:34:51VUE

Vue 中实现 at(@)功能的方法

在 Vue 中实现 at(@)功能通常用于提及用户或触发自动补全,类似社交平台的评论或聊天功能。以下是几种常见实现方式:

使用自定义指令监听输入

创建自定义指令监听输入框的 @ 符号输入,触发用户列表显示:

at 功能实现vue

Vue.directive('at-mention', {
  bind(el, binding) {
    el.addEventListener('input', (e) => {
      const value = e.target.value;
      const lastChar = value.slice(-1);
      if (lastChar === '@') {
        binding.value.showUserList();
      }
    });
  }
});

结合文本域与下拉组件

通过组合 textarea 和下拉选择组件实现交互:

at 功能实现vue

<template>
  <div>
    <textarea 
      v-model="content" 
      @input="handleInput"
      placeholder="输入 @ 提及用户">
    </textarea>
    <user-list 
      v-if="showList"
      :users="filteredUsers"
      @select="insertUser">
    </user-list>
  </div>
</template>

使用第三方库

集成现成的库如 vue-at 快速实现功能:

npm install vue-at
import At from 'vue-at'
Vue.component('at', At)
<template>
  <at :members="users">
    <textarea v-model="text"></textarea>
  </at>
</template>

内容渲染处理

对包含 @ 的内容进行特殊样式渲染:

computed: {
  formattedContent() {
    return this.content.replace(/@(\w+)/g, '<span class="mention">@$1</span>');
  }
}

完整示例组件

export default {
  data() {
    return {
      content: '',
      showList: false,
      users: ['Alice', 'Bob', 'Charlie'],
      filteredUsers: []
    }
  },
  methods: {
    handleInput(e) {
      const cursorPos = e.target.selectionStart;
      const textBeforeCursor = this.content.slice(0, cursorPos);
      const atPos = textBeforeCursor.lastIndexOf('@');

      if (atPos > -1) {
        const searchText = textBeforeCursor.slice(atPos + 1);
        this.filteredUsers = this.users.filter(u => 
          u.toLowerCase().includes(searchText.toLowerCase())
        );
        this.showList = this.filteredUsers.length > 0;
      } else {
        this.showList = false;
      }
    },
    insertUser(user) {
      const cursorPos = this.$refs.textarea.selectionStart;
      const textBefore = this.content.slice(0, cursorPos);
      const atPos = textBefore.lastIndexOf('@');

      this.content = 
        this.content.slice(0, atPos) + 
        `@${user} ` + 
        this.content.slice(cursorPos);

      this.showList = false;
    }
  }
}

注意事项

  • 移动端需额外处理虚拟键盘和触摸事件
  • 大量用户列表时需要优化搜索性能
  • 考虑添加防抖机制减少频繁过滤
  • 支持退格键删除时隐藏列表
  • 可扩展支持多级嵌套提及

通过以上方法可以灵活实现不同复杂度的 at 功能,根据项目需求选择合适方案。

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

相关文章

uniapp实现选项卡功能

uniapp实现选项卡功能

实现选项卡功能的基本方法 在uniapp中实现选项卡功能通常需要使用uni-segmented-control组件或自定义样式结合swiper组件。以下是两种常见实现方式: 使用uni-segmen…

vue实现粘贴功能

vue实现粘贴功能

实现粘贴功能的基本方法 在Vue中实现粘贴功能通常涉及监听paste事件,并处理剪贴板数据。以下是一个基础实现示例: <template> <div @paste="handl…

vue实现监控功能

vue实现监控功能

Vue 实现监控功能的方法 在 Vue 中实现监控功能通常涉及数据变化监听、生命周期钩子、自定义指令或第三方库的集成。以下是几种常见实现方式: 数据监控 通过 Vue 的 watch 属性监听数据变…

vue业务功能实现

vue业务功能实现

Vue业务功能实现指南 数据绑定与响应式更新 使用v-model实现表单双向绑定,结合Vue的响应式系统自动更新DOM。对于复杂对象,可通过Vue.set()或this.$set()确保属性响应式。…

vue实现toggle功能

vue实现toggle功能

Vue 实现 Toggle 功能的方法 使用 v-model 绑定数据 通过 v-model 双向绑定一个布尔值,控制 toggle 的状态。适用于简单的开关场景。 <template>…

vue 实现复制功能

vue 实现复制功能

Vue 实现复制功能的几种方法 使用 document.execCommand(传统方法) methods: { copyToClipboard(text) { const textare…