首页 >> js开发 >> jsReact Hooks 实现和由来以及解决的问题详解js大全
jsReact Hooks 实现和由来以及解决的问题详解js大全
发布时间: 2021年1月13日 | 浏览:
| 分类:js开发
与React类组件相比,React函数式组件究竟有何不同?一般的回答都是:
类组件比函数式组件多了的特性,比如 state,那如果有 Hooks 之后呢?
函数组件性能比类组件好,但是在现代浏览器中,闭包和类的原始性能只有在极端场景下才会有明显的差别。
性能主要取决于代码的作用,而不是选择函数式还是类组件。尽管优化策略有差别,但性能差异可以忽略不计。
参考官网:(https://zh-hans.reactjs.org/docs/hooks-faq.html#are-hooks-slow-because-of-creating-functions-in-render)
参考作者github:(https://github.com/ryardley/hooks-perf-issues/pull/2)
类组件比函数式组件多了的特性,比如 state,那如果有 Hooks 之后呢?函数组件性能比类组件好,但是在现代浏览器中,闭包和类的原始性能只有在极端场景下才会有明显的差别。
性能主要取决于代码的作用,而不是选择函数式还是类组件。尽管优化策略有差别,但性能差异可以忽略不计。
参考官网:(https://zh-hans.reactjs.org/docs/hooks-faq.html#are-hooks-slow-because-of-creating-functions-in-render)
参考作者github:(https://github.com/ryardley/hooks-perf-issues/pull/2)
性能主要取决于代码的作用,而不是选择函数式还是类组件。尽管优化策略有差别,但性能差异可以忽略不计。
参考官网:(https://zh-hans.reactjs.org/docs/hooks-faq.html#are-hooks-slow-because-of-creating-functions-in-render)
参考作者github:(https://github.com/ryardley/hooks-perf-issues/pull/2)
性能主要取决于代码的作用,而不是选择函数式还是类组件。尽管优化策略有差别,但性能差异可以忽略不计。参考官网:(https://zh-hans.reactjs.org/docs/hooks-faq.html#are-hooks-slow-because-of-creating-functions-in-render)https://zh-hans.reactjs.org/docs/hooks-faq.html#are-hooks-slow-because-of-creating-functions-in-render参考作者github:(https://github.com/ryardley/hooks-perf-issues/pull/2)https://github.com/ryardley/hooks-perf-issues/pull/2而下面会重点讲述:React的函数式组件和类组件之间根本的区别: 在心智模型上。简单的案例
简单的案例简单的案例函数式组件以来,它一直存在,但是经常被忽略:函数式组件捕获了渲染所用的值。(Function components capture the rendered values.)思考这个组件:
function ProfilePage(props) {
const showMessage = () => alert('你好 ' + props.user);
const handleClick = () => setTimeout(showMessage, 3000);
return
}
function ProfilePage(props) {
const showMessage = () => alert('你好 ' + props.user);
const handleClick = () => setTimeout(showMessage, 3000);
return
}
上述组件:如果 props.user是 Dan,它会在三秒后显示 你好 Dan。如果是类组件我们怎么写?一个简单的重构可能就象这样:
class ProfilePage extends React.Component {
showMessage = () => alert('Followed ' + this.props.user);
handleClick = () => setTimeout(this.showMessage, 3000);
render() {
return ;
}
}
class ProfilePage extends React.Component {
showMessage = () => alert('Followed ' + this.props.user);
handleClick = () => setTimeout(this.showMessage, 3000);
render() {
return ;
}
}
通常我们认为,这两个代码片段是等效的。人们经常在这两种模式中自由的重构代码,但是很少注意到它们的含义:我们通过 React 应用程序中的一个常见错误来说明其中的不同。我们通过 React 应用程序中的一个常见错误来说明其中的不同。我们添加一个父组件,用一个下拉框来更改传递给子组件(ProfilePage),的 props.user,实例地址:(https://codesandbox.io/s/pjqnl16lm7)https://codesandbox.io/s/pjqnl16lm7按步骤完成以下操作:
点击 其中某一个 Follow 按钮。
在3秒内 切换 选中的账号。
查看 弹出的文本。
点击 其中某一个 Follow 按钮。在3秒内 切换 选中的账号。查看 弹出的文本。这时会得到一个奇怪的结果:
当使用 函数式组件 实现的 ProfilePage, 当前账号是 Dan 时点击 Follow 按钮,然后立马切换当前账号到 Sophie,弹出的文本将依旧是 'Followed Dan'。
当使用 类组件 实现的 ProfilePage, 弹出的文本将是 'Followed Sophie':
当使用 函数式组件 实现的 ProfilePage, 当前账号是 Dan 时点击 Follow 按钮,然后立马切换当前账号到 Sophie,弹出的文本将依旧是 'Followed Dan'。当使用 类组件 实现的 ProfilePage, 弹出的文本将是 'Followed Sophie':在这个例子中,函数组件是正确的。 如果我关注一个人,然后导航到另一个人的账号,我的组件不应该混淆我关注了谁。 ,而类组件的实现很明显是错误的。案例解析
案例解析案例解析所以为什么我们的例子中类组件会有这样的表现? 让我们仔细看看类组件中的 showMessage 方法:
showMessage = () => {
alert('Followed ' + this.props.user);
};
showMessage = () => {
alert('Followed ' + this.props.user);
};这个类方法从 this.props.user 中读取数据。在 React 中 Props 是 不可变(immutable)的,所以他们永远不会改变。
而 this 是而且永远是 可变(mutable)的。**
这也是类组件 this 存在的意义:能在渲染方法以及生命周期方法中得到最新的实例。所以如果在请求已经发出的情况下我们的组件进行了重新渲染, this.props将会改变。 showMessage方法从一个"过于新"的 props中得到了 user。从 this 中读取数据的这种行为,调用一个回调函数读取 this.props 的 timeout 会让 showMessage 回调并没有与任何一个特定的渲染"绑定"在一起,所以它"失去"了正确的 props。。如何用类组件解决上述BUG?(假设函数式组件不存在)
如何用类组件解决上述BUG?(假设函数式组件不存在)如何用类组件解决上述BUG?(假设函数式组件不存在)我们想要以某种方式"修复"拥有正确 props 的渲染与读取这些 props 的 showMessage回调之间的联系。在某个地方 props被弄丢了。方法一:在调用事件之前读取 this.props,然后显式地传递到timeout回调函数中:
方法一:
class ProfilePage extends React.Component {
showMessage = (user) => alert('Followed ' + user);
handleClick = () => {
const {user} = this.props;
setTimeout(() => this.showMessage(user), 3000);
};
render() {
return
类组件比函数式组件多了的特性,比如 state,那如果有 Hooks 之后呢?
函数组件性能比类组件好,但是在现代浏览器中,闭包和类的原始性能只有在极端场景下才会有明显的差别。
性能主要取决于代码的作用,而不是选择函数式还是类组件。尽管优化策略有差别,但性能差异可以忽略不计。
参考官网:(https://zh-hans.reactjs.org/docs/hooks-faq.html#are-hooks-slow-because-of-creating-functions-in-render)
参考作者github:(https://github.com/ryardley/hooks-perf-issues/pull/2)
类组件比函数式组件多了的特性,比如 state,那如果有 Hooks 之后呢?函数组件性能比类组件好,但是在现代浏览器中,闭包和类的原始性能只有在极端场景下才会有明显的差别。
性能主要取决于代码的作用,而不是选择函数式还是类组件。尽管优化策略有差别,但性能差异可以忽略不计。
参考官网:(https://zh-hans.reactjs.org/docs/hooks-faq.html#are-hooks-slow-because-of-creating-functions-in-render)
参考作者github:(https://github.com/ryardley/hooks-perf-issues/pull/2)
性能主要取决于代码的作用,而不是选择函数式还是类组件。尽管优化策略有差别,但性能差异可以忽略不计。
参考官网:(https://zh-hans.reactjs.org/docs/hooks-faq.html#are-hooks-slow-because-of-creating-functions-in-render)
参考作者github:(https://github.com/ryardley/hooks-perf-issues/pull/2)
性能主要取决于代码的作用,而不是选择函数式还是类组件。尽管优化策略有差别,但性能差异可以忽略不计。参考官网:(https://zh-hans.reactjs.org/docs/hooks-faq.html#are-hooks-slow-because-of-creating-functions-in-render)https://zh-hans.reactjs.org/docs/hooks-faq.html#are-hooks-slow-because-of-creating-functions-in-render参考作者github:(https://github.com/ryardley/hooks-perf-issues/pull/2)https://github.com/ryardley/hooks-perf-issues/pull/2而下面会重点讲述:React的函数式组件和类组件之间根本的区别: 在心智模型上。简单的案例
简单的案例简单的案例函数式组件以来,它一直存在,但是经常被忽略:函数式组件捕获了渲染所用的值。(Function components capture the rendered values.)思考这个组件:
function ProfilePage(props) {
const showMessage = () => alert('你好 ' + props.user);
const handleClick = () => setTimeout(showMessage, 3000);
return
}
function ProfilePage(props) {
const showMessage = () => alert('你好 ' + props.user);
const handleClick = () => setTimeout(showMessage, 3000);
return
}
上述组件:如果 props.user是 Dan,它会在三秒后显示 你好 Dan。如果是类组件我们怎么写?一个简单的重构可能就象这样:
class ProfilePage extends React.Component {
showMessage = () => alert('Followed ' + this.props.user);
handleClick = () => setTimeout(this.showMessage, 3000);
render() {
return ;
}
}
class ProfilePage extends React.Component {
showMessage = () => alert('Followed ' + this.props.user);
handleClick = () => setTimeout(this.showMessage, 3000);
render() {
return ;
}
}
通常我们认为,这两个代码片段是等效的。人们经常在这两种模式中自由的重构代码,但是很少注意到它们的含义:我们通过 React 应用程序中的一个常见错误来说明其中的不同。我们通过 React 应用程序中的一个常见错误来说明其中的不同。我们添加一个父组件,用一个下拉框来更改传递给子组件(ProfilePage),的 props.user,实例地址:(https://codesandbox.io/s/pjqnl16lm7)https://codesandbox.io/s/pjqnl16lm7按步骤完成以下操作:
点击 其中某一个 Follow 按钮。
在3秒内 切换 选中的账号。
查看 弹出的文本。
点击 其中某一个 Follow 按钮。在3秒内 切换 选中的账号。查看 弹出的文本。这时会得到一个奇怪的结果:
当使用 函数式组件 实现的 ProfilePage, 当前账号是 Dan 时点击 Follow 按钮,然后立马切换当前账号到 Sophie,弹出的文本将依旧是 'Followed Dan'。
当使用 类组件 实现的 ProfilePage, 弹出的文本将是 'Followed Sophie':
当使用 函数式组件 实现的 ProfilePage, 当前账号是 Dan 时点击 Follow 按钮,然后立马切换当前账号到 Sophie,弹出的文本将依旧是 'Followed Dan'。当使用 类组件 实现的 ProfilePage, 弹出的文本将是 'Followed Sophie':在这个例子中,函数组件是正确的。 如果我关注一个人,然后导航到另一个人的账号,我的组件不应该混淆我关注了谁。 ,而类组件的实现很明显是错误的。案例解析
案例解析案例解析所以为什么我们的例子中类组件会有这样的表现? 让我们仔细看看类组件中的 showMessage 方法:
showMessage = () => {
alert('Followed ' + this.props.user);
};
showMessage = () => {
alert('Followed ' + this.props.user);
};这个类方法从 this.props.user 中读取数据。在 React 中 Props 是 不可变(immutable)的,所以他们永远不会改变。
而 this 是而且永远是 可变(mutable)的。**
这也是类组件 this 存在的意义:能在渲染方法以及生命周期方法中得到最新的实例。所以如果在请求已经发出的情况下我们的组件进行了重新渲染, this.props将会改变。 showMessage方法从一个"过于新"的 props中得到了 user。从 this 中读取数据的这种行为,调用一个回调函数读取 this.props 的 timeout 会让 showMessage 回调并没有与任何一个特定的渲染"绑定"在一起,所以它"失去"了正确的 props。。如何用类组件解决上述BUG?(假设函数式组件不存在)
如何用类组件解决上述BUG?(假设函数式组件不存在)如何用类组件解决上述BUG?(假设函数式组件不存在)我们想要以某种方式"修复"拥有正确 props 的渲染与读取这些 props 的 showMessage回调之间的联系。在某个地方 props被弄丢了。方法一:在调用事件之前读取 this.props,然后显式地传递到timeout回调函数中:
方法一:
class ProfilePage extends React.Component {
showMessage = (user) => alert('Followed ' + user);
handleClick = () => {
const {user} = this.props;
setTimeout(() => this.showMessage(user), 3000);
};
render() {
return