You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在React-Quill中注册quill-placeholder-autocomplete自定义模块

如何在react-quill中集成quill-placeholder-autocomplete模块

我目前正在使用react-quill模块,它的表现十分出色。我的App.js代码如下:

import { useState } from  "react";
import  ReactQuill  from  "react-quill";
import  "react-quill/dist/quill.snow.css";


const  modules  = {
    toolbar: [
        [{ font: [] }],
        [{ header: [1, 2, 3, 4, 5, 6, false] }],
        ["bold", "italic", "underline", "strike"],
        [{ color: [] }, { background: [] }],
        [{ script:  "sub" }, { script:  "super" }],
        ["blockquote", "code-block"],
        [{ list:  "ordered" }, { list:  "bullet" }],
        [{ indent:  "-1" }, { indent:  "+1" }, { align: [] }],
        ["link", "image", "video"],
        ["clean"],
    ]
};

const  App  = () => {
    const [value, setValue] =  useState("");
    console.log(value);

    return  <ReactQuill  modules={modules} theme="snow" onChange={setValue} placeholder="Content goes here..." />;
};

export  default  App;

我的index.js代码如下:

import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

不过,我希望集成自动补全功能对应的quill-placeholder-autocomplete模块。该模块的官方集成方式如下:

import getPlaceholderModule from 'quill-placeholder-module';
import getAutocompleteModule from 'quill-placeholder-autocomplete-module';

Quill.register('modules/placeholder', getPlaceholderModule(Quill,  {
  className: 'ql-placeholder-content',        // default
}));
Quill.register('modules/autocomplete', getAutocompleteModule(Quill));

const placeholders = [
  {id: 'foo', label: 'Foo'},
  {id: 'required', label: 'Required', required: true}
]

var quill = new Quill('#editor', {
  modules: {
    toolbar: {container: `#toolbar`},
    placeholder: {
      delimiters: ['{', '}'],                   // default
      placeholders
    },
    autocomplete: {
      getPlaceholders: () => placeholders       // factory
      container: '#completions',                // can also be return of `document.querySelector` or kept `undefined`
      triggerKey: '#',                          // default
      endKey: '#',                              // optional
      debounceTime: 0,                          // 0: disabled (default)
      onOpen: () => console.log('opened'),                                      // optional
      onClose: (placeholder) => console.log('user choosed:', placeholder),      // optional
      fetchPlaceholders: (query) => fetch(...).then(...)                        // optional
      onFetchStarted: (query) => console.log('user searching for:', query),     // optional
      onFetchFinished: (results) => console.log('possible results:', results),  // optional
    }
  },
  placeholder: 'Compose an epic...',
  theme: 'snow'
});

但我不知道如何在react-quill中实现该模块的注册与集成,希望能得到相关帮助。


解决方案

要在react-quill中集成quill-placeholder-autocomplete模块,按以下步骤操作即可:

1. 安装依赖

先确保安装所需模块:

npm install quill-placeholder-module quill-placeholder-autocomplete-module

2. 注册Quill模块

在react-quill初始化前,先注册placeholder和autocomplete模块,可在App.js顶部完成:

import { useState } from "react";
import ReactQuill from "react-quill";
import "react-quill/dist/quill.snow.css";
// 引入目标模块
import getPlaceholderModule from 'quill-placeholder-module';
import getAutocompleteModule from 'quill-placeholder-autocomplete-module';
// 从react-quill中获取Quill实例
const Quill = ReactQuill.Quill;

// 注册placeholder模块
Quill.register('modules/placeholder', getPlaceholderModule(Quill, {
  className: 'ql-placeholder-content', // 默认配置,可按需修改
}));
// 注册autocomplete模块
Quill.register('modules/autocomplete', getAutocompleteModule(Quill));

3. 配置modules对象

将placeholder和autocomplete的配置添加到现有modules对象中:

// 定义占位符数据
const placeholders = [
  {id: 'foo', label: 'Foo'},
  {id: 'required', label: 'Required', required: true}
];

const modules = {
    toolbar: [
        [{ font: [] }],
        [{ header: [1, 2, 3, 4, 5, 6, false] }],
        ["bold", "italic", "underline", "strike"],
        [{ color: [] }, { background: [] }],
        [{ script:  "sub" }, { script:  "super" }],
        ["blockquote", "code-block"],
        [{ list:  "ordered" }, { list:  "bullet" }],
        [{ indent:  "-1" }, { indent:  "+1" }, { align: [] }],
        ["link", "image", "video"],
        ["clean"],
    ],
    // 添加placeholder配置
    placeholder: {
      delimiters: ['{', '}'],
      placeholders
    },
    // 添加autocomplete配置
    autocomplete: {
      getPlaceholders: () => placeholders,
      triggerKey: '#',
      // 其他可选配置按需添加
      onClose: (placeholder) => console.log('选中的占位符:', placeholder),
    }
};

4. 自定义补全容器(可选)

如果需要自定义自动补全的下拉容器,可在组件中添加DOM元素并绑定到配置:

import { useState, useRef, useEffect } from "react";

const App = () => {
    const [value, setValue] = useState("");
    const completionsRef = useRef(null);

    useEffect(() => {
      if (completionsRef.current) {
        modules.autocomplete.container = completionsRef.current;
      }
    }, []);

    return (
      <div>
        <ReactQuill 
          modules={modules} 
          theme="snow" 
          onChange={setValue} 
          placeholder="Content goes here..." 
        />
        {/* 自动补全下拉容器 */}
        <div ref={completionsRef} id="completions"></div>
      </div>
    );
};

5. 测试功能

启动应用后,输入#即可触发自动补全下拉列表,选择对应占位符即可插入编辑器。

内容的提问来源于stack exchange,提问作者tobias

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:30:57