React 扩展
01-setState
import React, { Component } from "react";
export default class Demo1 extends Component {
state = { count: 0 };
add = () => {
const { count } = this.state;
this.setState(
(state) => ({ count: state.count + 1 }),
() => {
console.log("我改完了");
}
);
console.log("我改完了么");
};
render() {
return (
<div>
<h1>当前求和: {this.state.count}</h1>
<button onClick={this.add}>点我加1 </button>
</div>
);
}
}
02-lazyLoad
import React, { Component, lazy, Suspense } from "react";
import { NavLink, Route } from "react-router-dom";
const Home = lazy(() => import("./Home"));
const About = lazy(() => import("./Home"));
export default class Demo2 extends Component {
render() {
return (
<div>
<h1>我是APP</h1>
{/* 一个项目只允许有一个 BrowserRoute,把这个写到index.js里面 */}
{/* 注册跳转标签 */}
<NavLink to="/about" activeClassName="active">
{" "}
About{" "}
</NavLink>
<NavLink to="/home"> Home </NavLink>
{/* 注册路由 */}
<Suspense fallback={<h2>Loading..</h2>}>
<Route path="/about" component={About} />
<Route path="/home" component={Home} />
</Suspense>
</div>
);
}
}
03-hooks
import React, { Component, useState } from "react";
import ReactDOM from "react-dom";
function Demo3() {
const [count, setCount] = React.useState(0);
function add() {
setCount((count) => count + 1);
}
function unmount() {
ReactDOM.unmountComponentAtNode(document.getElementById("root"));
}
React.useEffect(() => {
let timer = setInterval(() => {
setCount((count) => count + 1);
}, 1000);
return () => {
clearInterval(timer);
};
}, []);
const myRef = React.useRef();
function show() {
alert(myRef.current.value);
}
return (
<div>
<input type="text" ref={myRef} />
<h2>求和:{count}</h2>
<button onClick={add}>点我+1</button>
<button onClick={unmount}>卸载组件</button>
<button onClick={show}>点我提示数据</button>
</div>
);
}
export default Demo3;
04-Fragment
import React, { Component, Fragment } from "react";
export default class Demo4 extends Component {
render() {
return <Fragment key={1}>1111</Fragment>;
}
}
05-Context
import React, { Component } from "react";
const UsernameContext = React.createContext();
const { Provider, Consumer } = UsernameContext;
class B extends Component {
render() {
return (
<div style={{ border: "1px solid blue", margin: "20px" }}>
<h3>我是B组件</h3>
<h4>我的从A接收到的用户名是</h4>
<C />
</div>
);
}
}
function C(params) {
return (
<div style={{ border: "1px solid green", margin: "20px" }}>
<h3>我是C组件</h3>
<h4>
我的从A接收到的用户名是
<Consumer>
{(value) => {
return value.name;
}}
</Consumer>
</h4>
<h4>
我的从A接收到的年龄是
<Consumer>
{(value) => {
return value.age;
}}
</Consumer>
</h4>
</div>
);
}
export default class A extends Component {
state = { name: "YO", age: 12 };
render() {
const { name, age } = this.state;
return (
<div style={{ border: "1px solid red", margin: "20px" }}>
<h3>我是A组件</h3>
<h4>我的用户名是 {this.state.name}</h4>
<Provider value={{ name, age }}>
<B />
</Provider>
</div>
);
}
}
06-optimize
import React, { Component, PureComponent } from "react";
export default class Parent extends PureComponent {
state = { carName: "别克", stus: ["1", "2"] };
changeCar = () => {
};
addStu = () => {
const { stus } = this.state;
this.setState({ stus: ["3", ...stus] });
};
render() {
const { carName, stus } = this.state;
console.log("Parent---------------------");
return (
<div style={{ border: "1px solid blue", margin: "20px" }}>
<h3>我是 Parent 组件</h3>
<h4>我的车名字是 {carName}</h4>
<button onClick={this.changeCar}>换车</button>
<button onClick={this.addStu}>添加学生</button>
{stus.map((el) => {
return <span key={el}>{el}---</span>;
})}
{/* <Child /> */}
<Child carName={carName} />
</div>
);
}
}
class Child extends PureComponent {
render() {
console.log("Child---------------------");
return (
<div style={{ border: "1px solid red", margin: "20px" }}>
<h3>我是 Child 组件</h3>
<h4>我接到的车是 {this.props.carName}</h4>
</div>
);
}
}
07-renderProps
import React, { Component } from "react";
export default class Parent extends Component {
render() {
return (
<div style={{ border: "1px solid green", margin: "20px" }}>
<h2>Parent</h2>
{/* <A>
<B />
</A> */}
<A render={(name) => <B name={name} />} />
</div>
);
}
}
class A extends Component {
state = { name: "tom" };
render() {
console.log(this.props.children);
const { name } = this.state;
return (
<div style={{ border: "1px solid green", margin: "20px" }}>
<h2>A</h2>
{this.props.render(name)}
</div>
);
}
}
class B extends Component {
render() {
console.log("B---->render");
return (
<div style={{ border: "1px solid green", margin: "20px" }}>
<h2>B</h2>
<h3>从上层父组件拿到的名字: {this.props.name}</h3>
</div>
);
}
}
08-ErrorBoundary
Parent.jsx
import React, { Component } from "react";
import Child from "./Child";
export default class Parent extends Component {
state = {
hasError: "",
};
static getDerivedStateFromError(error) {
console.log(error);
return {
hasError: error,
};
}
componentDidCatch(error, info) {
console.log(error, info);
console.log("渲染错误");
}
render() {
return (
<div>
<h2>我是 Parent 组件</h2>
{this.state.hasError ? (
<h2>当前网络不稳定...请稍后重试....</h2>
) : (
<Child />
)}
</div>
);
}
}
Child.jsx
import React, { Component } from "react";
export default class Child extends Component {
state = {
users: "aaa",
};
render() {
return (
<div>
<h2>我是 Child 组件</h2>
{this.state.users.map((user) => {
return (
<h4 key={user.id}>
{user.name}-----{user.age}
</h4>
);
})}
</div>
);
}
}