react基础

安装

bash 复制代码
create-react-app myapp
cd myapp
npm syart
javascript 复制代码
import { useState } from 'react';
function App() {

  // 返回一个数组,第一个值是state, 第二个值修改 state 的方法
  const [ classComName, setClassComName ] = useState(() => 'cc');

  const handleClick = (res) => {
    setClassComName(() => res)
  }

  return (
    <div className="App">
      <ClassCom name={classComName} onClick={handleClick} />
      <FuncCom />
    </div>
  );
}

export default App;
类组件 ClassCom
生命周期-初始化阶段
1、constructor 先执行
  • 初始化state,拦截路由参数
  • 防抖、节流
2、getDerivedStateFromProps执行
  • 静态函数,纯函数来用
  • 传入props和state,返回值将和之间的state合并,作为新的state
javascript 复制代码
static getDerivedStateFromProps(props, state) {
	console.log('getDerivedStateFromProps')
	return {
		nameList: props.name.split('')
	}
}
3、componentWillMount

UNSAFE_componentWillMount

  • 渲染之前执行
  • 如果有了getDerivedStateFromProps或者getSnapshotBeforeUpdate生命周期,则不执行componentWillMount
4、render
5、componentDidMount 执行

生命周期-更新阶段
1、componentWillReceiveProps
  • 如果组件已经有了getDerivedStateFormProps则不会执行componentWillReceiveProps
    • 有一些数据,props发生改变的时候,props的改变来决定state是否更新
2、getDerivedStateFromProps
3、shouldComponentUpdate
javascript 复制代码
    shouldComponentUpdate() {
      return true;
    }
  • 相当于一个拦截器,返回一个 boolean,来决定组件要不要更新
4、componentWillUpdate
  • 获取组件更新的一些状态,dom的位置
5、render
  • createElement
6、getSnapshotBeforeUpdate
  • 获取更新前的快照
  • commitBeforeMutationLifeCycle
7、componentDidUpdate
  • 是不能调用setState ,否则会死循环

生命周期-销毁阶段
componentWillUnmount

复制代码
* 改变界面,要用 state 。调用 setState 的方法去处理。
javascript 复制代码
export default class ClassCom extends Component {

    constructor(props) {
        super(props);

        this.state = {
            number: 0,
            msg: 'hello aaa',
            nameList: [],
        }
    }
	
    // static getDerivedStateFromProps(props, state) {
    //   console.log('getDerivedStateFromProps')
    //  return {
    //   nameList: props.name.split('')
    //  }
    // }
	
	handleClickFn = function(){
		//省略代码,此处只是为了区分和箭头函数的区别,作用域不同,传参的时候,需要改变this指向
	}

    handleClick = (type) => {
        console.log('click', type)
        this.setState({
            number: this.state.number + ( type === 'plus' ? 1 : -1),
        })
    }

    handleChange = (event) => {
        this.setState({
            msg: event.target.value
        })
    }

    

  render() {
    const { msg, number, nameList } = this.state;
    const { name, onClick } = this.props;
    return (
      <div>
      	{this.xxx}
        <div>{name}--{number}</div>
        <div>
          {nameList.map(item => <div key={item}>{item}</div>)}
        </div>
        <button onClick={() => { this.handleClick('plus') }}>+</button>
        <button onClick={() => { this.handleClick('minus') }}>-</button>
        <input value={msg} onChange={this.handleChange} />
        {/* 子组件往父组件传值 */}
        <button onClick={() => { onClick('父组件res') }} >父组件响应</button>
      </div>
    )
  }
}
函数组件 FuncCom
复制代码
useState
[state,dispatch] = useState(initState)
- state :作为组件状态,提供ui渲染视图
- dispatch :用户修改state的方法,同时触发组件更新
- initState :初始值
javascript 复制代码
const [funcName , setFuncName] = useState(()=>'initName')
const handleClick = ()=>{
	//setFuncName('newName')
	setFuncName(()=>'newName')
}
javascript 复制代码
export default function FuncCom() {

  const [ number, setNumber ] = useState(0);
  const [ msg, setMsg ] = useState('hello luyi');
  const [ list, setList ] = useState([]);

  return (
    <div>
        <div>函数组件--{number}</div>
        <button onClick={() => { setNumber(number + 1) }}>+</button>
        <button onClick={() => { setNumber(number - 1) }}>-</button>
        <input value={msg} onChange={(e) => setMsg(e.target.value)} />
    </div>
  )
}
useEffect
javascript 复制代码
//处理副作用
useEffect(()=>destory,deps)
- ()=>destory,即callback,第一个参数,是一个函数
- destory作为callback的返回值,在下一次callback执行前调用
- deps 第二个参数,是一个数组,数组的值发生改变,执行上一次的destory,并再次执行callback
javascript 复制代码
useEffect(()=>{
	console.log('callback')
	return ()=>{
		console.log('destory')
	}
},[])
相关推荐
青青家的小灰灰3 小时前
迈向全栈新时代:SSR/SSG 原理、Next.js 架构与 React Server Components (RSC) 实战
前端·javascript·react.js
青青家的小灰灰3 小时前
透视 React 内核:Diff 算法、合成事件与并发特性的深度解析
前端·javascript·react.js
小霖家的混江龙4 小时前
从 0 到 1 实现一个 useState
前端·javascript·react.js
晓得迷路了4 小时前
栗子前端技术周刊第 118 期 - Oxfmt Beta、Angular GitHub stars、React 基金会...
前端·javascript·react.js
AAA阿giao18 小时前
从零构建一个现代登录页:深入解析 Tailwind CSS + Vite + Lucide React 的完整技术栈
前端·css·react.js
昨晚我输给了一辆AE8620 小时前
为什么现在不推荐使用 React.FC 了?
前端·react.js·typescript
不会敲代码120 小时前
深入浅出 React 闭包陷阱:从现象到原理
前端·react.js
不会敲代码120 小时前
React性能优化:深入理解useMemo和useCallback
前端·javascript·react.js
不会敲代码11 天前
从入门到进阶:手写React自定义Hooks,让你的组件更简洁
前端·react.js
pe7er2 天前
状态提升:前端开发中的状态管理的设计思想
前端·vue.js·react.js