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>
    );
  }
}