当前位置: 首页 > Web前端 > HTML

React生命周期-踩坑_10

时间:2023-04-02 19:09:15 HTML

React生命周期生命周期概览生命周期状态一个组件的生命周期可以分为三种状态:Mounting:插入到真实的DOM中Updating:正在重新渲染Unmounting:从中移除真正的DOMcomponentWillMount在渲染之前调用,在客户端和服务器上都是如此。生命周期介绍componentDidMount:第一次渲染后调用,只在客户端调用。之后组件就生成了对应的DOM结构,可以通过this.getDOMNode()访问。如果你想和其他JavaScript框架一起使用,你可以在这个方法中调用setTimeout、setInterval或者发送AJAX请求(防止异步操作阻塞UI)。componentWillReceiveProps在组件接收到新的道具(更新)时被调用。初始化渲染时不会调用此方法。shouldComponentUpdate返回一个布尔值。当组件接收到新的道具或状态时调用。在初始化期间或使用forceUpdate时不调用。当您确定不需要更新组件时可以使用。当组件接收到新的道具或状态但尚未呈现时调用componentWillUpdate。在初始化期间不会被调用。组件更新完成后立即调用componentDidUpdate。在初始化期间不会被调用。componentWillUnmount在组件从DOM中移除之前立即被调用。代码显示classContentextendsReact.Component{componentWillMount(){console.log('ComponentWILLMOUNT!')}componentDidMount(){console.log('ComponentDIDMOUNT!')}componentWillReceiveProps(newProps){console.log('组件将接收PROPS!')}shouldComponentUpdate(newProps,newState){returntrue;}componentWillUpdate(nextProps,nextState){console.log('组件将更新!');}componentDidUpdate(prevProps,prevState){console.log('ComponentDIDUPDATE!')}componentWillUnmount(){console.log('ComponentWILLUNMOUNT!')}React16.3lifecyclemount当一个组件的实例被创建并且插入到DOM中,这些方法按以下顺序调用:constructor()在挂载之前调用React组件的构造函数。当实现React.Component子类的构造函数时,super(props)应该在任何其他语句之前被调用。否则,this.props将在构造函数中未定义,这可能会导致错误。通常,在React中,构造函数仅用于两个目的:通过分配对象来初始化本地状态this.state。将事件处理程序方法绑定到实例。不应将setState()调用到constructor()。相反,如果您的组件需要使用本地状态,请直接在构造函数中指定初始状态this.state。构造函数是唯一直接分配his.state的地方。在所有其他方法中,需要使用this.setState()。staticgetDerivedStateFromProps()getDerivedStateFromProps在调用render方法之前调用,无论是在初始安装时还是在后续更新时。它应该返回一个具有更新状态的对象,或者返回null以不更新任何状态。render()render()方法是类组件中唯一必需的方法。调用时,它应该检查this.props和this.state返回以下类型之一:React元素。通常通过JSX创建。数组和片段。允许您从渲染中返回多个元素。有关详细信息,请参阅片段文档。门户网站。字符串和数字。它们在DOM中呈现为文本节点。布尔值或空值。什么都没有。render()函数应该是无状态的,这意味着它不会修改组件状态,每次调用都会返回相同的结果,并且不会直接与浏览器交互。如果您需要与浏览器交互,请执行componentDidMount()或其他生命周期方法。保持render()纯粹使组件更容易思考。如果shouldComponentUpdate()返回false,render()将不会被调用需要DOM节点的初始化应该放在这里。如果您需要从远程端点加载数据,这是实例化网络请求的好地方。此方法是设置任何订阅的好地方。如果这样做,请不要忘记在componentWillUnmount()中取消订阅。您可以在componentDidMount()中立即使用this.setState()。它会触发额外的渲染,但会在浏览器更新屏幕之前发生。这保证即使在这种情况下render()将被调用两次,用户也不会看到中间状态。请谨慎使用此模式,因为它通常会导致性能问题。在大多数情况下,您应该能够分配初始状态constructor()。但是,当您需要在渲染取决于其大小或位置的内容之前测量DOM节点时,您可能需要针对模式和工具提示等情况执行此操作。这些方法被认为是遗留的,应该在新代码中避免使用它们:UNSAFE_componentWillMount()更新props或state更改可能会导致更新。当一个组件被重新渲染时,这些方法会按以下顺序被调用:的DOM。它使组件可以在DOM发生变化之前从DOM中捕获一些信息(例如滚动位置)。此生命周期返回的任何值都将作为参数传递给componentDidUpdate()。这种用例并不常见,但它可以出现在UI中,例如需要以特殊方式处理滚动位置的聊天线程。官网的例子classScrollingListextendsReact.Component{constructor(props){super(props);this.listRef=React.createRef();}getSnapshotBeforeUpdate(prevProps,prevState){//我们要向列表中添加新项目吗?//捕获滚动位置,以便稍后调整滚动。如果(prevProps.list.length{/*...内容...*/>

);}}补偿onentDidUpdate()在componentDidUpdate()更新发生后立即调用初始渲染时,不会调用此方法。以此为契机在更新组件时操作DOM。只要您将当前道具与以前的道具进行比较,它也是进行网络请求的好地方(例如,如果道具没有改变,您可能不需要网络请求)。componentDidUpdate(prevProps){//典型用法(不要忘记比较props):if(this.props.userID!==prevProps.userID){this.fetchData(this.props.userID);}}componentDidUpdate()但是要注意,一定要像上例一样用condition包裹,否则会造成死循环。它还会导致额外的重新渲染,这虽然对用户不可见,但会影响组件性能。componentDidUpdate():如果shouldComponentUpdate()返回false,则不会被调用。这些方法被认为是旧方法,您应该在新代码中避免使用它们:UNSAFE_componentWillUpdate()UNSAFE_componentWillReceiveProps()当卸载从DOM中删除组件时调用此方法:componentWillUnmount()componentWillUnmount()在组件被卸载和销毁之前立即被调用。在此方法中执行任何必要的清理,例如使计时器无效、取消网络请求或清理在componentDidMount()中创建的任何订阅。不应调用setState()、componentWillUnmount(),因为组件永远不会被重新渲染。一旦组件实例被卸载,它就不会再被安装。错误处理当渲染过程中、生命周期方法中或任何子组件的构造函数中发生错误时,将调用这些方法。staticgetDerivedStateFromError()staticgetDerivedStateFromError(error)在后代组件抛出错误后调用此生命周期。它接收抛出的错误作为参数,并且应该返回一个值来更新状态。componentDidCatch()componentDidCatch(error,info)这个生命周期在后代组件抛出错误后被调用。它接收两个参数:error-抛出的错误。info-包含键的componentStack对象,其中包含有关哪个组件抛出错误的信息。如果出现错误,componentDidCatch()可以通过调用setState使用回退UI呈现,但这将在未来版本中弃用。使用静态getDerivedStateFromError()来处理回退,而不是渲染。componentDidCatch()在“提交”阶段被调用,因此允许副作用。它应该用于记录错误之类的事情:classErrorBoundaryextendsReact.Component{constructor(props){super(props);this.state={hasError:false};}staticgetDerivedStateFromError(error){//更新状态,以便下一次渲染将显示后备UI。返回{hasError:true};}componentDidCatch(error,info){//示例“componentStack”://在ComponentThatThrows中(由App创建)//在ErrorBoundary中(由App创建)//在div中(由App创建)//在App中logComponentStackToMyService(info.组件堆栈);}render(){if(this.state.hasError){//你可以呈现任何自定义回退UIreturn

Somethingwentwrong.

;}返回this.props.children;}}http://projects.wojtekmaj.pl/...https://reactjs.org/blog/2018...https://reactjs.org/docs/reac...