随便写点东西

server/2024/9/20 3:56:27/ 标签: react.js, javascript, 前端

1 react的高阶组件

1.1 操纵组件的props、对组件的props进行增删;
1.2 复用组件逻辑
服用的组件逻辑,互不影响;比如高阶组件中复用了input框,输入内容是互不影响的;
1.3 可以通过配置装饰器来实现高阶组件(只能在类组件中使用)
之前:

javascript">import { test } from './test.jsx';
export default test(A);

现在:

javascript">import { test } from './test.jsx';
@test
export default A;

1.4 利用forwardRef,通过ref转发获取DOM节点
高阶组件test

javascript">export default class App extends React.Component {constructor() {super();this.testRef = React.createRef();}render() {return (<div><p>App Page</p><A ref={this.testRef} /><B /></div>);};componentDidMount() {console.log(this.testRef.current);}
}

第一种情况:

javascript">export default function test(Comp) {class HOC extends React.Component {render() {return <Comp {...this.props} />;};}return HOC;
}

如果A组件不使用高阶组件,this.testRef.current指的是A组件实例;
A组件使用了高阶组件,this.testRef.current指的是高阶组件实例;

第二种情况:
命名forwardRef,将ref传下去

javascript">export default function test(Comp) {class HOC extends React.Component {render() {return <Comp {..this.props}/>;};}return React.forwardRef((props, ref) => {return <HOC {...props} forwardRef={ref} />})
}
javascript">@test
class A extends React.Component {render() {return (<div ref={this.props.forwardRef}><p>A Component</p></div>);};
}

this.testRef.current指的是A组件实例,可以拿到DOM节点

1.5 反向继承(可以做渲染劫持)
之前高阶组件传入一个组件,返回一个组件,返回的组件 extends React.Component,这种叫属性代理
下面这种叫反向继承,可以做渲染劫持

javascript">export default function test(Comp) {return class extends Comp {render() {const element = super.render(); // super.render()返回虚拟DOMconst newProps = element.type === 'div'? { style: { color: '#f00' } }: { style: { color: '#0f0' } };return React.cloneElement(element,{ ...this.props, ...newProps },element.props.children,);};}
}

2 受控组件和非受控组件

是否受控取决于 是否可以使用state控制输入框

<input />这样的输入框是非受控的,即使使用<input defaultValue="Initial text" />传递了初始值,JSX也只是指定了初始值,而非当前时刻的值,也属于非受控组件;

如果要渲染一个受控输入框,请传递 value 属性(或者向多选框和单选框按钮传递 checked);React将强制传递 value属性给输入框,通常可以通过声明一个 state 来控制输入框;

javascript">function Form() {const [firstName, setFirstName] = useState('');return (<inputvalue={firstName}onChange={e => setFirstName(e.target.value)}/>)
}

看下面的例子

<form>受控:<input type="text" value={num} />非受控:<input type="text" defaultValue={num} /><button type="button" onClick={() => setNum(num + 1)}>+1</button>
</form>

点击按钮,受控组件值会变,但是非受控组件值不变,不受状态影响;
受控组件值不可以手动输入更改;非受控组件可以;
原因是受控组件没有加onChange,应该要配套使用;

那么如何获取受控组件和非受控组件的值?
获取受控组件的值:直接打印num即可;
获取非受控组件的值:通过获取元素document,再去获取元素的值;
或者使用ref

javascript">const dv = useRef(null);
<form>非受控:<input type="text" ref={dv} defaultValue={num} />
</form>

dv.current.value可以获取非受控组件的值;

总结:

  1. defaultValue非受控,不随num值变化而变化;value受控,随num值变化而变化;
  2. defaultValue可以直接编辑;value不能直接编辑(需要配合onChange事件);
  3. 获取值:受控组件直接读取num值;非受控组件通过ref获取值

3 Redux

单一状态树 store


http://www.ppmy.cn/server/39471.html

相关文章

速盾高防CDN的防御能力如何?

