中文文档;
It is a library like at.js for vue3.
npm install vue3-at --save
<template> <vue3-at :atMap="atMap" @at="onAt" :renderTagItem="renderTagItem"> <div class="editor" contenteditable></div> <template v-slot:listItem="{ item }"> <div v-if="item.isSubjectTitle">{{ item.title }}</div> <div class="list-item" v-else-if="item.tag"> {{ item.tag }} </div> <div class="list-item" v-else> <img :src="item.avatar" alt="" />{{ item.name }} </div> </template> </vue3-at> </template> <script lang="ts"> import { defineComponent, ref } from "vue"; import { Vue3At } from "../src/"; export default defineComponent({ name: "App", components: { Vue3At, }, setup() { const atMap = ref({ "@": { keyName: "name", list: [ { isSubjectTitle: true, title: "最近联系人", }, { name: "SHISME", userId: "", avatar: "https://avatars.githubusercontent.com/u/17661313?s=40&v=4", }, { name: "CAYAHUANG", userId: "", avatar: "https://avatars.githubusercontent.com/u/18247969?s=100&v=4", }, { isSubjectTitle: true, title: "好友", }, { name: "OuYang", userId: "", avatar: "https://avatars.githubusercontent.com/u/13029538?s=100&v=4", }, { name: "SAGA", avatar: "https://avatars.githubusercontent.com/u/16740021?s=100&v=4", userId: "", }, ], }, "#": { keyName: "tag", list: [ { tag: "666", }, ], }, }); return { atMap, onAt({ at, inputChunk }: { at: string; inputChunk: string }) { console.log("onAt:", at, inputChunk); }, renderTagItem( row: { name: string; userId: string } | { tag: string } ): string { if (row.tag) { return `<span style="color: deepskyblue">${row.tag}</span>`; } return `<span style="color:#003569;" data-user-id="${row.userId}">@${row.name}</span>`; }, }; }, }); </script>
interface IVue3AtProps { /** * required * key is 'at' character which when you input it will show the list, * keyName is the property name of the list's item. */ atMap:{ [at: string]: {list: any[];keyName: string;[]} }; /** * optional * Use it to render custom tag * @param item; atMap list's item */ renderTagItem:(item: any) => string; /** * optional * If you want tag can be modified,set it to false * @default true */ disabledModifyTag: boolean; /** * optional * It will control the visible of subject title * * @default true; */ showSubjectTitle: boolean; /** * optional * Enable space between @ and word * * @default false; */ allowSpaces: boolean; /** * optional * If you want to filter by your self, use it to control. * @param item; atMap list's item * @param inputChunk; inputing chunk * @param keyName; */ filtersFn:(item:any, inputChunk:string, keyName:string) => boolean; }
parameter: {at: string; inputChunk:string}
when at will be input
parameter is the item which will be inserted
parameter is the item which had be clicked in list.
no parameter.
slot scoped:item,curIndex,index