技术标签: 前端 react # React学习笔记
目录
了解 React 组件作用,和创建组件的方式
官方解释:
前端开发:
React 创建组件:
function
class
目标:掌握在 React 中使用函数创建组件,使用组件。
大致步骤:
具体内容:
首字母必需大写
,React 据此来区分组件和 HTML 元素必须有返回值
,表示该组件的 UI 结构,如果不渲染任何内容可返回null
// 普通函数
function Header() {
return <div>头部组件</div>;
}
// 箭头函数
const Footer = () => {
return <div>底部组件</div>;
};
// 不渲染内容
const Loading = () => {
const loading = false;
return loading ? <div>正在加载...</div> : null;
};
import ReactDom from 'react-dom';
// 普通函数
function Header() {
return <div>头部组件</div>;
}
// 箭头函数
const Footer = () => {
return <div>底部组件</div>;
};
// 加载组件,不渲染内容
const Loading = () => {
const loading = false;
return loading ? <div>正在加载...</div> : null;
};
// 根组件
const App = () => {
return (
<>
<Header />
<Loading />
<Footer />
</>
);
};
ReactDom.render(<App />, document.getElementById('root'));
回顾 class 语法定义类属性和函数,回顾 extends 语法继承父类。
大致步骤:
具体内容:
// 动物
class Animal {
address = '地球';
eat() {
console.log('吃');
}
}
// 猫
class Cat extends Animal {
run() {
console.log('跑');
}
}
const cat = new Cat();
cat.run(); // 跑
cat.eat(); // 吃
console.log(cat.address); // 地球
总结: class
创建类,extends
继承类,可以使用父类的属性和函数。
掌握 React 的类组件写法
大致步骤
具体内容
class
语法创建的组件就是类组件React.Component
父类render
函数,返回 UI 结构,无渲染可返回 nullimport { Component } from 'react';
class Header extends Component {
render() {
return <div>头部组件</div>;
}
}
import { Component } from 'react';
import ReactDom from 'react-dom';
// 头部
class Header extends Component {
render() {
return <div>头部组件</div>;
}
}
// 根组件
class App extends Component {
render() {
return (
<>
<Header />
</>
);
}
}
ReactDom.render(<App />, document.getElementById('root'));
class
定义类,使用extends
继承React.Component
完成类组件定义首字母大写
,必须有render
函数返回 UI 结构,无渲染可返回null
标签
使用即可理解组件抽离目的,掌握抽离组件方式。
大致步骤:
1.思考,如果所有组件写在一个文件好维护吗?
2.抽离组件
js
或者jsx
文件定义组件默认导出具体操作:
1.新建 src/components/Header.jsx
类组件,新建 src/components/Footer.jsx
函数组件
import { Component } from 'react';
class Header extends Component {
render() {
return <div>头部组件</div>;
}
}
export default Header;
const Footer = () => {
return <div>头部组件</div>;
};
export default Footer;
2.新建 src/App.jsx
组件, 导入Header
Footer
组件使用。
import { Component } from 'react';
import Header from './components/Header.jsx';
import Footer from './components/Footer.jsx';
class App extends Component {
render() {
return (
<>
<Header />
内容
<Footer />
</>
);
}
}
3.index.js
使用 App
根组件
import ReactDom from 'react-dom';
import App from './App.jsx';
ReactDom.render(<App />, document.getElementById('root'));
总结:
理解无状态组件和有状态组件概念
大致步骤:
具体内容:
React16.8
之前的函数组件都是无状态组件,Hooks
出现后函数组件也可以有状态。class
组件可以定义组件自己的状态,拥有组件生命周期,它是有状态组件。React16.8
之前,组件不需要维护数据只渲染就使用函数组件
,有数据和交互使用类组件
。你需要去判断,有心智负担。React16.8
之后,Hooks
出现给函数提供状态,建议使用函数组件即可。掌握类组件中状态的定义与使用
state
属性定义组件状态,属于组件自己的数据,它的值是个对象。state
的时候通过this
去访问即可,例如:this.state.xxx
。import { Component } from 'react';
class App extends Component {
// 状态
state = {
title: '数码产品',
list: ['电脑', '手机', '相机'],
};
render() {
return (
<>
<h3>{this.state.title}</h3>
<ul>
{this.state.list.map((item) => {
return <li key={item}>{item}</li>;
})}
</ul>
</>
);
}
}
export default App;
总结:
state
属性,值是对象存储数据,this.state.xxx
使用数据,数据驱动试题更新。掌握类组件中绑定事件的方式,和获取事件对象的方式。
on+事件名称={处理函数}
的方式绑定事件,事件名称需要遵循大驼峰
规则。import { Component } from 'react';
class App extends Component {
// 状态
state = {
count: 0,
};
// 事件处理函数
handleClick(e) {
// 默认行为
e.preventDefault();
// 事件冒泡
e.stopPropagation();
console.log('handleClick');
}
handleMouseEnter() {
console.log('handleMouseEnter');
}
render() {
return (
<>
<div onMouseEnter={this.handleMouseEnter}>
计数器:{this.state.count}
</div>
<div>
<a href="http://www.itcast.cn" onClick={this.handleClick}>
按钮
</a>
</div>
</>
);
}
}
export default App;
on+事件名称={处理函数}
方式绑定大驼峰
规则,例如:onClick
onMouseEnter
, 处理函数默认传参为事件对象。发现事件处理函数中 this 获取不到问题和原因
大致步骤:
this.state.count
发现报错,this 是个undefined
。具体代码:
this
是undefined
import { Component } from 'react';
class App extends Component {
// 状态
state = {
count: 0,
};
// 事件处理函数
handleClick(e) {
console.log(e);
// Uncaught TypeError: Cannot read properties of undefined (reading 'state')
console.log(this.state.count);
}
render() {
return (
<>
<div>计数器:{this.state.count}</div>
<div>
<button onClick={this.handleClick}>按钮</button>
</div>
</>
);
}
}
export default App;
const obj = {
name: 'tom',
say() {
console.log(this);
},
};
obj.say(); // 打印:{name: 'tom', say: function}
const say = obj.say;
say(); // 打印:window对象 严格模式
on+事件名称
属性,调用的时候不是通过组件调用的。掌握通过 绑定箭头函数 bind 声明箭头函数 三种方式解决 this 问题
大致步骤:
具体内容:
import { Component } from "react";
class App extends Component {
// 状态
state = {
count: 0,
};
// 事件处理函数
handleClick(e) {
console.log(e)
console.log(this.state.count)
}
render() {
return (
<>
<div>计数器:{this.state.count}</div>
<div>
+ <button onClick={(e)=>this.handleClick(e)}>按钮</button>
</div>
</>
);
}
}
export default App;
import { Component } from "react";
class App extends Component {
// 状态
state = {
count: 0,
};
// 事件处理函数
handleClick(e) {
console.log(e)
console.log(this.state.count)
}
render() {
return (
<>
<div>计数器:{this.state.count}</div>
<div>
+ <button onClick={this.handleClick.bind(this)}>按钮</button>
</div>
</>
);
}
}
export default App;
import { Component } from "react";
class App extends Component {
// 状态
state = {
count: 0,
};
// 事件处理函数
+ handleClick = (e) => {
console.log(e)
console.log(this.state.count)
}
render() {
return (
<>
<div>计数器:{this.state.count}</div>
<div>
<button onClick={this.handleClick}>按钮</button>
</div>
</>
);
}
}
export default App;
事件处理函数统一使用箭头函数
。掌握使用 setState 函数修改组件状态
大致步骤:
setState({需修改数据})
,可以更新数据和视图。具体代码:
setState
的来修改数据更新视图import { Component } from 'react';
class App extends Component {
state = {
count: 0,
};
handleClick = () => {
// 修改数据
this.setState({
// key是要修改的数据名称,value是对应的新值
count: this.state.count + 1,
});
};
render() {
return (
<>
<div>计数器:{this.state.count}</div>
<div>
<button onClick={this.handleClick}>按钮</button>
</div>
</>
);
}
}
export default App;
import { Component } from 'react';
class App extends Component {
state = {
count: 0,
user: {
name: 'jack',
age: 18,
},
list: ['电脑', '手机'],
};
handleClick = () => {
// 修改数据
this.setState({
// key是要修改的数据名称,value是对应的新值
count: this.state.count + 1,
});
};
updateList = () => {
// 修改列表
this.setState({
list: [...this.state.list, '相机'],
});
};
updateUser = () => {
// 修改对象
this.setState({
user: {
...this.state.user,
name: 'tony',
},
});
};
render() {
return (
<>
<div>计数器:{this.state.count}</div>
<div>
<button onClick={this.handleClick}>按钮</button>
</div>
<hr />
<div>商品:{this.state.list.join(',')}</div>
<button onClick={this.updateList}>改数组</button>
<hr />
<div>
姓名:{this.state.user.name},年龄:{this.state.user.age}
</div>
<button onClick={this.updateUser}>改对象</button>
</>
);
}
}
export default App;
setState
修改可更新视图。理解受控组件概念,掌握动态绑定表单元素。
大致步骤:
具体内容:
1.什么是受控组件
state
控制,这个表单元素就是受控组件。 2.如何绑定表单元素,如:input:text
input:checkbox
import { Component } from 'react';
class App extends Component {
state = {
mobile: '13811112222',
isAgree: true,
};
changeMobile = (e) => {
this.setState({
mobile: e.target.value,
});
};
changeAgree = (e) => {
this.setState({
isAgree: e.target.checked,
});
};
render() {
return (
<>
<div>
<input
value={this.state.mobile}
onChange={this.changeMobile}
type="text"
placeholder="请输入手机号"
/>
</div>
<div>
<input
checked={this.state.isAgree}
onChange={this.changeAgree}
type="checkbox"
/>
同意用户协议和隐私条款
</div>
</>
);
}
}
export default App;
总结:
state
的数据赋值给表单原生,通过onChange
监听值改变修改 state 数据,完成表单元素的绑定。理解非受控组件概念,掌握通过 ref 获取元素。
大致步骤:
具体内容:
1.什么是非受控组件?
2.通过 ref 获取表单元素获取非受控组件的值
import { Component, createRef } from 'react';
class App extends Component {
// 获取非受控组件的值
// 1. 通过createRef创建一个ref对象
// 2. 给元素绑定ref属性值为创建的ref对象
// 3. 通过ref对象的current获取元素,再获取它的值
mobileRef = createRef();
getMobile = () => {
console.log(this.mobileRef.current.value);
};
render() {
return (
<>
<div>
{/* 没有被state控制的表单原生认为是非受控组件 */}
<input ref={this.mobileRef} type="text" placeholder="请输入手机号" />
<button onClick={this.getMobile}>获取</button>
</div>
</>
);
}
}
export default App;
文章浏览阅读3.3k次,点赞9次,收藏23次。SQLServer配置管理器无法连接到WMI提供程序:今天在打开sql server 的时候打不开。报了一个错误,然后我打开sql server配置管理器,就看到了如下图这个错误。然后就去网上搜了这个问题的解决方法,综合起来有以下几种:第一种:给数据库程序network service读取权限。通过上面两个大佬的方法里面得出主要是分析这两个文件的区别(在SQL server2019的数据库中包含有这几个文件(找到之后复制路径,再以管理员的身份允许cmd,执行。在这两位大佬的几个方法中我的还是没有解决!_sqlserver配置管理器无法连接到wmi提供程序
文章浏览阅读343次,点赞6次,收藏8次。在做物理实验时,为了计算物体移动的速率,通过相机等工具周期性的采样物体移动距离。由于工具故障,采样数据存在误差甚至相误的情况。需要通过一个算法过滤掉不正确的采样值,不同工具的故意模式存在差异,算法的各关门限会根据工具类型做相应的调整。请实现一个算法,计算出给定一组采样值中正常值的最长连续周期。
文章浏览阅读185次。package SingleListStack;public class ListStack { public static void main(String[] args) { //测试 SingleListStack<Integer> singleListStack = new SingleListStack<Integer>(); singleListStack.push(1); singleListS_单链表模拟栈
文章浏览阅读562次,点赞29次,收藏10次。数据传输分为单工(数据只能从一个方向传输出去 ),双工 双工又分为两种 全双工(数据能同时进行传输 比如手机 双方可以同时讲话传输数据)和半双工(一方传输时,另一方不能传输数据 比如对讲机 一方在讲话时候 另一方只能等待对方讲话结束才能说话)443 HTTPS(超文本传输安全协议):在HTTP的基础上加了SSL/TLS层(安全套接层)的安全的超文本传输协议。(传输控制协议)协议应用的端口及其协议功能----传输更加稳定可靠。(用户数据报协议)协议应用的端口及其协议功能----传输效率更高。
文章浏览阅读6k次,点赞2次,收藏11次。public static Integer diff(String time) throws ParseException { SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); long currentTime =System.currentTimeMillis(); long createTime = df.parse(time).getTime(); lon_java获取十分钟后的时间
文章浏览阅读692次,点赞16次,收藏13次。博主介绍:全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战精彩专栏 推荐订阅2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选题推荐2023-2024年最值得选的Java毕业设计选题大全:500个热门选题推荐Java精品实战案例《500套》微信小程序项目精品案例《500套》文末获取源码+数据库。
文章浏览阅读122次。Assembly Simulation Engineer, 对组装或拆卸过程进行可行性研究,以减轻问题,加快上市时间,提高首次质量。
文章浏览阅读2.8k次。fs-extra模块 是基于fs 的文件操作相关工具库,封装了一些fs实现起来相对复杂的工具,主要使用方法如下:使用:let fse = require('fs-extra')常用api:1. copy 复制文件copy(src, dest, [option],callback)2. emptyDir 清空目录确保一个目录是空的。如果目录非空删除目录内容。如果目录不..._fs-extra 确保目录
文章浏览阅读4.4k次,点赞4次,收藏32次。0.前言上一章介绍了GPIO点亮了ZCU上的8个流水灯,今天介绍BRAM的读写。BRAM 是Block RAM的缩写,它的作用主要是作为数据的缓存,用于IP和内存之间的少量数据交互,CPU提前将数据存入BRAM,当IP需要BRAM中的数据时,可直接从BRAM里面读取。上一章利用的是官方例程,细心的人可看到其实上一章已经生成了BRAM,所以这一章我们仍然基于上一章的工程来做。掌握内容:单口..._vivado sdk可以用内存监视器看bram的数据吗
文章浏览阅读826次。是因为uploadFile方法没有返回值,于是我又检查了一遍代码,发现我的retrun 写错位置了。我写在了 调用Api接口之前,问题找到。_typeerror: cannot read properties of undefined (reading 'then')
文章浏览阅读1.1w次,点赞36次,收藏44次。二哥的编程知识星球正式开放了,这是一个Java学习指南+编程实战的学习宝地,可以帮助你提高编程能力、养成好的学习习惯、找到志同道合的学习伙伴、拿到更好的 Offer。详情戳链接《Java程序员进阶之路》!大家好,我是二哥!很早之前,就有小伙伴给我反馈说《Java 程序员进阶之路》经常有图片不显示或者加载缓慢。但由于白嫖(GitHub图床+jsdelivr CDN)的力量实在是太过强大了(狗头),再加上我本人没有遇到过这个问题,所以就一直拖延着,迟迟没有行动。直到某一天,我神秘的流量用光了,上._沉默王二知识星球
文章浏览阅读358次。1.先是思路。(1)编写脚本(2)添加定时任务器linux下如何实现mysql数据库每天自动备份定时备份https://blog.csdn.net/testcs_dn/article/details/48829785在过程中遇到的问题(1)crontab(定时任务器)未安装 CentOS下使用yum命令安装计划任务程序crontab https://blog.csdn.net/t..._数据库定时拷贝数据