React—10—受控组件和非受控组件;高阶组件

news/2025/3/1 18:52:27/文章来源:https://www.cnblogs.com/EricShen/p/18743910

一、概念

我的理解是,是否有react提供数据,分为受控组件和非受控组件。

比如input元素,只要绑定了value属性,那么在react中,用户在输入框输入的值不会显示在输入框(react应该做了限制,原生html的input框即使value绑定了值依然可以输入),

这就导致,想改变value的值,必须监听onChange事件,然后再onChange事件里拿到用户输入的值然后再去改变message,然后value才改变。

 

 

二、使用受控组件来使用表单

import React, { PureComponent, createRef, forwardRef } from 'react';// 编写一个组件
class App extends PureComponent {constructor() {super();this.state = {username: '',password: '',isAgeree: false,hobbies: [{ value: 'sing', text: '唱', isChecked: false },{ value: 'dance', text: '跳', isChecked: false },{ value: 'rap', text: 'rap', isChecked: false }],fruit: '',fruits: []};}handleSumbit = event => {// 先阻止默认的事件提交。
    event.preventDefault();console.log(this.state)};handleChange = e => {// 对于类型为text或者password的输入框, 可以给input框绑定一个name属性值,然后可以通过可以e.target.name获取绑定的name属性值。//    通过e.target.value获取到输入框的值console.log('[  ] >', e.target, e.target.name);const { name, value } = e.target;this.setState({ [name]: value });};handleCheckBox = e => {// 对于checkbox类型的输入框, 可以通过e.target.checked获取到是否选中的ture或false;    e.target.value没有值。const { checked } = e.target;this.setState({ isAgeree: checked });};handleHobbies = (e, index) => {console.log(e);const hobbies = [...this.state.hobbies];hobbies[index]['isChecked'] = e.target.checked;this.setState({ hobbies });};handleSelect(event) {// seleced选中的值在event.target.selectedOptions.valueconst fruit = event.target.selectedOptions.value;this.setState({ fruit });}handleSelectMultiple(event) {//多选情况下,seleced选中的值在event.target.selectedOptions是一个集合,需要先用array.from转化为一个数组,这样就可以用数组的方法了。const selectedArr = Array.from(event.target.selectedOptions);const fruits = selectedArr.map(e => e.value);this.setState({ fruits });}render() {const { username, password, isAgeree, hobbies, fruit, fruits } = this.state;return (<div><form onSubmit={e => this.handleSumbit(e)}>{/* 受控组件---输入框 */}<div><label htmlFor="username">用户名:<input type="text" name="username" value={username} onChange={e => this.handleChange(e)} /></label><label htmlFor="password">密码:<input type="password" name="password" value={password} onChange={e => this.handleChange(e)} /></label></div>
{/* 受控组件---单选框 */}<input type="checkbox" checked={isAgeree} onChange={e => this.handleCheckBox(e)} />
          同意协议{/* 受控组件---多选框 */}<div>{hobbies.map((item, index) => {return (<div key={item.text}><input type="checkbox" id={item.value} checked={item.isChecked} onChange={e => this.handleHobbies(e, index)} />
                  {item.text}</div>
              );})}</div>
{/* 受控组件---下拉框()单选 */}<select name="" id="" value={fruit} onChange={e => this.handleSelect(e)}><option value="orange">橘子</option><option value="bnana">香蕉</option><option value="putao">葡萄</option></select>{/* 受控组件---下拉框()多选  按住ctrl键可以实现多选 */}<select name="" id="" value={fruits} onChange={e => this.handleSelectMultiple(e)} multiple><option value="orange">橘子</option><option value="bnana">香蕉</option><option value="putao">葡萄</option></select><button type="submit">登录</button></form></div>
    );}
}export default App;

 

 

 

 

三、高阶组件hoc

 

3.1什么是高阶组件

什么是高阶组件呢?
 相信很多同学都知道(听说过?),也用过 高阶函数, 它们非常相似,所以我们可以先来回顾一下什么是 高阶函数。
 高阶函数的维基百科定义:至少满足以下条件之一:
  •  接受一个或多个函数作为输入;
  •  输出一个函数;
JavaScript中比较常见的filter、map、reduce都是高阶函数。
 
 那么说明是高阶组件呢?
 高阶组件的英文是 Higher-Order Components,简称为 HOC;
官方的定义:高阶组件是参数为组件,返回值为新组件的函数;
 我们可以进行如下的解析:
  •  首先, 高阶组件 本身不是一个组件,而是一个函数;
  • 其次,这个函数的参数是一个组件,返回值也是一个组件;

 

我们前面用的memo()和forwardRef()都是高阶组件。

 

3.2高阶组件目的是

1.对组件做拦截做处理

2.处理代码是可复用的。不用对每一个要拦截的代码,都写一遍处理代码,那是在他麻烦了。

 

3.3举例

这里,我们可以计算每个页面的挂载时长。

 

得到一个组件,可以通过props给他传递一些信息,然后最终返回一个组件(类组件和函数组件都可以),

import { PureComponent } from 'react';function logMountTime(OriginComponent) {return class extends PureComponent {constructor() {super();this.state = {foo: '这里可以添加一些处理操作'};}UNSAFE_componentWillMount() {this.beginTime = new Date().getTime();}componentDidMount() {this.endTime = new Date().getTime();console.log(`页面${OriginComponent.name}渲染时间是${this.endTime - this.beginTime}ms`);}render() {return <OriginComponent {...this.state}></OriginComponent>;
    }};
}export default logMountTime;

 

Head组件用高阶组件包裹之后,再export default logMountTime(Head)返回出去。

