【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携带封面图发布文章

相关推荐
qq_1777673715 小时前
React Native鸿蒙跨平台数据使用监控应用技术,通过setInterval每5秒更新一次数据使用情况和套餐使用情况,模拟了真实应用中的数据监控场景
开发语言·前端·javascript·react native·react.js·ecmascript·harmonyos
烬头882115 小时前
React Native鸿蒙跨平台应用实现了onCategoryPress等核心函数,用于处理用户交互和状态更新,通过计算已支出和剩余预算
前端·javascript·react native·react.js·ecmascript·交互·harmonyos
2601_9495936517 小时前
基础入门 React Native 鸿蒙跨平台开发:卡片组件
react native·react.js·harmonyos
天人合一peng17 小时前
Unity中button 和toggle监听事件函数有无参数
前端·unity·游戏引擎
方也_arkling18 小时前
别名路径联想提示。@/统一文件路径的配置
前端·javascript
毕设源码-朱学姐18 小时前
【开题答辩全过程】以 基于web教师继续教育系统的设计与实现为例,包含答辩的问题和答案
前端
qq_1777673718 小时前
React Native鸿蒙跨平台剧集管理应用实现,包含主应用组件、剧集列表、分类筛选、搜索排序等功能模块
javascript·react native·react.js·交互·harmonyos
qq_1777673718 小时前
React Native鸿蒙跨平台自定义复选框组件,通过样式数组实现选中/未选中状态的样式切换,使用链式调用替代样式数组,实现状态驱动的样式变化
javascript·react native·react.js·架构·ecmascript·harmonyos·媒体
web打印社区18 小时前
web-print-pdf:突破浏览器限制,实现专业级Web静默打印
前端·javascript·vue.js·electron·html
RFCEO18 小时前
前端编程 课程十三、:CSS核心基础1:CSS选择器
前端·css·css基础选择器详细教程·css类选择器使用方法·css类选择器命名规范·css后代选择器·精准选中嵌套元素