新版 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 的官方文档来了解更多可用的模块和配置选项。

相关推荐
小璞10 分钟前
2. 环境配置
前端·webpack
溪森堡12 分钟前
npm和npx的区别
前端
友人.22716 分钟前
蓝桥杯,利用 Vue.js 构建简易任务管理器
前端·javascript·vue.js
VincentFHR24 分钟前
如何用 Three.js 做 3D 饼形图
前端·three.js
IT、木易1 小时前
CSS 中text - shadow和box - shadow原理、属性的使用方法及区别
前端·css
逆袭的小黄鸭1 小时前
仿 ElementPlus 组件库(八)—— Input 组件实现
前端·vue.js·typescript
用户19017684478651 小时前
基于 Service Worker 实现前端应用自动更新方案
前端
Nejosi_念旧1 小时前
详细讲解css的穿透方法
前端·css·vue.js
mornone1 小时前
Dify客户端异常: a client-side exception has occurred;getPrevChatList错误
前端
月光冷青衫1 小时前
uniapp-微信小程序-底部输入框-键盘弹出样式问题
前端