对照代码查看笔记: 代码详情
- 有详细的ReadMe文档
- 欢迎star+fork到自己的仓库
- 后续将进行todolist案例的详细讲解:vue2,vue3,react
建议使用非受控组件
- 不要过度使用ref
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<div id="test"></div>
<div id="test2"></div>
<div id="test3"></div>
<script type="text/javascript" src="../js/react.development.js"></script>
<script
type="text/javascript"
src="../js/react-dom.development.js"
></script>
<script type="text/javascript" src="../js/babel.min.js"></script>
<script type="text/babel">
// 创建组件
class Demo extends React.Component {
showData2 = (event) => {
// alert(this.myRef2.current.value);
alert(event.target.value);
};
render() {
return (
<div>
<input type="text" onBlur={this.showData2} />
</div>
);
}
}
ReactDOM.render(<Demo />, document.getElementById("test"));
</script>
</body>
</html>

<script type="text/babel">
class Login extends React.Component {
// 初始化状态
state = {
username: "", // 用户名
password: "", // 密码
};
saveUsername = (event) => {
this.setState({ username: event.target.value });
};
savePassword = (event) => {
this.setState({ password: event.target.value });
};
handleSubmit = (event) => {
event.preventDefault(); // 组织表单提交
const { username, password } = this;
alert(
`你输入的用户名是: ${username.value},你输入的密码是:${password.value}`
);
};
render() {
return (
<form action="http" onSubmit={this.handleSubmit}>
用户名:
<input type="text" onChange={this.saveUsername} name="username" />
密码:
<input
type="password"
name="password"
onChange={this.savePassword}
/>
<button>登录</button>
</form>
);
}
}
// 渲染组件
ReactDOM.render(<Login />, document.getElementById("test"));
</script>
现用现取
<script type="text/babel">
class Login extends React.Component {
handleSubmit = (event) => {
event.preventDefault(); // 阻止表单提交
const { username, password } = this;
alert(`你输入的用户名是${username.value},密码是${password.value}`);
};
render() {
return (
<form onSubmit={this.handleSubmit}>
用户名:
<input
ref={(c) => (this.username = c)}
type="text"
name="username"
/>
密码:
<input
ref={(c) => (this.password = c)}
type="text"
name="password"
/>
<button>登录</button>
</form>
);
}
}
// 渲染组件
ReactDOM.render(<Login />, document.getElementById("test"));
</script>
saveFormData = (dataType) => {
// 无关的输出
console.log(dataType);
// 真正返回的值是函数
return (event) => {
console.log(dataType, event.target.value);
// this.setState({ password: event.target.value });
};
};
function(a) {
function(b) {
function(c) {
return a+b+c;
}
}
}
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Documenttitle>
head>
<body>
<div id="test">div>
<div id="test2">div>
<div id="test3">div>
<script type="text/javascript" src="../../js/react.development.js">script>
<script
type="text/javascript"
src="../../js/react-dom.development.js"
>script>
<script type="text/javascript" src="../../js/babel.min.js">script>
<script type="text/babel">
class Login extends React.Component {
// 初始化状态
state = {
username: "", // 用户名
password: "", // 密码
};
// 保存表单数据到状态中
saveFormData = (dataType, event) => {
this.setState({ [dataType]: event.target.value });
};
handleSubmit = (event) => {
event.preventDefault(); // 组织表单提交
const { username, password } = this.state;
alert(`你输入的用户名是: ${username},你输入的密码是:${password}`);
};
render() {
return (
<form action="http" onSubmit={this.handleSubmit}>
用户名:
<input
type="text"
// 些事件回调的时候不要加小括号,加了就是将saveFormData的返回值作为onChange的回调;返回值是undefined
onChange={(event) => this.saveFormData("username", event)}
name="username"
/>
密码:
<input
type="password"
name="password"
onChange={((event) => this.saveFormData("password"), event)}
/>
<button>登录</button>
</form>
);
}
}
// 渲染组件
ReactDOM.render(<Login />, document.getElementById("test"));
script>
body>
html>

DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Documenttitle>
head>
<body>
<div id="test">div>
<div id="test2">div>
<div id="test3">div>
<script type="text/javascript" src="./js/react.development.js">script>
<script type="text/javascript" src="./js/react-dom.development.js">script>
<script type="text/javascript" src="./js/babel.min.js">script>
<script type="text/babel">
class Life extends React.Component {
state = { opacity: 0.5 };
death = () => {
// 卸载组件
ReactDOM.unmountComponentAtNode(document.getElementById("test"));
// 消除定时器
clearInterval(this.timer);
};
// action = () => {
// setInterval(() => {
// let { opacity } = this.state;
// // 减小0.1
// opacity -= 0.1;
// if (opacity <= 0) opacity = 1;
// // 设置新的透明度
// this.setState({ opacity });
// }, 200);
// };
// 初始化渲染、状态更新之后
// 该状态就重新改变render
render() {
console.log("render");
// setInterval(() => {
// let { opacity } = this.state;
// opactiy -= 0.1;
// if (opacity <= 0) {
// opacity = 1;
// }
// this.setState({ opacity });
// }, 200);
return (
<div>
<h2 style={{ opacity: this.state.opacity }}>
React学不会怎么办?
</h2>
<button onClick={this.death}>不活了</button>
</div>
);
}
// 组件挂载完毕
componentDidMount() {
console.log("@");
this.timer = setInterval(() => {
let { opacity } = this.state;
opacity -= 0.1;
if (opacity <= 0) {
opacity = 1;
}
this.setState({ opacity });
}, 200);
}
// 组件将要卸载
componentWillUnmount() {
// 消除定时器
clearInterval(this.timer);
}
}
// 渲染组件
ReactDOM.render(<Life />, document.getElementById("test"));
script>
body>
html>
react生命周期(旧)

react生命周期新

初始化阶段: 由ReactDOM.render()触发----初次渲染
constructor()
componentWillMount() : 组件将要挂载的钩子
render()
componentDidMount()
componentWillReceiveProps :
更新阶段: 由组件内部this.setState()或父组件重新render触发
卸载组件:由ReactDOM.unmountComponentAtNode()触发
强制更新不受阀门控制
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Documenttitle>
head>
<body>
<div id="test">div>
<div id="test2">div>
<div id="test3">div>
<script type="text/javascript" src="./js/react.development.js">script>
<script type="text/javascript" src="./js/react-dom.development.js">script>
<script type="text/javascript" src="./js/babel.min.js">script>
<script type="text/babel">
// 创建组件
class Count extends React.Component {
// 构造器
constructor(props) {
console.log("Count-constructor");
super(props);
}
// 初始化状态
state = { count: 0 };
// 加1按钮的回调
add = () => {
// 获取原状态
const { count } = this.state;
// 更新状态
this.setState({ count: count + 1 });
};
// 卸载组件按钮的回调
death = () => {
ReactDOM.unmountComponentAtNode(document.getElementById("test"));
};
//强制更新按钮的回调
force = () => {
this.forceUpdate();
};
// 组件将要挂载的钩子
componentWillMount() {
console.log("Count---componentWillMount");
}
// 组件挂载完毕的钩子
componentDidMount() {
console.log("Count---componentDidMount");
}
// 组件将要卸载的钩子
componentWillUnmount() {
console.log("Count--componentWillUnmount");
}
// 控制组件更新的阀门
shouldComponentUpdate() {
console.log("Count---shouldComponentUpdate");
return true;
}
// 组件将要更新的钩子
componentWillUpdate() {
console.log("Count--componentWillUpdate");
}
componentDidUpdate() {
console.log("Count---componentDidUpdate");
}
render() {
console.log("Count---render");
const { count } = this.state;
return (
<div>
<h2>当前求和为: {count}</h2>
<button onClick={this.add}>点我—+1</button>
<button onClick={this.death}>卸载组件</button>
</div>
);
}
}
// 渲染组件
ReactDOM.render(<Count />, document.getElementById("test"));
script>
body>
html>


- 组件将要接收props调用
- 第一次传递的props不算
- 还可以接收参数

DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Documenttitle>
head>
<body>
<div id="test">div>
<div id="test2">div>
<div id="test3">div>
<script type="text/javascript" src="./js/react.development.js">script>
<script type="text/javascript" src="./js/react-dom.development.js">script>
<script type="text/javascript" src="./js/babel.min.js">script>
<script type="text/babel">
// 父组件render流程
class A extends React.Component {
// 初始化状态
state = { carName: "奔驰" };
changeCar = () => {
this.setState({ carName: "奥托" });
};
render() {
return (
<div>
<div>我是A组件</div>
<button onClick={this.changeCar}>换车</button>
<B carName={this.state.carName} />
</div>
);
}
}
class B extends React.Component {
componentWillReceiveProps() {
console.log("B---componentWillReceiveProps");
}
render() {
return <div>我是B组件,接收到的车是: {this.props.carName}</div>;
}
}
// 渲染组件
ReactDOM.render(<A />, document.getElementById("test"));
script>
body>
html>
getDerivedStateFormProps(得到派生的状态)
- UNSAFE_componentWillMount():组件将要挂载的钩子
- UNSAFE_componentWillUpdate: 组件将要更新的钩子
初始化阶段: 由ReactDOM.render()触发----初次渲染
constructor()
getDerivedStateFormProps
render()
componentDidMount()
更新阶段: 由组件内部this.setState()或父组件重新render触发
卸载组件:由ReactDOM.unmountComponentAtNode()触发