速盾高防CDN是一种网络安全解决方案&#xff0c;旨在保护网站免受各种网络攻击&#xff0c;如分布式拒绝服务&#xff08;DDoS&#xff09;攻击、恶意爬虫、SQL注入等。它通过使用先进的防御技术和强大的基础设施来提供出色的防御能力。 首先&#xff0c;速盾高防CDN具备强大的…

英语学习笔记8——What‘s your job?

What’s your job? 你是做什么工作的&#xff1f; 词汇 Vocabulary policeman 男警察 policewoman 女警察 police n. 警力 集合名词&#xff0c;永表复数 西方国家警察管的事很多。交警&#xff0c;刑警&#xff0c;武警一般不分开。 taxi driver 出租车司机 taxi / cab n.…

基于WPF的DynamicDataDisplay曲线显示

一、DynamicDataDisplay下载和引用 1.新建项目,下载DynamicDataDisplay引用: 如下图: 二、前端开发: <Border Grid.Row="0" Grid.Column="2" BorderBrush="Purple" BorderThickness="1" Margin="2"><Grid>…

系统Cpu利用率降低改造之路

系统Cpu利用率降低改造之路 一.背景 1.1 系统背景 该系统是一个专门爬取第三方数据的高并发系统&#xff0c;该系统单台机器以每分钟400万的频次查询第三方数据&#xff0c;并回推给内部第三方系统。从应用类型上看属于IO密集型应用,为了提高系统的吞吐量和并发&#xff0c;…

Spring Security + JWT 实现登录认证和权限控制

Spring Security JWT 实现登录认证和权限控制 准备步骤 准备好一些常用的工具类&#xff0c;比如jwtUtil&#xff0c;redisUtil等。引入数据库&#xff0c;mybatis等&#xff0c;配置好controller&#xff0c;service&#xff0c;mapper&#xff0c;保证能够正常的数据请求。…

深入理解C++构造函数和析构函数

目录标题 1. 构造函数默认构造函数参数化构造函数拷贝构造函数 2. 析构函数3. 构造函数和析构函数的使用场景自动资源管理防止资源泄露深拷贝和浅拷贝 4. C的类中必定有个构造函数吗&#xff1f;5. 总结 C中的构造函数和析构函数是类对象生命周期管理的重要组成部分。构造函数用…

Linux 安装JDK和Idea

安装JDK 下载安装包 下载地址&#xff1a; Java Downloads | Oracle (1) 使用xshell 上传JDK到虚拟机 (2) 移动JDK 包到/opt/environment cd ~ cd /opt sudo mkdir environment # 在 /opt下创建一个environment文件夹 ls# 复制JDK包dao /opt/environment下 cd 下载 ls jd…

98、技巧-颜色分类

思路 这道题的思路是什么&#xff0c;首先典型荷兰国旗问题&#xff1a; 该问题的关键在于我们要将所有的0放到数组的前部&#xff0c;所有的1放在中间&#xff0c;所有的2放在后部。这可以通过使用两个指针&#xff0c;一个指向数组开头的“0”的最后一个位置&#xff0c;另…

mac安装禅道

前提已安装&#xff1a;phpapacheMySQL mac安装 php7.1/apache-CSDN博客 安装MySQL 一、禅道下载 安装官方文档 源码包下载地址&#xff1a;禅道下载 - 禅道开源项目管理软件 。 1. 解压禅道源码包 2. 将解压后的文件复制到Apache访问目录下 &#xff08;默认路径为 /Libra…

AI图书推荐:给自媒体创作者的ChatGPT使用指南

你是否厌倦了花费数小时盯着空白屏幕&#xff0c;努力为你的内容想出新鲜点子&#xff1f;想要将你的写作提升到下一个水平&#xff1f;有了ChatGPT&#xff0c;你可以告别写作障碍、无休止的修订和浪费的时间。 在这本全面的指南中&#xff0c;你将学到关于ChatGPT你需要知道…

Windows查找JDK的安装路径

