본문 바로가기
React/React 실습

[React] Mention 기능 (Tribute.js)

by haheehee 2025. 2. 3.

Tribute.js는 웹에서 @멘션 기능을 쉽게 구현할 수 있는 JavaScript 라이브러리입니다. 사용자가 특정 문자를 입력할 때, 해당 문자에 맞는 추천 목록(예: 사용자 목록)을 표시해주고, 그 중 하나를 선택할 수 있는 기능을 제공합니다. 주로 채팅 또는 댓글 시스템에서 사용자의 이름이나 태그를 입력할 때 편리하게 사용됩니다.

기본 동작

  1. 사용자가 @를 입력하면, 미리 정의된 리스트(예: 사용자 목록)에서 해당하는 항목들이 자동으로 제안됩니다.
  2. 사용자가 제안된 목록 중 하나를 선택하면, 텍스트에 해당 항목이 삽입됩니다.
  3. 이 라이브러리는 텍스트 영역, 인풋 필드, 또는 WYSIWYG 편집기와 함께 사용할 수 있습니다.

예시

간단한 예제를 통해서 사용 방법을 설명하겠습니다. @아이콘 버튼을 누르면 멤버 리스트가 뜨는 기능을 함께 추가해보겠습니다.

1. 기본 Tribute.js 설정

먼저 Tribute.js를 설정하여 멘션 기능을 적용해보겠습니다.

<!DOCTYPE html> 
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Tribute.js Example</title>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tributejs/5.1.3/tribute.css">
</head>
<body>
  <div>
    <button id="mentionButton">@ Mention</button>
    <textarea id="mentionArea" rows="5" cols="50"></textarea>
  </div>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/tributejs/5.1.3/tribute.js"></script>
  <script>
    // 멤버 리스트 정의
    const members = [
      { key: 'John Doe', value: 'john_doe' },
      { key: 'Jane Smith', value: 'jane_smith' },
      { key: 'Alice Johnson', value: 'alice_johnson' }
    ];

    // Tribute 객체 생성
    const tribute = new Tribute({
      values: members,
      selectTemplate: function(item) {
        return `@${item.original.key}`; // 멤버 선택 시 텍스트로 표시될 형식
      }
    });

    // textarea에 Tribute.js 적용
    tribute.attach(document.getElementById('mentionArea'));

    // 버튼을 눌렀을 때 @ 트리거 발생시키기
    document.getElementById('mentionButton').addEventListener('click', () => {
      const mentionArea = document.getElementById('mentionArea');
      mentionArea.focus();
      mentionArea.value += '@'; // @을 텍스트에 추가하고 Tribute가 작동하도록
      mentionArea.dispatchEvent(new Event('input')); // input 이벤트를 트리거하여 리스트 표시
    });
  </script>
</body>
</html>

 

2. 코드 설명

  1. Tribute 객체 생성: 멤버 리스트를 정의하고, key와 value를 포함하는 객체 배열을 제공합니다. key는 보여지는 이름이고, value는 해당 항목에 대한 고유값입니다.
  2. selectTemplate: 사용자가 목록에서 항목을 선택했을 때, 텍스트에 어떻게 나타날지를 정의합니다. 여기서는 @ 뒤에 멤버의 이름이 추가되도록 설정했습니다.
  3. 버튼 이벤트: @ Mention 버튼을 눌렀을 때, @ 문자를 텍스트에 추가하고 input 이벤트를 트리거해서 멤버 리스트가 나타나도록 구현했습니다.

이 방식으로, @ 아이콘 버튼을 눌렀을 때 멤버 리스트를 팝업 형식으로 나타낼 수 있습니다.

 


React이라면?

React에서 Tribute.js를 사용하여 @아이콘 버튼을 눌렀을 때 멤버 리스트가 뜨는 기능을 구현할 수 있습니다. 다음은 React에서 이를 적용하는 방법입니다.

React에서 Tribute.js 사용 예시

  1. Tribute.js를 설치합니다.
npm install tributejs
  1. React 컴포넌트로 구현하기
import React, { useRef, useEffect } from 'react';
import Tribute from 'tributejs';
import 'tributejs/dist/tribute.css';

const MentionComponent = () => {
  const textareaRef = useRef(null);
  const tributeRef = useRef(null);

  // 멤버 리스트 정의
  const members = [
    { key: 'John Doe', value: 'john_doe' },
    { key: 'Jane Smith', value: 'jane_smith' },
    { key: 'Alice Johnson', value: 'alice_johnson' }
  ];

  useEffect(() => {
    // Tribute.js 설정
    tributeRef.current = new Tribute({
      values: members,
      selectTemplate: function (item) {
        return `@${item.original.key}`;
      }
    });

    // Tribute.js를 textarea에 연결
    if (textareaRef.current) {
      tributeRef.current.attach(textareaRef.current);
    }

    return () => {
      // 컴포넌트 언마운트 시 연결 해제
      if (tributeRef.current) {
        tributeRef.current.detach(textareaRef.current);
      }
    };
  }, [members]);

  // 버튼 클릭 시 @ 추가하고 Tribute 리스트 표시
  const handleMentionClick = () => {
    const textarea = textareaRef.current;
    if (textarea) {
      textarea.focus();
      textarea.value += '@';
      textarea.dispatchEvent(new Event('input')); // input 이벤트 트리거
    }
  };

  return (
    <div>
      <button onClick={handleMentionClick}>@ Mention</button>
      <textarea ref={textareaRef} rows="5" cols="50" />
    </div>
  );
};

export default MentionComponent;

주요 부분 설명

  1. Tribute.js 초기화: useEffect 훅을 사용하여 Tribute.js를 설정하고, 멤버 리스트(members)를 값으로 전달합니다.
  2. textarea 연결: tributeRef를 사용해 Tribute.js 객체를 생성하고, textareaRef를 통해 textarea에 붙입니다.
  3. 버튼 클릭 이벤트: 버튼을 누르면 textarea에 @ 문자를 추가하고 input 이벤트를 트리거하여 멤버 리스트가 표시되도록 합니다.
  4. 컴포넌트 언마운트 시 정리: useEffect의 return 구문을 통해 컴포넌트가 언마운트될 때 Tribute.js 연결을 해제합니다.

이 코드로 React에서 Tribute.js를 사용하여 @아이콘 버튼을 누르면 멤버 리스트가 표시되는 기능을 쉽게 구현할 수 있습니다.

댓글