import React, { PureComponent } from 'react'
import {  } from './hoc'
import logMountTime from './hoc'
export class Head extends PureComponent {render() {return (<div>Head{this.props.foo}<ul><li>数据列表</li><li>数据列表</li><li>数据列表</li><li>数据列表</li><li>数据列表</li><li>数据列表</li><li>数据列表</li><li>数据列表</li><li>数据列表</li><li>数据列表</li></ul></div>
    )}
}// export default Head
export default logMountTime(Head)

 

由于Head组件里是用的export Default导出的,所以App在引入的时候可以自己起别名,那就还叫Head,然后由于App组件正常引入即可展示。

import React, { PureComponent, } from 'react';
import Head from './Head.jsx'
// 编写一个组件
class App extends PureComponent {constructor() {super();this.state = {};}render() {return (<div><Head></Head></div>
    );}
}export default App;

 

 

 

 

 

 

3.4发展历程

由于hoc也可以给组件复制props,如果嵌套过多,可以出现同一个叫name的props被重复赋值。

 mixin没必要学了,hoc可以理解,重点掌握后面的hooks。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/891643.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

autojs通过vscode写好的文件上传的手机,并打包apk

1.安装vscode 2.下载autojs插件和chinese插件3.启动autojs插件,手机才可以链接 (链接时输入的是手机的ip地址)4.上传到手机5.打包本文来自博客园,作者:六月OvO,转载请注明原文链接:https://www.cnblogs.com/chenlifan/p/18745272

Windows 提权-UAC 绕过

本文通过 Google 翻译 UAC-Bypass – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。导航0 前言 1 场景一:枚举得到存储的管理员凭证(GUI 环境)1.1 使用 netplwiz.exe 帮助主题绕过 UAC2 场景二:枚举得到…

三剑客与正则系列-正则表达式

1.注意事项正则符号都是英文符号,避免使用中文符号 推荐使用grep/egrep命令,默认设置了别名,自动加上颜色 http://nbre.oldboylinux.cn/ 分析正则与正则匹配到的内容. 其他坑.# "" . #‘’ ”“ 。alias grep=grep color=auto alias egrep=egrep color=auto2.符号概述…

【凸优化笔记2】-凸函数、下水平集、范数

转自:https://zhuanlan.zhihu.com/p/102098039 1. 凸函数 1.1 凸函数定义 一个函数𝑓:𝑅𝑛→𝑅是凸的,如果定义域𝑑𝑜𝑚𝑓是凸集,并且对于所有𝑥,𝑦∈𝑑𝑜𝑚𝑓,𝜃∈[0,1],都有: 𝑓(𝜃𝑥+(1−𝜃)𝑦)≤𝜃𝑓(𝑥)+(1−𝜃)𝑓…

使用AI后为什么思考会变得困难?

使用AI后为什么思考会变得困难? 我总结了四篇近期的研究论文,来展示AI是如何以及为什么侵蚀我们的批判性思维能力。作者使用AI制作的图像前言:作者在这篇文章中,借AI技术的崛起,揭示了一场悄然发生的思想博弈。表面上,AI为我们带来了前所未有的效率与便捷,但在无形之中,…

44页太阳花绘制

点击查看代码 from turtle import * color(red, yellow) begin_fill() while True:forward(200)left(170)if abs(pos()) < 1:break end_fill() done()

leetcode hot 15

解题思路:思路还是比较清晰,先按照起始位置排序,然后再逐个遍历,根据起始位置与前一个结束位置进行比较,两种情况进行处理即可(这边代码比较麻烦因为前面list泛型用错了) import java.util.Arrays; class Solution {public int[][] merge(int[][] intervals) {List<Lis…

WgelCTF打靶笔记(2)

参考视频:https://www.bilibili.com/video/BV1itwgeHEEk/?spm_id_from=333.1387.upload.video_card.click&vd_source=e948147c25027ef3216b5c376b31fc96扫描dirb: 发现.ssh有一个id_rsa文件,即ssh连接私钥,右键下载到本地 ssh私钥: SSH:用于安全的连接到远程服务器 …

44页五角星绘制

点击查看代码 from turtle import * fillcolor("red") begin_fill() while True:forward(200)right(144)if abs(pos()) < 1:break end_fill()

Go1.24版本终于来了!各位开发者,准备好迎接这些激动人心的新功能了吗?让我们一起来探讨下Go1.24中有哪些精彩的亮点?

前言 Gopher们,Go 1.24.0 正式发布了!与 Go 1.23.0 相比,这个版本带来了众多改进。让我们一同看看 Go 1.24.0 都有哪些新变化吧! 在 Windows 下,请在 https://github.com/voidint/g/releases 下载适合您系统的版本。例如,如果您的系统是 64 位的,可以下载 g1.7.0.window…

FastAPI极速入门:15分钟搭建你的首个智能API(附自动文档生成)

title: FastAPI极速入门:15分钟搭建你的首个智能API(附自动文档生成)🚀 date: 2025/3/1 updated: 2025/3/1 author: cmdragon excerpt: 用虚拟环境打造纯净开发空间的3种方法 只需5行代码实现智能API端点 自动生成媲美大厂的交互式API文档 解决新手必踩的9大坑点(含依赖…

rocketmq不同服务使用相同消费者组和生产者组的问题

之前多个服务使用同一个消费者组和生产者组procfg-consumer-group和procfg-produce-group,然后共享同一个Topic。 时不时会有问题,例如主控服务版本更新之后虽然消息发出来了,但是终端接收不到,消息有时会有CONSUMED_BUT_FILTERED(被过滤)个人理解的原因是多个服务用同一个…