如果很久之前安装了JDK&#xff0c;或者在别人的电脑上&#xff0c;想要快速指导JDK 的安装路径&#xff0c;可以通过啥方式指导JDK的安装路径是在哪里呢&#xff1f; 一、确认是否安装了JDK 首先我们打开命令行&#xff0c;如果输入 java -version 如果显示这种&#xff0c;…

豆芽机置入语音芯片WTN6040-8S:开启智能生活新篇章,让豆芽制作更便捷有趣

豆芽机的开发背景&#xff1a; 豆芽作为一种营养丰富、味道鲜美的食品&#xff0c;深受广大消费者的喜爱。然而&#xff0c;传统的豆芽生产过程繁琐&#xff0c;需要耗费大量的时间和人力&#xff0c;且存在生产效率低、质量不稳定等问题。随着人们生活节奏的加快和对健康饮食的…

【软考高项】三十八、风险管理7个过程

一、规划风险管理 1、定义、作用 定义&#xff1a;定义如何实施项目风险管理活动的过程作用&#xff1a;确保风险管理的水平、方法和可见度与项目风险程度相匹配&#xff0c;与对组织和其他干系人的重要程度相匹配 2、输入 项目管理计划 项目章程 项目文件 干系人登记册…

预编码算法介绍及优缺点

预编码算法介绍 介绍优缺点 介绍 预编码算法是一种用于无线通信系统中的技术&#xff0c;其基本思想是通过矩阵运算将经过调制的符号信息流和信道状态信息进行有机结合&#xff0c;变换成适合当前信道的数据流&#xff0c;再通过天线发送出去。这种技术的主要目的是在发送端对…

【栈】Leetcode 验证栈序列

题目讲解 946. 验证栈序列 算法讲解 在这里就只需要模拟一下这个栈的出栈顺序即可&#xff1a;使用一个stack&#xff0c;每次让pushed里面的元素入栈&#xff0c;如果当前栈顶的元素等于poped容器中的当前元素&#xff0c;因此就需要让栈顶元素出栈&#xff0c;poped的遍历…

设计模式——外观模式(Facade)

外观模式&#xff08;Facade Pattern&#xff09; 是一种结构型设计模式&#xff0c;它为一个子系统中的一组接口提供一个统一的高层接口&#xff0c;使得子系统更加容易使用。这种类型的设计模式属于结构型模式&#xff0c;它向客户端提供了一个接口&#xff0c;隐藏了子系统的…

论文笔记:DeepMove: Predicting Human Mobility with Attentional Recurrent Networks

WWW 2018 1 Intro 根据对百万级用户群的研究&#xff0c;93%的人类移动是可预测的。 早期的mobility预测方法大多基于模式的。 首先从轨迹中发现预定义的移动模式(顺序模式、周期模式)然后基于这些提取的模式预测未来位置。最近的发展转向基于模型的方法进行流动性预测。 利用…

变量的细节

如何打印不同类型的整数常量 相似于我们需要去声明类型 public class Var {public static void main(String[] args) {// 1就是int类型常量System.out.println(1);// 120后面加一个L(l)表示他是一个long型的整数System.out.println(120l);} }如何打印不同类型的浮点数常量 与…

超像素分割【代码】

超像素分割是一种图像处理技术&#xff0c;旨在将图像分割成具有语义上一致的区域&#xff0c;这些区域称为超像素。与传统的像素级分割相比&#xff0c;超像素分割将图像划分为更大的、形状更加规整的区域&#xff0c;有助于降低数据维度、简化图像分析、提高计算效率&#xf…

码题杯 世界警察 思想:双指针

https://www.matiji.net/exam/brushquestion/4/4446/16A92C42378232DEB56179D9C70DC45C 双指针 思路是这样的&#xff0c;首先r指针向右走&#xff0c;如果r指针遇到了和l指针一样的&#xff0c;那么l指针就&#xff0c;一直加到r指针的位置&#xff0c;此时a[l]a[r]&#xff0…