【React】极客园案例实践-发布文章模块

前情提要-Layout模块完成

发布文章模块

4、发布文章模块

4-1 实现基础文章发布

创建基础结构

pages/Publish/index.jsx

jsx 复制代码
import {
  Card,
  Breadcrumb,
  Form,
  Button,
  Radio,
  Input,
  Upload,
  Space,
  Select
} from 'antd'
import { PlusOutlined } from '@ant-design/icons'
import { Link } from 'react-router-dom'
import './index.scss'

const { Option } = Select

const Publish = () => {
  return (
    <div className="publish">
      <Card
        title={
          <Breadcrumb items={[
            { title: <Link to={'/'}>首页</Link> },
            { title: '发布文章' },
          ]}
          />
        }
      >
        <Form
          labelCol={{ span: 4 }}
          wrapperCol={{ span: 16 }}
          initialValues={{ type: 1 }}
        >
          <Form.Item
            label="标题"
            name="title"
            rules={[{ required: true, message: '请输入文章标题' }]}
          >
            <Input placeholder="请输入文章标题" style={{ width: 400 }} />
          </Form.Item>
          <Form.Item
            label="频道"
            name="channel_id"
            rules={[{ required: true, message: '请选择文章频道' }]}
          >
            <Select placeholder="请选择文章频道" style={{ width: 400 }}>
              <Option value={0}>推荐</Option>
            </Select>
          </Form.Item>
          <Form.Item
            label="内容"
            name="content"
            rules={[{ required: true, message: '请输入文章内容' }]}
          ></Form.Item>

          <Form.Item wrapperCol={{ offset: 4 }}>
            <Space>
              <Button size="large" type="primary" htmlType="submit">
                发布文章
              </Button>
            </Space>
          </Form.Item>
        </Form>
      </Card>
    </div>
  )
}

export default Publish

pages/Publish/index.scss

css 复制代码
.publish {
  position: relative;
}

.ant-upload-list {
  .ant-upload-list-picture-card-container,
  .ant-upload-select {
    width: 146px;
    height: 146px;
  }
}

提交-17发布文章-基础结构搭建

准备富文本编辑器

实现步骤

  1. 安装富文本编辑器
  2. 导入富文本编辑器组件以及样式文件
  3. 渲染富文本编辑器组件
  4. 调整富文本编辑器的样式

代码落地

1-安装 react-quill

bash 复制代码
npm i react-quill@2.0.0-beta.2 --legacy-peer-deps

2-导入资源渲染组件

bash 复制代码
import ReactQuill from 'react-quill'
import 'react-quill/dist/quill.snow.css'

<ReactQuill
   className="publish-quill"
   theme="snow"
   placeholder="请输入文章内容"
 />

pages/Publish/index.jsx

css 复制代码
.publish-quill {
  .ql-editor {
    min-height: 300px;
  }
}

pages/Publish/index.scss

提交-18发布文章-接入富文本编辑器

频道数据获取

实现步骤

  1. 使用useState初始化数据和修改数据的方法
  2. 在useEffect中调用接口并保存数据
  3. 使用数据渲染对应模版


apis/article.jsx

jsx 复制代码
// 封装文章相关的所有请求

import { request } from "@/utils"

// 获取所有频道
export function getChannelAPI(formData) {
  // axios规范写法
  return request({
    url: '/channels',
    method: 'GET',
  })
}

pages/Publish/index.jsx

提交-19发布文章-频道列表的获取渲染

发布文章

测试

提交-20发布文章-基础文章发布

4-2 上传封面实现

准备上传结构

放在内容的上面,频道的下面

jsx 复制代码
<Form.Item label="封面">
  <Form.Item name="type">
    <Radio.Group>
      <Radio value={1}>单图</Radio>
      <Radio value={3}>三图</Radio>
      <Radio value={0}>无图</Radio>
    </Radio.Group>
  </Form.Item>
  <Upload
    listType="picture-card"
    showUploadList
  >
    <div style={{ marginTop: 8 }}>
      <PlusOutlined />
    </div>
  </Upload>
</Form.Item>

实现现基础上传

实现步骤

  1. 为 Upload 组件添加 action 属性,配置封面图片上传接口地址
  2. 为 Upload组件添加 name属性, 接口要求的字段名
  3. 为 Upload 添加 onChange 属性,在事件中拿到当前图片数据,并存储到React状态中

代码实现

测试


注意

上传的图片不能太大,不然会返回500,选一张图片大小小于1MB的上传

我用apifox测试半天,以为是接口坏了,后面发现是上传的图片文件太大了

提交-21封面的基础上传

4-3 切换图片Type

实现步骤

  1. 点击单选框时拿到当前的类型value
  2. 根据value控制上传组件的显示(大于零时才显示)

提交-22图片封面类型的切换交互实现

4-4 控制最大上传图片数量

实现步骤

  1. 通过 maxCount 属性限制图片的上传图片数量

提交-23限制图片最大上传数量

4-5 发布带封面的文章

校验图片类型和数量是否吻合

处理图片列表格式为接口格式

后端发布文章接口要求的images格式

实际获取的imageList格式

测试

4-6 暂存图片列表实现

业务描述

如果当前为三图模式,已经完成了上传,选择单图只显示一张,再切换到三图继续显示三张,该如何实现?

实现思路

在上传完毕之后通过ref存储所有图片,需要几张就显示几张,其实也就是把ref当仓库,用多少拿多少

实现步骤

  1. 通过useRef创建一个暂存仓库,在上传完毕图片的时候把图片列表存入
  2. 如果是单图模式,就从仓库里取第一张图,以数组的形式存入fileList
  3. 如果是三图模式,就把仓库里所有的图片,以数组的形式存入fileList

fileList :已经上传的文件列表(受控),Upload 组件会根据 fileList 自动渲染已选择 / 已上传的文件

代码实现

注意:需要给Upload组件添加fileList属性,达成受控的目的

fileList 是 Upload 组件的「状态核心」

  1. 类型必须是数组:空列表用 \[\],单个文件用 文件对象
  2. 数组元素是文件对象:包含 uid、name、status 等关键属性;
  3. 通过 onChange 实现受控:组件状态变化后,通过 setFileList 更新 fileList,形成闭环。

提交-24携带封面图发布文章

相关推荐
赖龙10 小时前
pnpm vs npm
前端·npm·node.js
学如逆水,不进则退11 小时前
在线免费音频剪辑:NBTools 可视化波形裁剪 MP3/WAV,本地处理免上传
前端·音视频
Mh11 小时前
虚拟滚动真的比普通滚动性能更好吗?
前端·javascript·性能优化
pe7er11 小时前
React + Ant Design 中的 IME (输入法合成)安全输入组件
前端
Super 含12 小时前
Android 启动优化(二):TTID、TTFD 与 Macrobenchmark 启动性能测量
前端
Python私教12 小时前
别急着加 llms.txt:企业官网面向 AI 搜索的工程清单
前端·人工智能·seo
东方小月12 小时前
从零开发一个 Coding Agent(十三):实现安全的 read 文件读取工具
前端·人工智能·全栈
东方小月13 小时前
从零开发一个 Coding Agent(十二):实现版本化 JSONL 与真实 CLI 入口
前端·设计模式·前端框架
FL162386312914 小时前
室内易燃物识别易燃评估室内易燃程度识别分割数据集labelme格式1015张85类别
java·服务器·前端
用户0595401744614 小时前
把 AI 长期记忆去重测试从 20 分钟压到 40 秒,重复率从 18% 干到 1.5%
前端·css