新版 React19使用 react-quill

检查 Quill 的版本:

确保你使用的 Quill 版本与 React 19 兼容。有时候,库的更新或补丁版本会解决与新版本 React 的兼容性问题。可以尝试查看 Quill 的 GitHub 仓库或 npm 页面上的 release notes。

javascript 复制代码
npm install quill@latest

如果你需要更复杂的集成或者额外的功能,可以考虑使用 react-quill 这个社区维护的库,它为 Quill 提供了一个更 React 友好的封装。安装和使用方法如下:

javascript 复制代码
npm install react-quill
javascript 复制代码
import React from 'react';
import ReactQuill from 'react-quill';
import 'react-quill/dist/quill.snow.css'; // 引入主题样式
 
function App() {
  return (
    <div>
      <ReactQuill theme="snow" />
    </div>
  );
}
 
export default App;

新版 React19版本

javascript 复制代码
npm install react-quill-new --save

参考地址: react-quill-new - npm

javascript 复制代码
import React, { useState } from 'react';
import ReactQuill from 'react-quill-new';
import 'react-quill-new/dist/quill.snow.css';

function MyComponent() {
  const [value, setValue] = useState('');

  return <ReactQuill theme="snow" value={value} onChange={setValue} />;
}

基本用法

在你的 React 组件中,你可以这样使用 React Quill:

javascript 复制代码
import React, { useState } from 'react';
import ReactQuill from 'react-quill';
import 'react-quill/dist/quill.snow.css'; // 引入样式文件
 
const EditorComponent = () => {
  const [value, setValue] = useState('');
 
  return (
    <ReactQuill
      theme="snow"
      value={value}
      onChange={setValue}
    />
  );
};
 
export default EditorComponent;

配置模块和工具栏

你可以通过 modulesformats 属性来自定义 Quill 的工具栏和功能。例如:

javascript 复制代码
// 配置 Quill 工具栏,添加图片上传按钮
const modules = {
  toolbar: {
    container: [
      [{ 'header': [1, 2, false] }],
      ['bold', 'italic', 'underline', 'strike', 'blockquote'],
      [{'list': 'ordered'}, {'list': 'bullet'}, {'indent': '-1'}, {'indent': '+1'}],
      ['link', 'image'],
      ['clean']
    ],
  },
};
 // 配置 Quill 格式
const formats = [
  'header', 'bold', 'italic', 'underline', 'strike', 'blockquote', 
  'list', 'bullet', 'indent', 'link', 'image'
];
 
<ReactQuill 
  theme="snow" 
  value={value} 
  onChange={setValue} 
  modules={modules} 
  formats={formats} 
/>;
实例:编辑页面
javascript 复制代码
import React, { useState } from'react';
// import ReactQuill from 'react-quill';
// import 'react-quill/dist/quill.snow.css';
import ReactQuill from 'react-quill-new';
import 'react-quill-new/dist/quill.snow.css';

import { Form, Input, DatePicker, Button } from 'antd'; // 导入 Ant Design 的 Form, Input, DatePicker 和 Button 组件
import 'antd/dist/antd.css';
// 配置 Quill 工具栏,添加图片上传按钮
const modules = {
  toolbar: [
    [{ 'header': [1, 2, false] }],
    ['bold', 'italic', 'underline', 'strike', 'blockquote'],
    [{'list': 'ordered'}, {'list': 'bullet'}, {'indent': '-1'}, {'indent': '+1'}],
    ['link', 'image'],
    ['clean']
  ]
};

// 配置 Quill 格式
const formats = [
  'header', 'bold', 'italic', 'underline', 'strike', 'blockquote',
  'list', 'bullet', 'indent', 'link', 'image'
];

export default function Create() {
  const [title, setTitle] = useState('');
  const [author, setAuthor] = useState('');
  const [date, setDate] = useState(new Date().toISOString().split('T')[0]);
  const [content, setContent] = useState('');

  const handleSubmit = () => {
    // 这里可以添加提交表单数据的逻辑,例如发送到后端 API
    console.log('标题:', title);
    console.log('作者:', author);
    console.log('时间:', date);
    console.log('内容:', content);
  };

  return (
    <div style={{ width: '80%', margin: '0 auto' }}>
      <h1>编辑文章</h1>
      <Form layout="vertical" onFinish={handleSubmit}>
        <Form.Item label="文章标题:" name="title">
          <Input
            value={title}
            onChange={(e) => setTitle(e.target.value)}
          />
        </Form.Item>
        <Form.Item label="作者:" name="author">
          <Input
            value={author}
            onChange={(e) => setAuthor(e.target.value)}
          />
        </Form.Item>
        <Form.Item label="时间:" name="date">
          <DatePicker
            value={new Date(date)}
            onChange={(date, dateString) => setDate(dateString)}
            format="YYYY-MM-DD"
          />
        </Form.Item>
        <Form.Item label="内容:" name="content">
          <ReactQuill
            value={content}
            onChange={setContent}
            modules={modules}
            formats={formats}
          />
        </Form.Item>
        <Form.Item>
          <Button type="primary" htmlType="submit">
            保存提交
          </Button>
        </Form.Item>
      </Form>
    </div>
  );
}

高级用法和 API 文档

对于更高级的用法,如集成到表单中、处理粘贴事件、自定义样式等,你可以查看 GitHub 仓库中的 Issues 和 Pull Requests,或者在 Stack Overflow 等社区中搜索相关的讨论和示例。React Quill 的 GitHub Issues 也是一个很好的资源,你可以在那里找到用户报告的问题和开发者提供的解决方案。

注意事项和最佳实践

  • 确保你引入了 Quill 的 CSS 文件,否则编辑器可能不会显示正确。

  • 使用 onChange 属性来处理文本的变化,这样可以保持状态同步。

  • 根据需要配置 modulesformats 以满足你的编辑需求。

  • 对于复杂的编辑器功能,考虑查看 Quill 的官方文档来了解更多可用的模块和配置选项。

相关推荐
GuWenyue28 分钟前
不用第三方SDK!Vue3原生Fetch实现DeepSeek流式输出,90%前端都会踩的分片解析坑一次性解决
前端·人工智能·llm
独隅30 分钟前
前端离线暂停更新策略:Service Worker 与 PWA 实战指南
前端
不如摸鱼去1 小时前
Wot UI 2.3.0 发布:二维码组件来了,Open Wot 与 wot-starter 同步更新
前端·ui·微信小程序·前端框架·uni-app
Cloud_bread1 小时前
从ReAct到自主闭环:Agentic Coding核心执行引擎的技术演进
前端·react.js·前端框架
cidy_982 小时前
OptMem 使用教程
前端
杉氧2 小时前
用 Compose 挑战交互与动效天花板:ComposeCraftLab 开源实验室全解析
android·前端·kotlin
Canace2 小时前
AI 生成到 90% 突然断了:你的解决方案是?
前端·人工智能
TinssonTai2 小时前
Vite 8 版 Chrome 插件全家桶,popup/options/sidepanel 一次集齐
前端·vue.js
玉鸯2 小时前
让 Agent 面向用户:AG-UI 协议构建 Agent 前端
前端·python·agent
程序员黑豆2 小时前
鸿蒙应用开发 @Extend 装饰器使用教程
前端·harmonyos