第二天(类组件)(生命周期)
创建类组件
import React from 'react';
export default class WordComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
Word: "Word"
};
}
render() {{
return (
<div className='word' >
{this.state.Word}
</div>
)}
}
}
constructor 用于创建和初始化组件的实例,设置组件的初始状态 (state) 和绑定方法,还可以调用函数super(props) 是必须的,因为他是确保正确初始化组件的功能并且使 this 关键字在组件内部指向正确的实例render 是 React 类组件中的一个必需方法,用于定义组件的 UI 渲染逻辑可以把下面这个函数放到第10行,this.setState是用来改变this.state 里的值
set = () => {
this.setState({
Word: this.Word = "word"
});
};
不管是调用函数还是使用变量,都必须使用this
挂载阶段
componentDidMount() {}
组件挂载后调用,在这里可以进行异步操作、数据获取或与外部库进行交互。
- 触发时机:
componentDidMount()在组件挂载完成后被调用,通常用于执行一次性的副作用操作。- 这些副作用操作可以包括网络请求、DOM 操作、订阅事件、初始化外部库等,因为此时组件已经被添加到 DOM 树中,可以安全地进行这些操作。
- 用途:
- 由于
componentDidMount()只会在组件挂载后执行一次,因此它非常适合进行只需要执行一次的初始化操作。 - 一些常见的用途包括:
- 获取远程数据并更新组件的状态,用于渲染数据。
- 添加事件监听器或订阅外部库的事件。
- 修改或初始化 DOM 元素,例如在组件挂载后进行 DOM 操作,或初始化某些组件依赖的外部库。
- 注意事项:
componentDidMount()是进行副作用操作的好时机,但需要小心不要在这里触发会导致组件再次更新的操作,以免陷入无限循环。- 如果在
componentDidMount() 中更新组件状态(使用 setState),将会触发额外的更新阶段。若要避免不必要的重复更新,可以在 componentDidMount()中进行条件判断,或使用其他生命周期方法进行状态更新
卸载阶段
componentWillUnmount() {}
组件即将被卸载和销毁前调用,可以进行清理工作和资源释放
- 触发时机:
componentWillUnmount()在组件即将被卸载和销毁前被调用,只会执行一次。- 当组件从 DOM 树中移除时,React 将触发该方法。
- 用途:
componentWillUnmount()主要用于进行一些清理工作和释放资源。- 在组件生命周期的其他阶段,可能会执行一些副作用操作,如添加事件监听器、订阅数据源等。
componentWillUnmount()提供了一个时机,可以在组件销毁前撤销这些操作,以避免内存泄漏或其他问题。 - 注意事项:
- 在
componentWillUnmount()中执行的操作应该是非常快速的,避免阻塞或延迟组件的卸载。 - 不要在
componentWillUnmount() 中触发更新状态(使用 setState),因为组件即将被销毁,不会再次进行渲染。 - 替代方案:
- 在 React 17 版本及以后,
componentWillUnmount()已被标记为过时的生命周期方法。在新的代码中,你可以使用 useEffect 钩子的返回函数来代替 componentWillUnmount()的功能。 - useEffect 钩子的返回函数会在组件卸载前执行,可以用来进行清理工作,实现与
componentWillUnmount()相同的效果。
更新阶段
static getDerivedStateFromProps(nextProps, prevState){}
根据新的属性(nextProps)来更新组件的状态(prevState )
- 静态方法:
getDerivedStateFromProps是一个静态方法,需要使用 static关键字来声明。- 静态方法在组件实例化之前就可以被调用,因此不能访问组件的实例或实例的属性。
- 参数:
getDerivedStateFromProps接收两个参数:nextProps 和 prevState。nextProps 表示组件将要接收到的新属性,prevState表示组件当前的状态。- 返回值:
getDerivedStateFromProps应该返回一个对象,用于更新组件的状态。- 返回的对象会被合并到组件的当前状态中,从而更新组件的状态。
- 用途:
getDerivedStateFromProps主要用于根据新的属性来更新组件的状态。- 它提供了一种在组件更新前根据属性进行状态更新的方式。
- 注意事项:
- 尽量避免在
getDerivedStateFromProps中执行复杂的计算或处理,因为它在每次组件更新前都会被调用。 - 如果组件的状态完全依赖于属性,而不依赖于其他状态,那么可以考虑使用
getDerivedStateFromProps 来代替 componentWillReceiveProps。
shouldComponentUpdate(nextProps, nextState){}
决定是否应该重新渲染组件,根据接收到的新属性(nextProps)和新状态(nextState )来返回一个布尔值,决定组件是否需要更新。
- 参数:
shouldComponentUpdate接收两个参数:nextProps 和 nextState。nextProps 表示组件将要接收到的新属性,nextState表示组件将要更新的新状态。- 通过比较
nextProps和当前属性 this.props,以及比较 nextState 和当前状态 this.state,你可以判断组件是否需要更新。 - 返回值:
shouldComponentUpdate应该返回一个布尔值,指示组件是否应该进行更新。- 返回
true 表示组件将会更新,返回 false表示组件将跳过更新。 - 如果
shouldComponentUpdate 返回 false,React 将不会执行后续的更新阶段,从而跳过重新渲染组件的过程。 - 优化性能:
- 通过自定义
shouldComponentUpdate,你可以优化组件的性能,避免不必要的重新渲染。 - 在某些情况下,你可能知道属性或状态的变化并不会影响组件的 UI,那么你可以在
shouldComponentUpdate中返回 false,阻止组件的不必要更新。 - 注意事项:
- 虽然
shouldComponentUpdate提供了一种性能优化的方式,但需要小心使用。 - 过度使用
shouldComponentUpdate可能会导致难以维护的代码,因为它可能会使组件的更新逻辑分散在不同地方。 - 当组件的状态或属性发生变化时,React 通常会进行合理的优化,因此默认情况下,你可能并不需要显式地实现
shouldComponentUpdate来优化组件的性能。
getSnapshotBeforeUpdate(prevProps, prevState){}
prevProps 表示组件在更新之前的属性(之前的属性状态)prevState 表示组件在更新之前的状态(之前的状态)主要目的是让组件在更新前捕获一些 DOM 信息,通常与 componentDidUpdate 配合使用,用于处理 DOM 更新前后的差异
componentDidUpdate(prevProps, prevState, snapshot){}
接收三个参数:prevProps、prevState 和 snapshotprevProps 表示之前的属性状态,prevState 表示之前的组件状态。snapshot 是由 getSnapshotBeforeUpdate(prevProps, prevState) 返回的值,如果在 getSnapshotBeforeUpdate 中没有返回任何值,则 snapshot 参数为 undefined 。
- 参数:
componentDidUpdate 接收三个参数:prevProps、prevState 和 snapshot。prevProps 表示之前的属性状态,prevState表示之前的组件状态。snapshot是由 getSnapshotBeforeUpdate(prevProps, prevState) 返回的值,如果在 getSnapshotBeforeUpdate 中没有返回任何值,则 snapshot 参数为 undefined。- 用途:
componentDidUpdate通常用于处理组件更新后的副作用操作,例如处理 DOM 更新、执行网络请求、与外部库交互等。- 它是处理更新阶段的最后一个生命周期方法,表示组件已经完成更新,可以在此执行一些与 DOM 相关的操作。
- 条件:
- 在
componentDidUpdate中执行的操作可能会触发组件再次更新,因此应该小心避免无限循环的情况。 - 通常情况下,需要在
componentDidUpdate中使用条件语句(例如 if 语句)来判断是否执行特定的副作用操作,以避免无限循环。 - 注意事项:
- 在
componentDidUpdate 中更新组件的状态(使用 setState)可能会再次触发更新阶段,导致无限循环,因此需要小心处理。 - 如果你需要在组件更新后获取之前的 DOM 信息,可以在
getSnapshotBeforeUpdate 中进行处理,并将结果作为参数传递给 componentDidUpdate。
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
作者分享
租房
15
学React的第一天
18
vscode写vue的时候都拥有什么插件好用呀,特别是代码格式,总是出错,没法按快捷键格式化
5
鱼友们,新网站上线了( https://github.com/huoshicang/chatgpt-3
)欢迎大家来提出建议#项目# #前端#
5
关于编程导航的markdown编辑器,有一个基于vue开发的,并且支持vue3,不仅仅可以渲染markdown文本,还可以渲染html标签,支持代码高亮、图片上传及宽高目录导航等,还有其他的,一个链接( https://code-farmer-i.github.io/vue-markdown-editor/zh/ )有兴趣的看一看
4
