首页 > 其他分享 >CS571 W7-React4/HW6

CS571 W7-React4/HW6

时间:2024-04-02 15:15:44浏览次数:38  
标签:受控 HTTP res React4 W7 组件 Cookie HW6

1. API 使用进阶

在过去的作业中,我们了解了 fetch 函数的 GET 方法。

与 API 交互所使用的函数均为 fetch (无论是采用 GET,POST 还是别的任何方法)。

一个通用的 fetch 函数案例:

fetch(`https://cs571.org/api/f23/hw6/messages?chatroom=${props.name}`,{
   method:"POST",
   credentials:"include",
   headers: {
       "X-CS571-ID": CS571.getBadgerId(),
       "Content-Type":"application/json"
   },
   body: JSON.stringify({
       "title":tit,
       "content":cnt
   })
   }).then(res=>res.json())
   .then(res=>{
   console.log(res);
   alert(res.msg);
   loadMessages();
})

对于非 GET 类型的请求,必须在代码开头标注 method:"POST" (或是PUT / DELETE)

四种基本请求操作:GET 读取,POST 创建PUT 更新,DELETE 删除

返回码

使用 res.status 方法来读取(请与 res.json() 作出区分,res.json() 是将返回值转为 JS object 的函数,而 res.status 是一个数值。

以下是常见的返回码:

HTTP Code Response Type
200s 成功
300s 重定向消息
400s 用户端出现问题
500s 服务器出现问题
HTTP Code Response
200 OK
304 已在本地有缓存
400 Bad Request(例如body中内容格式不符合要求)
401 未授权(例如没有Badger ID)
404 Not Found
409 冲突(例如试图 POST 已有的内容)
413 请求长度超标
500 内部服务器错误

注意事项

  1. 如果需要调取登陆状态进行需要权限的操作,则需要添加 credentials:"include" 一行
  2. 虽然传输的 body 本质是一个 JSON,但是它只接受字符串形式,所以使用 JSON.stringfy()
  3. 在含有 body 的请求当中,需要在 headers 里边注明 Content-Type 表示客户端传送内容的数据类型。例如: "Content-Type":"application/json"

2. 非受控组件

使用 useRef 方法。useref 是一个对不需要渲染的值的引用。

const remosk=useRef();
<Form.Control ref="remosk"></Form.Control>

remosk.current.value//获取当前输入框的值

头文件包含在 "react" 中,需要引入 "useRef" 属性。

非受控组件适合用于戳按钮后再一次提交,受控组件适合动态更新的场景(例如搜索框,随时根据当前的文本内容更新搜索建议)。

受控组件在效率上“似乎”要低于非受控组件,但实质上影响不大,因为受控组件只会修改虚拟 DOM 而不会修改真实 DOM,没有重新渲染的操作。因此 React 官方推荐使用受控组件

什么是Cookie?

HTTP 最大的特点是无连接无状态。Cookie 的作用是让浏览器在一段时间内认识你。

Cookie 是浏览一个网站时,由 Web 服务器存储在你的机器硬盘上的一个小的文本文件。当再次来到该网站时,浏览器会先检查有无对应的 Cookie 。如果有,浏览器会自动带上 Cookie 发送到服务端。

注:为什么我们需要显式地写上 credentials:"include"

CS571.org 和 localhost 是不同的域名。通常情况下,浏览器不允许 http 请求跨域携带 cookies 所以需要特殊标明

如果该 Cookie 被设置为 HTTP-Only 则它只能在服务端修改,客户端的 JS 脚本无法访问或修改它。

HW6:登录状态

在 HW6 中,我们需要实现这样一个功能:检测登录状态,如果在线则在导航栏内显示“登出”,如果离线,显示“登入”。

由于 HTTP-Only 不能被 JS 看到,所以需要使用 sessionStorage 配合 ContextProvider 来记录登陆状态。

4. 细节知识

1. 模板字符串

使用 `` 括起来。

内部可以使用$表示转义字符

示例代码:

fetch(`https://cs571.org/api/f23/hw6/messages?chatroom=${props.name}`,{})

2. HW6:页面强制刷新

在 submit 完修改后立刻调用一次 loadMessages

3. HW6:“不同聊天室” 的实现

导航栏:使用 Navbar 组件

下拉菜单:使用 NavDropdown 组件

HW6 在 BrowserRouter 部分的结构如下:

<BrowserRouter>
 <Routes>
    <Route path="/" element={<BadgerLayout chatrooms={chatrooms} />}>
      <Route index element={<BadgerChatHome />} />
      <Route path="/login" element={<BadgerLogin />}></Route>
      <Route path="/register" element={<BadgerRegister />}></Route>
      <Route path="/logout" element={<BadgerLogout />}></Route>
      {
        chatrooms.map(chatroom => {
          return <Route key={chatroom} path={`chatrooms/${chatroom}`} element={<BadgerChatroom name={chatroom} />} />
        })
      }
      <Route path="*" element={<BadgerNoMatch />} />
    </Route>
  </Routes>
</BrowserRouter>

可以看到,不同 Chatroom 的链接虽然不同,但使用的 React 组件是一致的,仅在传入的 props.name 上作区分。因此,在 Chatroom 间切换,页面不会重新加载。

故使用 useEffect(loadMessages, [props]); 而非 useEffect(loadMesages,[])

标签:受控,HTTP,res,React4,W7,组件,Cookie,HW6
From: https://www.cnblogs.com/ss80194/p/18110594

相关文章

  • window7系统 rabbitmq服务启动不了
    问题描述:解决方案:1.检查win7是否是sp1版本桌面计算机鼠标右键属性,打开系统属性窗口,如下图所示:2.如果不是,下载windows6.1-kb976932-x64补丁安装,安装完成后重启电脑3.电脑重启后,下载vcredist_x64或者vcredist_x86软件安装(根据系统32位还是64位,下载不同的安装包安装),安装完成......
  • 【CPL-2023】W7笔记-递归
    递归数学归纳法:基础情况归纳步骤通过参数控制问题解决的规模传参不同可能会导致不同的递归深度有可能造成栈溢出递归中冗余的调度归并排序-递归版不能直接在待排序的数组上进行swap操作,因为会造成原有数据的覆盖后面复杂二分查找-递归版快速排序-递归版qui......
  • CINTA hw7
    4、证明勒让德符号的若干属性:如果a≡b(modp),则(\(a\overp\))=(\(b\overp\));(\(a\overp\))(\(b\overp\))=(\(ab\overp\));(\(a^2\overp\))=1证明:a≡b(modp)a为模p的QR:a≡b≡x2(modp)b也为模p的QR(\(a\overp\))=(\(b\overp\))=1a为模p......
  • ACW756回形矩阵
    点击查看代码importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intn=sc.nextInt();intm=sc.nextInt();intres[][]=newint[n][m];//......
  • mask-rcnn_swin-t-p4-w7_fpn_1x_coco.py 里面的内容
    _base_=['../_base_/models/mask-rcnn_r50_fpn.py','../_base_/datasets/coco_instance.py','../_base_/schedules/schedule_1x.py','../_base_/default_runtime.py']pretrained='https://github.com/Swi......
  • window7设置文件夹选项——显示文件扩展名
         公司给我们换了新电脑,由神舟换成联想,公司的几台神舟均先后出现问题,故被同事命名为:神舟垃圾。     联想本机安装的就是家庭版window7,已经花了一天一晚都没整好。     sqlserver2005,oracle均装不上去,真是急死人了,不兼容装不了那要这个系统干吗。同事想把整个......
  • window7 无法安装Net48的问题
    此操作系统不支持.NETFramework4.8.1。-『悬赏问答区』-吾爱破解-LCG-LSG|安卓破解|病毒分析|www.52pojie.cn安装一个4.8的离线包,下载地址:https://download.visualstudio.microsoft.com/download/pr/2d6bb6b2-226a-4baa-bdec-798822606ff1/8494001c276a4b96804cde7829......
  • X61/T61/X200/T400/T500/W500/W700使用XP安装盘安装系统及驱动全攻略(
    X61/T61/X200/T400/T500/W500/W700使用XP安装盘安装系统及驱动全攻略(视频)X61T61X200T400T500W500W700使用XP装盘安装系统及驱动全攻略针对目前现有机器,有好多朋友都有说过不安在Thinkpad的机器上装系统,即使会装系统的话,有很多驱动也是搞不好。所以针对......
  • Qt mingw73_32 + MySql8.0 使用和对数据库操作 - 初窥篇1
    1、开发环境QtCreator4.8.2+Qt5.12.2+MySql8.0.332、设计背景现在已经有MySql8.0.33是64位的数据库,仅支持64位的程序,但是当前Qt程序编译环境是mingw73_3232位程序连接64位的数据库实例3、操作流程1)测试驱动代码+测试结果intmain(inta......
  • 一款纯VF控制的变频器方案方案说明:可做0.2KW7.5KW 220V,0.2KW75KW 380V,富士通MB90F462
    一款纯VF控制的变频器方案方案说明:可做0.2KW7.5KW220V,0.2KW75KW380V,富士通MB90F462ALQFP64单片机控制,可提供源码及电路原理图,PCB图这是一种基于纯VF控制的变频器方案。它可以在220V电压下提供0.2KW到7.5KW的功率输出,或者在380V电压下提供0.2KW到75KW的功率输出。该方案采用了......