react

2021-11-07  本文已影响0人  SecondRocker

react是什么

React 是一个声明式,高效且灵活的用于构建用户界面的 JavaScript 库。使用 React 可以将一些简短、独立的代码片段组合成复杂的 UI 界面,这些代码片段被称作“组件”。

组件定义

class组件

class ShoppingList extends React.Component {
  render() {
    return (
      <div className="shopping-list">
        <h1>Shopping List for {this.props.name}</h1>
        <ul>
          <li>Instagram</li>
          <li>WhatsApp</li>
          <li>Oculus</li>
        </ul>
      </div>
    );
  }
}

直接写html这部分属于jsx,它允许 HTML 与 JavaScript 的混写;现在使用babel/plugin-transform-react-jsx 编译为以下形式:

return React.createElement('div', {className: 'shopping-list'},
  React.createElement('h1', /* ... h1 children ... */),
  React.createElement('ul', /* ... ul children ... */)
);

函数组件

function Square(props) {
  return (
    <button className="square" onClick={props.onClick}>
      {props.value}
    </button>
  );
}

通过 Props 传递数据

//子组件
class Square extends React.Component {
  render() {
    return (
      <button className="square">
        {this.props.value}
      </button>
    );
  }
}
//父组件
class Board extends React.Component {
  renderSquare(i) {
    return <Square value={i} />;
  }
}

事件也是通过props传递的,比如传入回调

//子组件
import react from "react"

export default class Child extends react.Component {
  constructor(props){
    super(props)
    this.state = {
      name: props.name
    }
  }

  static getDerivedStateFromProps(nextProps, prevState){
    const { name } = nextProps
    if (name !== prevState.name) {
      return {name}
    }
    return null
  }

  render(){
    return(
      <div>
        child name: {this.state.name}&nbsp;
        <input type="button" value="修改父组件name" onClick={() => this.props.changeParentName('动次打次')}></input>
      </div>
    )
  }
}


// 父组件
import Child from './Child'
import React, { useEffect } from 'react'
export default function Parent(props){
  const [name, setName] = React.useState(props.name);

  const handleChangeText = (event)=> {
    setName(event.target.value)
  }
  useEffect(() => {
    console.log('eee')
    return () => {
      console.log('bbbb')
    }
  })
  const changeParentName = (name) => {
    setName(name)
  }
  return(
    <div>
      <div>parent
        name:<input type="text" value={name} onChange={ handleChangeText }></input>
      </div>
      <div style={{'paddingLeft': '20px'}}>
        <Child name={name} changeParentName={(pName) => {changeParentName(pName)}}></Child>
      </div>
    </div>
  )
}

事件

React 元素的事件处理和 DOM 元素类似。但是有一点语法上的不同:

<button onClick={activateLasers}>
  激活按钮
</button>

动态加载组件

  return (
    <div>
      <div>parent
        name:<input type="text" value={name} onChange={ handleChangeText }></input>
      </div>
      <div style={{'paddingLeft': '20px'}}>
        <Child name={name} changeParentName={(pName) => {changeParentName(pName)}}></Child>
      </div>
      <div>
        <button onClick={ () => setShowCycle(!showCycle)}>{showCycle ? '隐藏' : '显示'}</button>
      </div>
      {showCycle ? <LifeCycle></LifeCycle> : ''}
  </div>
  )

生命周期

image.png

每个组件都包含 “生命周期方法”,你可以重写这些方法,以便于在运行过程中特定的阶段执行这些方法。你可以使用此生命周期图谱作为速查表。在下述列表中,常用的生命周期方法会被加粗。其余生命周期函数的使用则相对罕见。

挂载

当组件实例被创建并插入 DOM 中时,其生命周期调用顺序如下:

更新

当组件的 props 或 state 发生变化时会触发更新。组件更新的生命周期调用顺序如下:

卸载

当组件从 DOM 中移除时会调用如下方法:

会在组件卸载及销毁之前直接调用。在此方法中执行必要的清理操作,例如,清除 timer,取消网络请求或清除在 componentDidMount() 中创建的订阅等。

错误处理

当渲染过程,生命周期,或子组件的构造函数中抛出错误时,会调用如下方法:

componentWillUnmount() 中不应调用 setState(),因为该组件将永远不会重新渲染。组件实例卸载后,将永远不会再挂载它。

https://www.zhihu.com/question/301860721

上一篇 下一篇

猜你喜欢

热点阅读